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);
}