Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java (revision 2c44516ab81e15f4bff3c514677cf25bd269d8ad) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java (revision ) @@ -272,10 +272,11 @@ */ 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 @@ dirty = true; } + private static short toShort(int value) { + return (short) value; + } + private int writeSegmentIdReference(SegmentId id) { if (id.equals(segment.getSegmentId())) { return 0; Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java (revision 2c44516ab81e15f4bff3c514677cf25bd269d8ad) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java (revision ) @@ -76,11 +76,11 @@ 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 @@ } private SegmentReferences readReferencedSegments() { + checkState(getReferencedSegmentIdCount() + 1 < 0xffff, + "Segment cannot have more than 0xffff references"); + List referencedSegments = newArrayListWithCapacity(getReferencedSegmentIdCount()); int position = data.position(); @@ -444,8 +447,12 @@ } 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) {