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/25 17:09:05 UTC
svn commit: r1449760 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment:
MemoryStore.java MongoStore.java Segment.java SegmentWriter.java
Author: jukka
Date: Mon Feb 25 16:09:05 2013
New Revision: 1449760
URL: http://svn.apache.org/r1449760
Log:
OAK-593: Segment-based MK
Use a LinkedHashMap instead of an array of UUIDs to speed up segment identifier lookups in SegmentWriter.prepare()
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MemoryStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MongoStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MemoryStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MemoryStore.java?rev=1449760&r1=1449759&r2=1449760&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MemoryStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MemoryStore.java Mon Feb 25 16:09:05 2013
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.oak.plugins.segment;
+import java.util.Collections;
import java.util.UUID;
import java.util.concurrent.ConcurrentMap;
@@ -80,7 +81,7 @@ public class MemoryStore implements Segm
UUID segmentId, byte[] data, int offset, int length) {
byte[] segment = new byte[length];
System.arraycopy(data, offset, segment, 0, length);
- createSegment(new Segment(this, segmentId, segment, new UUID[0]));
+ createSegment(new Segment(this, segmentId, segment, Collections.<UUID>emptySet()));
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MongoStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MongoStore.java?rev=1449760&r1=1449759&r2=1449760&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MongoStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/MongoStore.java Mon Feb 25 16:09:05 2013
@@ -117,9 +117,9 @@ public class MongoStore implements Segme
byte[] data = (byte[]) segment.get("data");
List<?> list = (List<?>) segment.get("uuids");
- UUID[] uuids = new UUID[list.size()];
- for (int i = 0; i < uuids.length; i++) {
- uuids[i] = UUID.fromString(list.get(i).toString());
+ List<UUID> uuids = Lists.newArrayListWithCapacity(list.size());
+ for (Object object : list) {
+ uuids.add(UUID.fromString(object.toString()));
}
return new Segment(this, segmentId, data, uuids);
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java?rev=1449760&r1=1449759&r2=1449760&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java Mon Feb 25 16:09:05 2013
@@ -22,6 +22,7 @@ import static com.google.common.base.Pre
import static org.apache.jackrabbit.oak.plugins.segment.SegmentWriter.BLOCK_SIZE;
import java.nio.ByteBuffer;
+import java.util.Collection;
import java.util.UUID;
import com.google.common.base.Charsets;
@@ -125,11 +126,11 @@ class Segment {
}
};
- Segment(SegmentStore store, UUID uuid, byte[] data, UUID[] uuids) {
+ Segment(SegmentStore store, UUID uuid, byte[] data, Collection<UUID> uuids) {
this.store = store;
this.uuid = uuid;
this.data = data;
- this.uuids = uuids;
+ this.uuids = uuids.toArray(new UUID[uuids.size()]);
}
public UUID getSegmentId() {
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=1449760&r1=1449759&r2=1449760&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 Mon Feb 25 16:09:05 2013
@@ -66,8 +66,12 @@ public class SegmentWriter {
private UUID uuid = UUID.randomUUID();
- private final List<UUID> uuids =
- Lists.newArrayListWithCapacity(Segment.SEGMENT_REFERENCE_LIMIT);
+ /**
+ * Insertion-ordered map from the UUIDs of referenced segments to the
+ * respective single-byte UUID index values used when serializing
+ * record identifiers.
+ */
+ private final Map<UUID, Byte> uuids = Maps.newLinkedHashMap();
/**
* The segment write buffer, filled from the end to the beginning
@@ -104,8 +108,7 @@ public class SegmentWriter {
System.arraycopy(buffer, start, data, 0, data.length);
}
- store.createSegment(new Segment(
- store, uuid, data, uuids.toArray(new UUID[uuids.size()])));
+ store.createSegment(new Segment(store, uuid, data, uuids.keySet()));
uuid = UUID.randomUUID();
length = 0;
@@ -123,7 +126,7 @@ public class SegmentWriter {
Set<UUID> segmentIds = new HashSet<UUID>();
for (RecordId id : checkNotNull(ids)) {
UUID segmentId = id.getSegmentId();
- if (!uuids.contains(segmentId)) {
+ if (!uuids.containsKey(segmentId)) {
segmentIds.add(segmentId);
}
}
@@ -147,18 +150,18 @@ public class SegmentWriter {
checkNotNull(id);
UUID segmentId = id.getSegmentId();
- int index = uuids.indexOf(segmentId);
- if (index == -1) {
- index = uuids.size();
- uuids.add(segmentId);
+ Byte segmentIndex = uuids.get(segmentId);
+ if (segmentIndex == null) {
+ checkState(uuids.size() < Segment.SEGMENT_REFERENCE_LIMIT);
+ segmentIndex = Byte.valueOf((byte) uuids.size());
+ uuids.put(segmentId, segmentIndex);
}
- int offset = id.getOffset();
- checkState(index < Segment.SEGMENT_REFERENCE_LIMIT);
+ int offset = id.getOffset();
checkState(0 <= offset && offset < buffer.length);
checkState((offset & (Segment.RECORD_ALIGN_BYTES - 1)) == 0);
- buffer[position++] = (byte) index;
+ buffer[position++] = segmentIndex.byteValue();
buffer[position++] = (byte) (offset >> (8 + Segment.RECORD_ALIGN_BITS));
buffer[position++] = (byte) (offset >> Segment.RECORD_ALIGN_BITS);
}