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 ju...@apache.org on 2013/02/22 09:37:11 UTC
svn commit: r1448937 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/segment/
test/java/org/apache/jackrabbit/oak/plugins/segment/
Author: jukka
Date: Fri Feb 22 08:37:10 2013
New Revision: 1448937
URL: http://svn.apache.org/r1448937
Log:
OAK-632: SegmentMK: Efficient updates of flat nodes
Use 32 instead of 64 buckets per HAMT level to reduce the size overhead of small updates.
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java?rev=1448937&r1=1448936&r2=1448937&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MapRecord.java Fri Feb 22 08:37:10 2013
@@ -31,7 +31,7 @@ class MapRecord extends Record {
public interface Entry extends Map.Entry<String, RecordId> {
}
- static final int LEVEL_BITS = 6;
+ static final int LEVEL_BITS = 5;
MapRecord(RecordId id) {
super(id);
@@ -82,12 +82,12 @@ class MapRecord extends Record {
}
return null;
} else {
- long bucketMap = reader.readLong(getRecordId(), 4);
+ int bucketMap = reader.readInt(getRecordId(), 4);
int bucketIndex = (code >> shift) & mask;
- long bucketBit = 1L << bucketIndex;
+ int bucketBit = 1 << bucketIndex;
if ((bucketMap & bucketBit) != 0) {
- bucketIndex = Long.bitCount(bucketMap & (bucketBit - 1));
- RecordId bucketId = reader.readRecordId(getRecordId(), 12 + bucketIndex * Segment.RECORD_ID_BYTES);
+ bucketIndex = Integer.bitCount(bucketMap & (bucketBit - 1));
+ RecordId bucketId = reader.readRecordId(getRecordId(), 8 + bucketIndex * Segment.RECORD_ID_BYTES);
return new MapRecord(bucketId).getEntry(reader, key, level + 1);
} else {
return null;
@@ -145,13 +145,13 @@ class MapRecord extends Record {
}
};
} else {
- long bucketMap = reader.readLong(getRecordId(), 4);
- int bucketCount = Long.bitCount(bucketMap);
+ int bucketMap = reader.readInt(getRecordId(), 4);
+ int bucketCount = Integer.bitCount(bucketMap);
List<Iterable<Entry>> iterables =
Lists.newArrayListWithCapacity(bucketCount);
for (int i = 0; i < bucketCount; i++) {
RecordId bucketId = reader.readRecordId(
- getRecordId(), 12 + i * Segment.RECORD_ID_BYTES);
+ getRecordId(), 8 + i * Segment.RECORD_ID_BYTES);
iterables.add(new MapRecord(bucketId).getEntries(reader, level + 1));
}
return Iterables.concat(iterables);
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java?rev=1448937&r1=1448936&r2=1448937&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java Fri Feb 22 08:37:10 2013
@@ -277,17 +277,17 @@ public class SegmentWriter {
buckets[bucketIndex].add(entry);
}
- long baseMap = reader.readLong(baseId, 4);
+ int baseMap = reader.readInt(baseId, 4);
int newSize = 0;
RecordId[] bucketIds = new RecordId[size];
for (int i = 0; i < buckets.length; i++) {
- long bucketBit = 1L << i;
+ int bucketBit = 1 << i;
RecordId baseBucketId = null;
if ((baseMap & bucketBit) != 0) {
- int index = Long.bitCount(baseMap & (bucketBit - 1));
+ int index = Integer.bitCount(baseMap & (bucketBit - 1));
baseBucketId = reader.readRecordId(
- baseId, 12 + index * Segment.RECORD_ID_BYTES);
+ baseId, 8 + index * Segment.RECORD_ID_BYTES);
}
if (buckets[i] != null) {
BucketInfo info = writeMapBucket(
@@ -303,17 +303,17 @@ public class SegmentWriter {
}
List<RecordId> ids = Lists.newArrayList();
- long bucketMap = 0L;
+ int bucketMap = 0;
for (int i = 0; i < buckets.length; i++) {
if (bucketIds[i] != null) {
ids.add(bucketIds[i]);
- bucketMap |= 1L << i;
+ bucketMap |= 1 << i;
}
}
RecordId bucketId = prepare(12, ids);
writeInt(newSize);
- writeLong(bucketMap);
+ writeInt(bucketMap);
for (RecordId id : ids) {
writeRecordId(id);
}
@@ -351,17 +351,17 @@ public class SegmentWriter {
}
List<RecordId> bucketIds = Lists.newArrayList();
- long bucketMap = 0L;
+ int bucketMap = 0;
for (int i = 0; i < buckets.length; i++) {
if (buckets[i] != null) {
bucketIds.add(writeMapBucket(null, buckets[i], level + 1).id);
- bucketMap |= 1L << i;
+ bucketMap |= 1 << i;
}
}
- RecordId bucketId = prepare(12, bucketIds);
+ RecordId bucketId = prepare(8, bucketIds);
writeInt(entries.size());
- writeLong(bucketMap);
+ writeInt(bucketMap);
for (RecordId id : bucketIds) {
writeRecordId(id);
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java?rev=1448937&r1=1448936&r2=1448937&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java Fri Feb 22 08:37:10 2013
@@ -156,14 +156,14 @@ public class SegmentSizeTest {
SegmentNodeState state = writer.writeNode(builder.getNodeState());
writer.flush();
Segment segment = store.readSegment(state.getRecordId().getSegmentId());
- assertEquals(26040, segment.getData().length);
+ assertEquals(28588, segment.getData().length);
builder = state.builder();
builder.child("child1000");
state = writer.writeNode(builder.getNodeState());
writer.flush();
segment = store.readSegment(state.getRecordId().getSegmentId());
- assertEquals(576, segment.getData().length);
+ assertEquals(260, segment.getData().length);
}
private int getSize(NodeBuilder builder) {