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;