Author: mduerig
Date: Wed Oct  5 09:28:13 2016
New Revision: 1763371

URL: http://svn.apache.org/viewvc?rev=1763371&view=rev
Log:
OAK-4844: Analyse effects of simplified record ids
serialise record ids as 2 + 4

Modified:
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java?rev=1763371&r1=1763370&r2=1763371&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
 Wed Oct  5 09:28:13 2016
@@ -76,11 +76,11 @@ public class Segment {
     static final int RECORD_SIZE = 9;
 
     /**
-     * Number of bytes used for storing a record identifier. One byte
-     * is used for identifying the segment and two for the record offset
+     * Number of bytes used for storing a record identifier. Two bytes
+     * are used for identifying the segment and four for the record offset
      * within that segment.
      */
-    static final int RECORD_ID_BYTES = 4 + 4;
+    static final int RECORD_ID_BYTES = 2 + 4;
 
     /**
      * The limit on segment references within one segment. Since record
@@ -245,6 +245,9 @@ public class Segment {
     }
 
     private SegmentReferences readReferencedSegments() {
+        checkState(getReferencedSegmentIdCount() + 1 < 0xffff,
+                "Segment cannot have more than 0xffff references");
+
         List<SegmentId> referencedSegments = 
newArrayListWithCapacity(getReferencedSegmentIdCount());
 
         int position = data.position();
@@ -444,8 +447,12 @@ public class Segment {
     }
 
     private RecordId internalReadRecordId(int pos) {
-        SegmentId segmentId = dereferenceSegmentId(data.getInt(pos));
-        return new RecordId(segmentId, data.getInt(pos + 4));
+        SegmentId segmentId = 
dereferenceSegmentId(asUnsigned(data.getShort(pos)));
+        return new RecordId(segmentId, data.getInt(pos + 2));
+    }
+
+    private static int asUnsigned(short value) {
+        return value & 0xffff;
     }
 
     private SegmentId dereferenceSegmentId(int reference) {

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java?rev=1763371&r1=1763370&r2=1763371&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
 Wed Oct  5 09:28:13 2016
@@ -272,10 +272,11 @@ public class SegmentBufferWriter impleme
      */
     public void writeRecordId(RecordId recordId, boolean reference) {
         checkNotNull(recordId);
-
+        checkState(segmentReferences.size() + 1 < 0xffff,
+                "Segment cannot have more than 0xffff references");
         checkGCGeneration(recordId.getSegmentId());
 
-        writeInt(writeSegmentIdReference(recordId.getSegmentId()));
+        writeShort(toShort(writeSegmentIdReference(recordId.getSegmentId())));
         writeInt(recordId.getRecordNumber());
 
         statistics.recordIdCount++;
@@ -283,6 +284,10 @@ public class SegmentBufferWriter impleme
         dirty = true;
     }
 
+    private static short toShort(int value) {
+        return (short) value;
+    }
+
     private int writeSegmentIdReference(SegmentId id) {
         if (id.equals(segment.getSegmentId())) {
             return 0;


Reply via email to