You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/03/05 16:28:41 UTC

svn commit: r1452849 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment: Segment.java SegmentReader.java SegmentStream.java

Author: jukka
Date: Tue Mar  5 15:28:41 2013
New Revision: 1452849

URL: http://svn.apache.org/r1452849
Log:
OAK-593: Segment-based MK

Move readStream() from SegmentReader to Segment

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentReader.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentStream.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java?rev=1452849&r1=1452848&r2=1452849&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java Tue Mar  5 15:28:41 2013
@@ -195,6 +195,10 @@ class Segment {
 
     RecordId readRecordId(int offset) {
         int pos = pos(offset, RECORD_ID_BYTES);
+        return internalReadRecordId(pos);
+    }
+
+    private RecordId internalReadRecordId(int pos) {
         return new RecordId(
                 uuids[data[pos] & 0xff],
                 (data[pos + 1] & 0xff) << (8 + Segment.RECORD_ALIGN_BITS)
@@ -231,10 +235,10 @@ class Segment {
             return new String(data, pos + 2, (int) length, Charsets.UTF_8);
         } else if (length < Integer.MAX_VALUE) {
             int size = (int) ((length + BLOCK_SIZE - 1) / BLOCK_SIZE);
-            ListRecord list = new ListRecord(readRecordId(offset + 8), size);
+            ListRecord list =
+                    new ListRecord(internalReadRecordId(pos + 8), size);
             SegmentStream stream = new SegmentStream(
-                    new SegmentReader(store), new RecordId(uuid, offset),
-                    list, length);
+                    store, new RecordId(uuid, offset), list, length);
             try {
                 return stream.getString();
             } finally {
@@ -337,4 +341,23 @@ class Segment {
         }
     }
 
+    SegmentStream readStream(int offset) {
+        RecordId id = new RecordId(uuid, offset);
+        int pos = pos(offset, 1);
+        long length = internalReadLength(pos);
+        if (length < Segment.MEDIUM_LIMIT) {
+            byte[] inline = new byte[(int) length];
+            if (length < Segment.SMALL_LIMIT) {
+                System.arraycopy(data, pos + 1, inline, 0, inline.length);
+            } else {
+                System.arraycopy(data, pos + 2, inline, 0, inline.length);
+            }
+            return new SegmentStream(id, inline);
+        } else {
+            int size = (int) ((length + BLOCK_SIZE - 1) / BLOCK_SIZE);
+            ListRecord list = new ListRecord(internalReadRecordId(pos + 8), size);
+            return new SegmentStream(store, id, list, length);
+        }
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentReader.java?rev=1452849&r1=1452848&r2=1452849&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentReader.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentReader.java Tue Mar  5 15:28:41 2013
@@ -19,7 +19,6 @@ package org.apache.jackrabbit.oak.plugin
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
-import static org.apache.jackrabbit.oak.plugins.segment.SegmentWriter.BLOCK_SIZE;
 
 public class SegmentReader {
 
@@ -41,23 +40,7 @@ public class SegmentReader {
 
     public SegmentStream readStream(RecordId recordId) {
         Segment segment = store.readSegment(recordId.getSegmentId());
-        int offset = recordId.getOffset();
-        long length = readLength(segment, offset);
-        if (length < Segment.MEDIUM_LIMIT) {
-            if (length < Segment.SMALL_LIMIT) {
-                offset += 1;
-            } else {
-                offset += 2;
-            }
-            byte[] data = new byte[(int) length];
-            segment.readBytes(offset, data, 0, data.length);
-            return new SegmentStream(recordId, data);
-        } else {
-            int size = (int) ((length + BLOCK_SIZE - 1) / BLOCK_SIZE);
-            ListRecord list =
-                    new ListRecord(segment.readRecordId(offset + 8), size);
-            return new SegmentStream(this, recordId, list, length);
-        }
+        return segment.readStream(recordId.getOffset());
     }
 
     public byte readByte(RecordId recordId, int position) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentStream.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentStream.java?rev=1452849&r1=1452848&r2=1452849&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentStream.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentStream.java Tue Mar  5 15:28:41 2013
@@ -43,7 +43,7 @@ public class SegmentStream extends Input
     }
 
 
-    private final SegmentReader reader;
+    private final SegmentStore store;
 
     private final RecordId recordId;
 
@@ -58,9 +58,9 @@ public class SegmentStream extends Input
     private long mark = 0;
 
     SegmentStream(
-            SegmentReader reader, RecordId recordId,
+            SegmentStore store, RecordId recordId,
             ListRecord blocks, long length) {
-        this.reader = checkNotNull(reader);
+        this.store = checkNotNull(store);
         this.recordId = checkNotNull(recordId);
         this.inline = null;
         this.blocks = checkNotNull(blocks);
@@ -69,7 +69,7 @@ public class SegmentStream extends Input
     }
 
     SegmentStream(RecordId recordId, byte[] inline) {
-        this.reader = null;
+        this.store = null;
         this.recordId = checkNotNull(recordId);
         this.inline = checkNotNull(inline);
         this.blocks = null;
@@ -87,7 +87,7 @@ public class SegmentStream extends Input
             throw new IllegalStateException("Too long value: " + length);
         } else {
             SegmentStream stream =
-                    new SegmentStream(reader, recordId, blocks, length);
+                    new SegmentStream(store, recordId, blocks, length);
             try {
                 byte[] data = new byte[(int) length];
                 ByteStreams.readFully(stream, data);
@@ -156,6 +156,7 @@ public class SegmentStream extends Input
                 len = (int) (length - position);
             }
 
+            SegmentReader reader = new SegmentReader(store);
             BlockRecord block = reader.readBlock(
                     blocks.getEntry(reader, blockIndex), BLOCK_SIZE);
             len = block.read(reader, blockOffset, b, off, len);