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 fr...@apache.org on 2016/10/03 16:17:04 UTC

svn commit: r1763184 - in /jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment: Segment.java SegmentBufferWriter.java

Author: frm
Date: Mon Oct  3 16:17:04 2016
New Revision: 1763184

URL: http://svn.apache.org/viewvc?rev=1763184&view=rev
Log:
OAK-2498 - Squeeze three bytes out of every record entry

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=1763184&r1=1763183&r2=1763184&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 Mon Oct  3 16:17:04 2016
@@ -65,6 +65,17 @@ public class Segment {
     static final int HEADER_SIZE = 32;
 
     /**
+     * Size of a line in the table of references to external segments.
+     */
+    static final int SEGMENT_REFERENCE_SIZE = 16;
+
+    /**
+     * Size of a line in the table mapping record numbers to their type and
+     * offset.
+     */
+    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
      * within that segment.
@@ -218,13 +229,13 @@ public class Segment {
         int position = data.position();
 
         position += HEADER_SIZE;
-        position += getReferencedSegmentIdCount() * 16;
+        position += getReferencedSegmentIdCount() * SEGMENT_REFERENCE_SIZE;
 
         for (int i = 0; i < getRecordNumberCount(); i++) {
             int recordNumber = data.getInt(position);
             position += 4;
-            int type = data.getInt(position);
-            position += 4;
+            int type = data.get(position);
+            position += 1;
             int offset = data.getInt(position);
             position += 4;
             recordNumberOffsets.put(recordNumber, new RecordEntry(RecordType.values()[type], offset));

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=1763184&r1=1763183&r2=1763184&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 Mon Oct  3 16:17:04 2016
@@ -30,6 +30,8 @@ import static java.lang.System.identityH
 import static org.apache.jackrabbit.oak.segment.Segment.GC_GENERATION_OFFSET;
 import static org.apache.jackrabbit.oak.segment.Segment.HEADER_SIZE;
 import static org.apache.jackrabbit.oak.segment.Segment.RECORD_ID_BYTES;
+import static org.apache.jackrabbit.oak.segment.Segment.RECORD_SIZE;
+import static org.apache.jackrabbit.oak.segment.Segment.SEGMENT_REFERENCE_SIZE;
 import static org.apache.jackrabbit.oak.segment.Segment.align;
 import static org.apache.jackrabbit.oak.segment.SegmentId.isDataSegmentId;
 import static org.apache.jackrabbit.oak.segment.SegmentVersion.LATEST_VERSION;
@@ -342,7 +344,7 @@ public class SegmentBufferWriter impleme
             int recordNumberCount = recordNumbers.size();
             BinaryUtils.writeInt(buffer, Segment.RECORD_NUMBER_COUNT_OFFSET, recordNumberCount);
 
-            int totalLength = align(HEADER_SIZE + referencedSegmentIdCount * 16 + recordNumberCount * 12 + length, 16);
+            int totalLength = align(HEADER_SIZE + referencedSegmentIdCount * SEGMENT_REFERENCE_SIZE + recordNumberCount * RECORD_SIZE + length, 16);
 
             if (totalLength > buffer.length) {
                 throw new IllegalStateException("too much data for a segment");
@@ -373,7 +375,7 @@ public class SegmentBufferWriter impleme
 
             for (Entry entry : recordNumbers) {
                 pos = BinaryUtils.writeInt(buffer, pos, entry.getRecordNumber());
-                pos = BinaryUtils.writeInt(buffer, pos, entry.getType().ordinal());
+                pos = BinaryUtils.writeByte(buffer, pos, (byte) entry.getType().ordinal());
                 pos = BinaryUtils.writeInt(buffer, pos, entry.getOffset());
             }
 
@@ -414,7 +416,7 @@ public class SegmentBufferWriter impleme
 
         int recordNumbersCount = recordNumbers.size() + 1;
         int referencedIdCount = segmentReferences.size() + ids.size();
-        int headerSize = HEADER_SIZE + referencedIdCount * 16 + recordNumbersCount * 12;
+        int headerSize = HEADER_SIZE + referencedIdCount * SEGMENT_REFERENCE_SIZE + recordNumbersCount * RECORD_SIZE;
         int segmentSize = align(headerSize + recordSize + length, 16);
 
         // If the size estimate looks too big, recompute it with a more
@@ -435,7 +437,7 @@ public class SegmentBufferWriter impleme
             // Adjust the estimation of the new referenced segment ID count.
             referencedIdCount =  segmentReferences.size() + segmentIds.size();
 
-            headerSize = HEADER_SIZE + referencedIdCount * 16 + recordNumbersCount * 12;
+            headerSize = HEADER_SIZE + referencedIdCount * SEGMENT_REFERENCE_SIZE + recordNumbersCount * RECORD_SIZE;
             segmentSize = align(headerSize + recordSize + length, 16);
         }