Author: mduerig
Date: Fri Nov 27 09:56:38 2015
New Revision: 1716816
URL: http://svn.apache.org/viewvc?rev=1716816&view=rev
Log:
OAK-1828: Improved SegmentWriter
Rename SegmentBuilder to SegmentBufferWriter
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
- copied, changed from r1716810,
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBuilder.java
Removed:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBuilder.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordWriters.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/SegmentIdFactoryTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordWriters.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordWriters.java?rev=1716816&r1=1716815&r2=1716816&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordWriters.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordWriters.java
Fri Nov 27 09:56:38 2015
@@ -62,13 +62,13 @@ final class RecordWriters {
this(type, size, Collections.<RecordId> emptyList());
}
- public final T write(SegmentBuilder builder) {
- RecordId id = builder.prepare(type, size, ids);
- return writeRecordContent(id, builder);
+ public final T write(SegmentBufferWriter writer) {
+ RecordId id = writer.prepare(type, size, ids);
+ return writeRecordContent(id, writer);
}
protected abstract T writeRecordContent(RecordId id,
- SegmentBuilder builder);
+ SegmentBufferWriter writer);
}
public static RecordWriter<MapRecord> newMapLeafWriter(int level,
Collection<MapEntry> entries) {
@@ -171,10 +171,10 @@ final class RecordWriters {
@Override
protected MapRecord writeRecordContent(RecordId id,
- SegmentBuilder builder) {
+ SegmentBufferWriter writer) {
if (entries != null) {
int size = entries.size();
- builder.writeInt((level << SIZE_BITS) | size);
+ writer.writeInt((level << SIZE_BITS) | size);
// copy the entries to an array so we can sort them before
// writing
@@ -182,14 +182,14 @@ final class RecordWriters {
sort(array);
for (MapEntry entry : array) {
- builder.writeInt(entry.getHash());
+ writer.writeInt(entry.getHash());
}
for (MapEntry entry : array) {
- builder.writeRecordId(entry.getKey());
- builder.writeRecordId(entry.getValue());
+ writer.writeRecordId(entry.getKey());
+ writer.writeRecordId(entry.getValue());
}
} else {
- builder.writeInt(0);
+ writer.writeInt(0);
}
return new MapRecord(id);
}
@@ -223,12 +223,12 @@ final class RecordWriters {
}
@Override
- protected MapRecord writeRecordContent(RecordId id, SegmentBuilder
builder) {
+ protected MapRecord writeRecordContent(RecordId id,
SegmentBufferWriter writer) {
// -1 to encode a map diff (if level == 0 and entryCount == -1)
- builder.writeInt((level << SIZE_BITS) | entryCount);
- builder.writeInt(bitmap);
+ writer.writeInt((level << SIZE_BITS) | entryCount);
+ writer.writeInt(bitmap);
for (RecordId mapId : ids) {
- builder.writeRecordId(mapId);
+ writer.writeRecordId(mapId);
}
return new MapRecord(id);
}
@@ -256,10 +256,10 @@ final class RecordWriters {
@Override
protected RecordId writeRecordContent(RecordId id,
- SegmentBuilder builder) {
- builder.writeInt(count);
+ SegmentBufferWriter writer) {
+ writer.writeInt(count);
if (lid != null) {
- builder.writeRecordId(lid);
+ writer.writeRecordId(lid);
}
return id;
}
@@ -278,9 +278,9 @@ final class RecordWriters {
@Override
protected RecordId writeRecordContent(RecordId id,
- SegmentBuilder builder) {
+ SegmentBufferWriter writer) {
for (RecordId bucketId : ids) {
- builder.writeRecordId(bucketId);
+ writer.writeRecordId(bucketId);
}
return id;
}
@@ -303,8 +303,8 @@ final class RecordWriters {
@Override
protected RecordId writeRecordContent(RecordId id,
- SegmentBuilder builder) {
- builder.writeBytes(bytes, offset, size);
+ SegmentBufferWriter writer) {
+ writer.writeBytes(bytes, offset, size);
return id;
}
}
@@ -326,9 +326,9 @@ final class RecordWriters {
@Override
protected RecordId writeRecordContent(RecordId id,
- SegmentBuilder builder) {
- builder.writeLong(len);
- builder.writeRecordId(rid);
+ SegmentBufferWriter writer) {
+ writer.writeLong(len);
+ writer.writeRecordId(rid);
return id;
}
}
@@ -364,13 +364,13 @@ final class RecordWriters {
}
@Override
- protected RecordId writeRecordContent(RecordId id, SegmentBuilder
builder) {
+ protected RecordId writeRecordContent(RecordId id, SegmentBufferWriter
writer) {
if (isSmallSize(length)) {
- builder.writeByte((byte) length);
+ writer.writeByte((byte) length);
} else {
- builder.writeShort((short) ((length - SMALL_LIMIT) | 0x8000));
+ writer.writeShort((short) ((length - SMALL_LIMIT) | 0x8000));
}
- builder.writeBytes(data, 0, length);
+ writer.writeBytes(data, 0, length);
return id;
}
}
@@ -393,13 +393,13 @@ final class RecordWriters {
@Override
protected RecordId writeRecordContent(RecordId id,
- SegmentBuilder builder) {
+ SegmentBufferWriter writer) {
// The length uses a fake "length" field that is always equal to
// 0xF0.
// This allows the code to take apart small from a large blob IDs.
- builder.writeByte((byte) 0xF0);
- builder.writeRecordId(stringRecord);
- builder.addBlobRef(id);
+ writer.writeByte((byte) 0xF0);
+ writer.writeRecordId(stringRecord);
+ writer.addBlobRef(id);
return id;
}
}
@@ -422,11 +422,11 @@ final class RecordWriters {
@Override
protected RecordId writeRecordContent(RecordId id,
- SegmentBuilder builder) {
+ SegmentBufferWriter writer) {
int length = blobId.length;
- builder.writeShort((short) (length | 0xE000));
- builder.writeBytes(blobId, 0, length);
- builder.addBlobRef(id);
+ writer.writeShort((short) (length | 0xE000));
+ writer.writeBytes(blobId, 0, length);
+ writer.addBlobRef(id);
return id;
}
}
@@ -461,30 +461,30 @@ final class RecordWriters {
@Override
protected RecordId writeRecordContent(RecordId id,
- SegmentBuilder builder) {
- builder.writeInt(head);
+ SegmentBufferWriter writer) {
+ writer.writeInt(head);
if (primaryId != null) {
- builder.writeRecordId(primaryId);
+ writer.writeRecordId(primaryId);
}
if (mixinIds != null) {
for (RecordId mixinId : mixinIds) {
- builder.writeRecordId(mixinId);
+ writer.writeRecordId(mixinId);
}
}
if (childNameId != null) {
- builder.writeRecordId(childNameId);
+ writer.writeRecordId(childNameId);
}
if (version.onOrAfter(V_11)) {
if (propNamesId != null) {
- builder.writeRecordId(propNamesId);
+ writer.writeRecordId(propNamesId);
}
}
for (int i = 0; i < propertyNames.length; i++) {
if (!version.onOrAfter(V_11)) {
// V10 only
- builder.writeRecordId(propertyNames[i]);
+ writer.writeRecordId(propertyNames[i]);
}
- builder.writeByte(propertyTypes[i]);
+ writer.writeByte(propertyTypes[i]);
}
return id;
}
@@ -501,9 +501,9 @@ final class RecordWriters {
@Override
protected SegmentNodeState writeRecordContent(RecordId id,
- SegmentBuilder builder) {
+ SegmentBufferWriter writer) {
for (RecordId recordId : ids) {
- builder.writeRecordId(recordId);
+ writer.writeRecordId(recordId);
}
return new SegmentNodeState(id);
}
Copied:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
(from r1716810,
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBuilder.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBuilder.java&r1=1716810&r2=1716816&rev=1716816&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBuilder.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
Fri Nov 27 09:56:38 2015
@@ -53,17 +53,15 @@ import org.slf4j.LoggerFactory;
* <p>
* The common usage pattern is:
* <pre>
- * SegmentBuilder builder = ...
- * builder.prepare(...) // allocate buffer
- * builder.writeXYZ(...)
+ * SegmentBufferWriter writer = ...
+ * writer.prepare(...) // allocate buffer
+ * writer.writeXYZ(...)
* </pre>
* The behaviour of this class is undefined should the pre-allocated buffer be
* overrun be calling any of the write methods.
- *
- * TODO find a better name for SegmentBuilder
*/
-class SegmentBuilder {
- private static final Logger LOG =
LoggerFactory.getLogger(SegmentBuilder.class);
+class SegmentBufferWriter {
+ private static final Logger LOG =
LoggerFactory.getLogger(SegmentBufferWriter.class);
/**
* The set of root records (i.e. ones not referenced by other records)
@@ -110,7 +108,7 @@ class SegmentBuilder {
*/
private int position;
- public SegmentBuilder(SegmentStore store, SegmentVersion version, String
wid) {
+ public SegmentBufferWriter(SegmentStore store, SegmentVersion version,
String wid) {
this.store = store;
this.version = version;
this.wid = (wid == null
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=1716816&r1=1716815&r2=1716816&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 Nov 27 09:56:38 2015
@@ -88,7 +88,7 @@ public class SegmentWriter {
static final int BLOCK_SIZE = 1 << 12; // 4kB
- private final SegmentBuilderPool segmentBuilderPool = new
SegmentBuilderPool();
+ private final SegmentBufferWriterPool segmentBufferWriterPool = new
SegmentBufferWriterPool();
/**
* Cache of recently stored string and template records, used to
@@ -139,7 +139,7 @@ public class SegmentWriter {
}
public void flush() {
- segmentBuilderPool.flush();
+ segmentBufferWriterPool.flush();
}
public void dropCache() {
@@ -776,51 +776,51 @@ public class SegmentWriter {
}
private <T> T writeRecord(RecordWriter<T> recordWriter) {
- SegmentBuilder builder =
segmentBuilderPool.borrowBuilder(currentThread());
+ SegmentBufferWriter writer =
segmentBufferWriterPool.borrowWriter(currentThread());
try {
- return recordWriter.write(builder);
+ return recordWriter.write(writer);
} finally {
- segmentBuilderPool.returnBuilder(currentThread(), builder);
+ segmentBufferWriterPool.returnWriter(currentThread(), writer);
}
}
- private class SegmentBuilderPool {
- private final Set<SegmentBuilder> borrowed = newHashSet();
- private final Map<Object, SegmentBuilder> builders = newHashMap();
+ private class SegmentBufferWriterPool {
+ private final Set<SegmentBufferWriter> borrowed = newHashSet();
+ private final Map<Object, SegmentBufferWriter> writers = newHashMap();
public void flush() {
- List<SegmentBuilder> toFlush = newArrayList();
+ List<SegmentBufferWriter> toFlush = newArrayList();
synchronized (this) {
- toFlush.addAll(builders.values());
- builders.clear();
+ toFlush.addAll(writers.values());
+ writers.clear();
borrowed.clear();
}
// Call flush from outside a synchronized context to avoid
// deadlocks of that method calling SegmentStore.writeSegment
- for (SegmentBuilder builder : toFlush) {
- builder.flush();
+ for (SegmentBufferWriter writer : toFlush) {
+ writer.flush();
}
}
- public synchronized SegmentBuilder borrowBuilder(Object key) {
- SegmentBuilder builder = builders.remove(key);
- if (builder == null) {
- builder = new SegmentBuilder(store, version, wid + "." +
(key.hashCode() & 0xffff));
+ public synchronized SegmentBufferWriter borrowWriter(Object key) {
+ SegmentBufferWriter writer = writers.remove(key);
+ if (writer == null) {
+ writer = new SegmentBufferWriter(store, version, wid + "." +
(key.hashCode() & 0xffff));
}
- borrowed.add(builder);
- return builder;
+ borrowed.add(writer);
+ return writer;
}
- public void returnBuilder(Object key, SegmentBuilder builder) {
- if (!tryReturn(key, builder)) {
- // Delayed flush this builder as it was borrowed while flush()
was called.
- builder.flush();
+ public void returnWriter(Object key, SegmentBufferWriter writer) {
+ if (!tryReturn(key, writer)) {
+ // Delayed flush this writer as it was borrowed while flush()
was called.
+ writer.flush();
}
}
- private synchronized boolean tryReturn(Object key, SegmentBuilder
builder) {
- if (borrowed.remove(builder)) {
- builders.put(key, builder);
+ private synchronized boolean tryReturn(Object key, SegmentBufferWriter
writer) {
+ if (borrowed.remove(writer)) {
+ writers.put(key, writer);
return true;
} else {
return false;
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java?rev=1716816&r1=1716815&r2=1716816&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
Fri Nov 27 09:56:38 2015
@@ -90,7 +90,7 @@ public class SegmentIdFactoryTest {
@Test(expected = IllegalStateException.class)
public void dataAIOOBE() {
SegmentId id = factory.newDataSegmentId();
- byte[] buffer = SegmentBuilder.createNewBuffer(SegmentVersion.V_11);
+ byte[] buffer =
SegmentBufferWriter.createNewBuffer(SegmentVersion.V_11);
ByteBuffer data = ByteBuffer.allocate(Segment.MAX_SEGMENT_SIZE);
data.put(buffer);
data.rewind();