Author: frm
Date: Thu Jun 22 15:14:00 2017
New Revision: 1799590

URL: http://svn.apache.org/viewvc?rev=1799590&view=rev
Log:
OAK-6378 - Move the SegmentWriter API to its own interface

Added:
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
      - copied, changed from r1799589, 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
   (with props)
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ExternalBlobReferenceTest.java
      - copied, changed from r1799589, 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/ExternalBlobReferenceTest.java
Removed:
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/ExternalBlobReferenceTest.java
Modified:
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Compactor.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java
    
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/SegmentBlob.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeBuilder.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentParser.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentStream.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriteOperationHandler.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStoreRevisions.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BigInlinedBinaryIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompareAgainstBaseStateTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/MapRecordTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentGraphTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentReferencesTest.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyReferenceReaderTest.java

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java
 Thu Jun 22 15:14:00 2017
@@ -30,11 +30,11 @@ import com.google.common.base.Stopwatch;
 import com.google.common.base.Suppliers;
 import org.apache.jackrabbit.oak.backup.FileStoreBackup;
 import org.apache.jackrabbit.oak.segment.Compactor;
+import org.apache.jackrabbit.oak.segment.DefaultSegmentWriter;
 import org.apache.jackrabbit.oak.segment.Revisions;
 import org.apache.jackrabbit.oak.segment.SegmentBufferWriter;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.segment.SegmentReader;
-import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.segment.WriterCacheManager;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
@@ -73,7 +73,7 @@ public class FileStoreBackupImpl impleme
                     "b",
                     gen
             );
-            SegmentWriter writer = new SegmentWriter(
+            DefaultSegmentWriter writer = new DefaultSegmentWriter(
                     backup,
                     backup.getReader(),
                     backup.getSegmentIdProvider(),

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java
 Thu Jun 22 15:14:00 2017
@@ -29,9 +29,9 @@ import com.google.common.base.Stopwatch;
 import com.google.common.base.Suppliers;
 import org.apache.jackrabbit.oak.backup.FileStoreRestore;
 import org.apache.jackrabbit.oak.segment.Compactor;
+import org.apache.jackrabbit.oak.segment.DefaultSegmentWriter;
 import org.apache.jackrabbit.oak.segment.SegmentBufferWriter;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
-import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.segment.WriterCacheManager;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
@@ -67,7 +67,7 @@ public class FileStoreRestoreImpl implem
                     "r",
                     gen
             );
-            SegmentWriter writer = new SegmentWriter(
+            DefaultSegmentWriter writer = new DefaultSegmentWriter(
                     store,
                     store.getReader(),
                     store.getSegmentIdProvider(),

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java
 Thu Jun 22 15:14:00 2017
@@ -40,7 +40,7 @@ public class CachingSegmentReader implem
     public static final int DEFAULT_TEMPLATE_CACHE_MB = 64;
 
     @Nonnull
-    private final Supplier<SegmentWriter> writer;
+    private final Supplier<DefaultSegmentWriter> writer;
 
     @CheckForNull
     private final BlobStore blobStore;
@@ -68,7 +68,7 @@ public class CachingSegmentReader implem
      * @param templateCacheMB the size of the template cache in MBs or {@code 
0} for no cache.
      */
     public CachingSegmentReader(
-            @Nonnull Supplier<SegmentWriter> writer,
+            @Nonnull Supplier<DefaultSegmentWriter> writer,
             @Nullable BlobStore blobStore,
             long stringCacheMB,
             long templateCacheMB) {
@@ -123,7 +123,7 @@ public class CachingSegmentReader implem
     @Nonnull
     @Override
     public SegmentNodeState readNode(@Nonnull RecordId id) {
-        return new SegmentNodeState(this, writer, id);
+        return new SegmentNodeState(this, writer, blobStore, id);
     }
 
     @Nonnull

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Compactor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Compactor.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Compactor.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Compactor.java
 Thu Jun 22 15:14:00 2017
@@ -69,7 +69,7 @@ public class Compactor {
 
     private final BlobStore blobStore;
 
-    private final SegmentWriter writer;
+    private final DefaultSegmentWriter writer;
 
     private final ProgressTracker progress = new ProgressTracker();
 
@@ -132,7 +132,7 @@ public class Compactor {
     private final PriorityCache<RecordId, RecordId> nodeCache =
             new PriorityCache<>((int) nextPowerOfTwo(cacheSize/10*9));
 
-    public Compactor(SegmentReader reader, SegmentWriter writer,
+    public Compactor(SegmentReader reader, DefaultSegmentWriter writer,
             BlobStore blobStore, Supplier<Boolean> cancel, SegmentGCOptions 
gc) {
         this.reader = reader;
         this.writer = writer;
@@ -144,8 +144,8 @@ public class Compactor {
 
     private SegmentNodeBuilder process(NodeState before, NodeState after,
             NodeState onto) throws IOException {
-        SegmentNodeBuilder builder = new SegmentNodeBuilder(
-                writer.writeNode(onto), writer);
+        SegmentNodeState node = new SegmentNodeState(reader, writer, 
blobStore, writer.writeNode(onto));
+        SegmentNodeBuilder builder = new SegmentNodeBuilder(node, blobStore, 
reader, writer);
         new CompactDiff(builder).diff(before, after);
         return builder;
     }
@@ -238,8 +238,7 @@ public class Compactor {
                 id = ((SegmentNodeState) after).getRecordId();
                 RecordId compactedId = nodeCache.get(id, 0);
                 if (compactedId != null) {
-                    builder.setChildNode(name, new SegmentNodeState(reader,
-                            writer, compactedId));
+                    builder.setChildNode(name, new SegmentNodeState(reader, 
writer, blobStore, compactedId));
                     return true;
                 }
             }
@@ -250,12 +249,12 @@ public class Compactor {
                 if (eagerFlush) {
                     child = builder.setChildNode(name);
                 } else {
-                    child = writer.writeNode(EMPTY_NODE).builder();
+                    child = new SegmentNodeState(reader, writer, blobStore, 
writer.writeNode(EMPTY_NODE)).builder();
                 }
                 boolean success = new CompactDiff(child, path, name).diff(
                         EMPTY_NODE, after);
                 if (success) {
-                    SegmentNodeState state = 
writer.writeNode(child.getNodeState());
+                    SegmentNodeState state = new SegmentNodeState(reader, 
writer, blobStore, writer.writeNode(child.getNodeState()));
                     builder.setChildNode(name, state);
                     if (id != null) {
                         nodeCache.put(id, state.getRecordId(), 0, cost(state));
@@ -280,8 +279,7 @@ public class Compactor {
                 id = ((SegmentNodeState) after).getRecordId();
                 RecordId compactedId = nodeCache.get(id, 0);
                 if (compactedId != null) {
-                    builder.setChildNode(name, new SegmentNodeState(reader,
-                            writer, compactedId));
+                    builder.setChildNode(name, new SegmentNodeState(reader, 
writer, blobStore, compactedId));
                     return true;
                 }
             }
@@ -296,7 +294,7 @@ public class Compactor {
                 boolean success = new CompactDiff(child, path, name).diff(
                         before, after);
                 if (success) {
-                    SegmentNodeState state = 
writer.writeNode(child.getNodeState());
+                    SegmentNodeState state = new SegmentNodeState(reader, 
writer, blobStore, writer.writeNode(child.getNodeState()));
                     if (id != null) {
                         nodeCache.put(id, state.getRecordId(), 0, cost(state));
                     }
@@ -365,11 +363,11 @@ public class Compactor {
 
                 // if the blob is external, just clone it
                 if (sb.isExternal()) {
-                    return writer.writeBlob(sb);
+                    return new SegmentBlob(blobStore, writer.writeBlob(sb));
                 }
                 // if the blob is inlined, just clone it
                 if (sb.length() < Segment.MEDIUM_LIMIT) {
-                    SegmentBlob clone = writer.writeBlob(blob);
+                    SegmentBlob clone = new SegmentBlob(blobStore, 
writer.writeBlob(blob));
                     blobCache.put(id, clone.getRecordId(), 0, cost(clone));
                     return clone;
                 }
@@ -394,7 +392,7 @@ public class Compactor {
                 }
 
                 // if not, clone the large blob and keep track of the result
-                sb = writer.writeBlob(blob);
+                sb = new SegmentBlob(blobStore, writer.writeBlob(blob));
                 blobCache.put(id, sb.getRecordId(), 0, cost(sb));
 
                 if (dedup) {
@@ -419,7 +417,7 @@ public class Compactor {
     private static String getBlobKey(Blob blob) throws IOException {
         InputStream stream = blob.getNewStream();
         try {
-            byte[] buffer = new byte[SegmentWriter.BLOCK_SIZE];
+            byte[] buffer = new byte[DefaultSegmentWriter.BLOCK_SIZE];
             int n = IOUtils.readFully(stream, buffer, 0, buffer.length);
             return blob.length() + ":" + Hashing.sha1().hashBytes(buffer, 0, 
n);
         } finally {

Copied: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
 (from r1799589, 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java)
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java&r1=1799589&r2=1799590&rev=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
 Thu Jun 22 15:14:00 2017
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.jackrabbit.oak.segment;
 
 import static com.google.common.base.Charsets.UTF_8;
@@ -79,13 +80,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * A {@code SegmentWriter} converts nodes, properties, values, etc. to records 
and
- * persists them with the help of a {@link WriteOperationHandler}.
- * All public methods of this class are thread safe if and only if the
- * {@link WriteOperationHandler} passed to the constructor is thread safe.
+ * A {@code SegmentWriter} converts nodes, properties, values, etc. to records
+ * and persists them with the help of a {@link WriteOperationHandler}. All
+ * public methods of this class are thread safe if and only if the {@link
+ * WriteOperationHandler} passed to the constructor is thread safe.
  */
-public class SegmentWriter {
-    private static final Logger LOG = 
LoggerFactory.getLogger(SegmentWriter.class);
+public class DefaultSegmentWriter implements SegmentWriter {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(org.apache.jackrabbit.oak.segment.DefaultSegmentWriter.class);
 
     static final int BLOCK_SIZE = 1 << 12; // 4kB
 
@@ -111,17 +113,19 @@ public class SegmentWriter {
     private GCNodeWriteMonitor compactionMonitor = GCNodeWriteMonitor.EMPTY;
 
     /**
-     * Create a new instance of a {@code SegmentWriter}. Note the thread 
safety properties
-     * pointed out in the class comment.
+     * Create a new instance of a {@code SegmentWriter}. Note the thread safety
+     * properties pointed out in the class comment.
      *
-     * @param store      store to write to
-     * @param reader     segment reader for the {@code store}
-     * @param idProvider segment id provider for the {@code store}
-     * @param blobStore  the blog store or {@code null} for inlined blobs
-     * @param cacheManager  cache manager instance for the de-duplication 
caches used by this writer
-     * @param writeOperationHandler  handler for write operations.
+     * @param store                 store to write to
+     * @param reader                segment reader for the {@code store}
+     * @param idProvider            segment id provider for the {@code store}
+     * @param blobStore             the blog store or {@code null} for inlined
+     *                              blobs
+     * @param cacheManager          cache manager instance for the
+     *                              de-duplication caches used by this writer
+     * @param writeOperationHandler handler for write operations.
      */
-    public SegmentWriter(
+    public DefaultSegmentWriter(
             @Nonnull SegmentStore store,
             @Nonnull SegmentReader reader,
             @Nonnull SegmentIdProvider idProvider,
@@ -137,41 +141,32 @@ public class SegmentWriter {
         this.writeOperationHandler = checkNotNull(writeOperationHandler);
     }
 
+    @Override
     public void flush() throws IOException {
         writeOperationHandler.flush(store);
     }
 
-    /**
-     * Write a map record.
-     * @param base      base map relative to which the {@code changes} are 
applied ot
-     *                  {@code null} for the empty map.
-     * @param changes   the changed mapping to apply to the {@code base} map.
-     * @return          the map record written
-     * @throws IOException
-     */
+    @Override
     @Nonnull
-    public MapRecord writeMap(@Nullable final MapRecord base,
-                              @Nonnull final Map<String, RecordId> changes)
-    throws IOException {
-        RecordId mapId = writeOperationHandler.execute(new 
SegmentWriteOperation() {
+    public RecordId writeMap(@Nullable final MapRecord base,
+            @Nonnull final Map<String, RecordId> changes
+    )
+            throws IOException {
+        return writeOperationHandler.execute(new SegmentWriteOperation() {
+
             @Nonnull
             @Override
             public RecordId execute(@Nonnull SegmentBufferWriter writer) 
throws IOException {
                 return with(writer).writeMap(base, changes);
             }
         });
-        return new MapRecord(reader, mapId);
     }
 
-    /**
-     * Write a list record.
-     * @param list  the list to write.
-     * @return      the record id of the list written
-     * @throws IOException
-     */
+    @Override
     @Nonnull
     public RecordId writeList(@Nonnull final List<RecordId> list) throws 
IOException {
         return writeOperationHandler.execute(new SegmentWriteOperation() {
+
             @Nonnull
             @Override
             public RecordId execute(@Nonnull SegmentBufferWriter writer) 
throws IOException {
@@ -180,15 +175,11 @@ public class SegmentWriter {
         });
     }
 
-    /**
-     * Write a string record.
-     * @param string  the string to write.
-     * @return         the record id of the string written.
-     * @throws IOException
-     */
+    @Override
     @Nonnull
     public RecordId writeString(@Nonnull final String string) throws 
IOException {
         return writeOperationHandler.execute(new SegmentWriteOperation() {
+
             @Nonnull
             @Override
             public RecordId execute(@Nonnull SegmentBufferWriter writer) 
throws IOException {
@@ -197,36 +188,25 @@ public class SegmentWriter {
         });
     }
 
-    /**
-     * Write a blob (as list of block records)
-     * @param blob  blob to write
-     * @return      The segment blob written
-     * @throws IOException
-     */
+    @Override
     @Nonnull
-    public SegmentBlob writeBlob(@Nonnull final Blob blob) throws IOException {
-        RecordId blobId = writeOperationHandler.execute(new 
SegmentWriteOperation() {
+    public RecordId writeBlob(@Nonnull final Blob blob) throws IOException {
+        return writeOperationHandler.execute(new SegmentWriteOperation() {
+
             @Nonnull
             @Override
             public RecordId execute(@Nonnull SegmentBufferWriter writer) 
throws IOException {
                 return with(writer).writeBlob(blob);
             }
         });
-        return new SegmentBlob(blobStore, blobId);
     }
 
-    /**
-     * Writes a block record containing the given block of bytes.
-     *
-     * @param bytes source buffer
-     * @param offset offset within the source buffer
-     * @param length number of bytes to write
-     * @return block record identifier
-     */
+    @Override
     @Nonnull
     public RecordId writeBlock(@Nonnull final byte[] bytes, final int offset, 
final int length)
-    throws IOException {
+            throws IOException {
         return writeOperationHandler.execute(new SegmentWriteOperation() {
+
             @Nonnull
             @Override
             public RecordId execute(@Nonnull SegmentBufferWriter writer) 
throws IOException {
@@ -235,96 +215,58 @@ public class SegmentWriter {
         });
     }
 
-    /**
-     * Writes a stream value record. The given stream is consumed <em>and 
closed</em> by
-     * this method.
-     *
-     * @param stream stream to be written
-     * @return blob for the passed {@code stream}
-     * @throws IOException if the input stream could not be read or the output 
could not be written
-     */
+    @Override
     @Nonnull
-    public SegmentBlob writeStream(@Nonnull final InputStream stream) throws 
IOException {
-        RecordId blobId = writeOperationHandler.execute(new 
SegmentWriteOperation() {
+    public RecordId writeStream(@Nonnull final InputStream stream) throws 
IOException {
+        return writeOperationHandler.execute(new SegmentWriteOperation() {
+
             @Nonnull
             @Override
             public RecordId execute(@Nonnull SegmentBufferWriter writer) 
throws IOException {
                 return with(writer).writeStream(stream);
             }
         });
-        return new SegmentBlob(blobStore, blobId);
     }
 
-    /**
-     * Write a property.
-     * @param state  the property to write
-     * @return       the property state written
-     * @throws IOException
-     */
+    @Override
     @Nonnull
-    public SegmentPropertyState writeProperty(@Nonnull final PropertyState 
state)
-    throws IOException {
-        RecordId id = writeOperationHandler.execute(new 
SegmentWriteOperation() {
+    public RecordId writeProperty(@Nonnull final PropertyState state) throws 
IOException {
+        return writeOperationHandler.execute(new SegmentWriteOperation() {
+
             @Nonnull
             @Override
             public RecordId execute(@Nonnull SegmentBufferWriter writer) 
throws IOException {
                 return with(writer).writeProperty(state);
             }
         });
-        return new SegmentPropertyState(reader, id, state.getName(), 
state.getType());
     }
 
-    /**
-     * Write a node state.
-     * <p>
-     * <em>Note:</em> the returned {@code SegmentNodeState} instance is bound 
to this
-     * {@code SegmentWriter} instance. That is, future calls to {@code 
#builder()}
-     * return a {@code NodeBuilder} that is also bound to the same {@code 
SegmentWriter}
-     * instance and uses it for writing any changes. This might not always be 
desired
-     * and callers of this method need to take care not to proliferate this 
writer
-     * through the returned node states beyond the intended bounds.
-     * @param state node state to write
-     * @return segment node state equal to {@code state}
-     * @throws IOException
-     */
+    @Override
     @Nonnull
-    public SegmentNodeState writeNode(@Nonnull final NodeState state) throws 
IOException {
-        RecordId nodeId = writeOperationHandler.execute(new 
SegmentWriteOperation() {
+    public RecordId writeNode(@Nonnull final NodeState state) throws 
IOException {
+        return writeOperationHandler.execute(new SegmentWriteOperation() {
+
             @Nonnull
             @Override
             public RecordId execute(@Nonnull SegmentBufferWriter writer) 
throws IOException {
                 return with(writer).writeNode(state);
             }
         });
-        return new SegmentNodeState(reader, this, nodeId);
     }
 
-    /**
-     * Write a node state, unless cancelled.
-     * <p>
-     * <em>Note:</em> the returned {@code SegmentNodeState} instance is bound 
to this
-     * {@code SegmentWriter} instance. That is, future calls to {@code 
#builder()}
-     * return a {@code NodeBuilder} that is also bound to the same {@code 
SegmentWriter}
-     * instance and uses it for writing any changes. This might not always be 
desired
-     * and callers of this method need to take care not to proliferate this 
writer
-     * through the returned node states beyond the intended bounds.
-     * @param state   node state to write
-     * @param cancel  supplier to signal cancellation of this write operation
-     * @return segment node state equal to {@code state} or {@code null} if 
cancelled.
-     * @throws IOException
-     */
+    @Override
     @CheckForNull
-    public SegmentNodeState writeNode(@Nonnull final NodeState state, @Nonnull 
Supplier<Boolean> cancel)
-    throws IOException {
+    public RecordId writeNode(@Nonnull final NodeState state, @Nonnull 
Supplier<Boolean> cancel)
+            throws IOException {
         try {
-            RecordId nodeId = writeOperationHandler.execute(new 
SegmentWriteOperation(cancel) {
+            return writeOperationHandler.execute(new 
SegmentWriteOperation(cancel) {
+
                 @Nonnull
                 @Override
                 public RecordId execute(@Nonnull SegmentBufferWriter writer) 
throws IOException {
                     return with(writer, true).writeNode(state);
                 }
             });
-            return new SegmentNodeState(reader, this, nodeId);
         } catch (SegmentWriteOperation.CancelledWriteException ignore) {
             return null;
         }
@@ -339,10 +281,11 @@ public class SegmentWriter {
     private abstract class SegmentWriteOperation implements WriteOperation {
 
         /**
-         * This exception is used internally to signal cancellation of a 
(recursive)
-         * write node operation.
+         * This exception is used internally to signal cancellation of a
+         * (recursive) write node operation.
          */
         private class CancelledWriteException extends IOException {
+
             public CancelledWriteException() {
                 super("Cancelled write operation");
             }
@@ -352,8 +295,11 @@ public class SegmentWriter {
         private final Supplier<Boolean> cancel;
 
         private SegmentBufferWriter writer;
+
         private Cache<String, RecordId> stringCache;
+
         private Cache<Template, RecordId> templateCache;
+
         private Cache<String, RecordId> nodeCache;
 
         protected SegmentWriteOperation(@Nonnull Supplier<Boolean> cancel) {
@@ -385,8 +331,9 @@ public class SegmentWriter {
         }
 
         private RecordId writeMap(@Nullable MapRecord base,
-                                  @Nonnull Map<String, RecordId> changes)
-        throws IOException {
+                @Nonnull Map<String, RecordId> changes
+        )
+                throws IOException {
             if (base != null && base.isDiff()) {
                 Segment segment = base.getSegment();
                 RecordId key = segment.readRecordId(base.getRecordNumber(), 8);
@@ -399,7 +346,7 @@ public class SegmentWriter {
 
             if (base != null && changes.size() == 1) {
                 Map.Entry<String, RecordId> change =
-                    changes.entrySet().iterator().next();
+                        changes.entrySet().iterator().next();
                 RecordId value = change.getValue();
                 if (value != null) {
                     MapEntry entry = base.getEntry(change.getKey());
@@ -408,7 +355,7 @@ public class SegmentWriter {
                             return base.getRecordId();
                         } else {
                             return 
RecordWriters.newMapBranchWriter(entry.getHash(), asList(entry.getKey(),
-                                value, base.getRecordId())).write(writer, 
store);
+                                    value, base.getRecordId())).write(writer, 
store);
                         }
                     }
                 }
@@ -474,7 +421,7 @@ public class SegmentWriter {
             if (base == null) {
                 // use leaf records for small maps or the last map level
                 if (entries.size() <= BUCKETS_PER_LEVEL
-                    || level == MapRecord.MAX_NUMBER_OF_LEVELS) {
+                        || level == MapRecord.MAX_NUMBER_OF_LEVELS) {
                     return writeMapLeaf(level, entries);
                 }
 
@@ -559,7 +506,7 @@ public class SegmentWriter {
             while (thisLevel.size() > 1) {
                 List<RecordId> nextLevel = newArrayList();
                 for (List<RecordId> bucket :
-                    partition(thisLevel, ListRecord.LEVEL_SIZE)) {
+                        partition(thisLevel, ListRecord.LEVEL_SIZE)) {
                     if (bucket.size() > 1) {
                         nextLevel.add(writeListBucket(bucket));
                     } else {
@@ -581,7 +528,7 @@ public class SegmentWriter {
             int shift = 32 - (level + 1) * MapRecord.BITS_PER_LEVEL;
 
             List<List<MapEntry>> buckets =
-                newArrayList(nCopies(MapRecord.BUCKETS_PER_LEVEL, 
(List<MapEntry>) null));
+                    newArrayList(nCopies(MapRecord.BUCKETS_PER_LEVEL, 
(List<MapEntry>) null));
             for (MapEntry entry : entries) {
                 int index = (entry.getHash() >> shift) & mask;
                 List<MapEntry> bucket = buckets.get(index);
@@ -627,7 +574,7 @@ public class SegmentWriter {
 
             int pos = 0;
             List<RecordId> blockIds = newArrayListWithExpectedSize(
-                data.length / BLOCK_SIZE + 1);
+                    data.length / BLOCK_SIZE + 1);
 
             // write as many full bulk segments as possible
             while (pos + Segment.MAX_SEGMENT_SIZE <= data.length) {
@@ -654,9 +601,9 @@ public class SegmentWriter {
         }
 
         /**
-         * @param   blob
-         * @return  {@code true} iff {@code blob} is a {@code SegmentBlob}
-         *          and originates from the same segment store.
+         * @param blob
+         * @return {@code true} iff {@code blob} is a {@code SegmentBlob} and
+         * originates from the same segment store.
          */
         private boolean sameStore(Blob blob) {
             return (blob instanceof SegmentBlob)
@@ -688,8 +635,9 @@ public class SegmentWriter {
         }
 
         /**
-         * Write a reference to an external blob. This method handles blob IDs 
of
-         * every length, but behaves differently for small and large blob IDs.
+         * Write a reference to an external blob. This method handles blob IDs
+         * of every length, but behaves differently for small and large blob
+         * IDs.
          *
          * @param blobId Blob ID.
          * @return Record ID pointing to the written blob ID.
@@ -711,7 +659,7 @@ public class SegmentWriter {
         }
 
         private RecordId writeBlock(@Nonnull byte[] bytes, int offset, int 
length)
-        throws IOException {
+                throws IOException {
             checkNotNull(bytes);
             checkPositionIndexes(offset, offset + length, bytes.length);
             return RecordWriters.newBlockWriter(bytes, offset, 
length).write(writer, store);
@@ -754,7 +702,7 @@ public class SegmentWriter {
 
             if (blobStore != null) {
                 String blobId = blobStore.writeBlob(new SequenceInputStream(
-                    new ByteArrayInputStream(data, 0, n), stream));
+                        new ByteArrayInputStream(data, 0, n), stream));
                 return writeBlobId(blobId);
             }
 
@@ -762,7 +710,7 @@ public class SegmentWriter {
             n += read(stream, data, n, Segment.MAX_SEGMENT_SIZE - n);
             long length = n;
             List<RecordId> blockIds =
-                newArrayListWithExpectedSize(2 * n / BLOCK_SIZE);
+                    newArrayListWithExpectedSize(2 * n / BLOCK_SIZE);
 
             // Write the data to bulk segments and collect the list of block 
ids
             while (n != 0) {
@@ -787,8 +735,9 @@ public class SegmentWriter {
         }
 
         private RecordId writeProperty(@Nonnull PropertyState state,
-                                       @Nonnull Map<String, RecordId> 
previousValues)
-        throws IOException {
+                @Nonnull Map<String, RecordId> previousValues
+        )
+                throws IOException {
             Type<?> type = state.getType();
             int count = state.count();
 
@@ -887,8 +836,8 @@ public class SegmentWriter {
             head |= propertyNames.length;
 
             RecordId tid = RecordWriters.newTemplateWriter(ids, propertyNames,
-                propertyTypes, head, primaryId, mixinIds, childNameId,
-                propNamesId).write(writer, store);
+                    propertyTypes, head, primaryId, mixinIds, childNameId,
+                    propNamesId).write(writer, store);
             templateCache.put(template, tid);
             return tid;
         }
@@ -958,8 +907,8 @@ public class SegmentWriter {
                 MapRecord base;
                 Map<String, RecordId> childNodes;
                 if (before != null
-                    && before.getChildNodeCount(2) > 1
-                    && after.getChildNodeCount(2) > 1) {
+                        && before.getChildNodeCount(2) > 1
+                        && after.getChildNodeCount(2) > 1) {
                     base = before.getChildNodeMap();
                     childNodes = new ChildNodeCollectorDiff().diff(before, 
after);
                 } else {
@@ -967,8 +916,8 @@ public class SegmentWriter {
                     childNodes = newHashMap();
                     for (ChildNodeEntry entry : state.getChildNodeEntries()) {
                         childNodes.put(
-                            entry.getName(),
-                            writeNode(entry.getNodeState()));
+                                entry.getName(),
+                                writeNode(entry.getNodeState()));
                     }
                 }
                 ids.add(writeMap(base, childNodes));
@@ -1070,8 +1019,9 @@ public class SegmentWriter {
         }
 
         /**
-         * @param   node
-         * @return  {@code true} iff {@code node} originates from the same 
segment store.
+         * @param node
+         * @return {@code true} iff {@code node} originates from the same
+         * segment store.
          */
         private boolean sameStore(SegmentNodeState node) {
             return sameStore(node.getRecordId().getSegmentId());
@@ -1079,12 +1029,12 @@ public class SegmentWriter {
 
         /**
          * @param property
-         * @return  {@code true} iff {@code property} is a {@code 
SegmentPropertyState}
-         *          and originates from the same segment store.
+         * @return {@code true} iff {@code property} is a {@code
+         * SegmentPropertyState} and originates from the same segment store.
          */
         private boolean sameStore(PropertyState property) {
             return (property instanceof SegmentPropertyState)
-                && sameStore(((Record) property).getRecordId().getSegmentId());
+                    && sameStore(((Record) 
property).getRecordId().getSegmentId());
         }
 
         private boolean isOldGeneration(RecordId id) {
@@ -1098,12 +1048,14 @@ public class SegmentWriter {
                 // compacted.
                 // Consider increasing 
SegmentGCOptions.getRetainedGenerations()
                 throw new SegmentNotFoundException(
-                    "Cannot copy record from a generation that has been gc'ed 
already", snfe);
+                        "Cannot copy record from a generation that has been 
gc'ed already", snfe);
             }
         }
 
         private class ChildNodeCollectorDiff extends DefaultNodeStateDiff {
+
             private final Map<String, RecordId> childNodes = newHashMap();
+
             private IOException exception;
 
             public Map<String, RecordId> diff(SegmentNodeState before, 
ModifiedNodeState after) throws IOException {
@@ -1128,7 +1080,8 @@ public class SegmentWriter {
 
             @Override
             public boolean childNodeChanged(
-                String name, NodeState before, NodeState after) {
+                    String name, NodeState before, NodeState after
+            ) {
                 try {
                     childNodes.put(name, writeNode(after));
                 } catch (IOException e) {

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java
 Thu Jun 22 15:14:00 2017
@@ -291,7 +291,6 @@ final class RecordWriters {
 
     /**
      * Block record writer.
-     * @see SegmentWriter#writeBlock
      * @see RecordType#BLOCK
      */
     private static class BlockWriter extends RecordWriter {

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=1799590&r1=1799589&r2=1799590&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
 Thu Jun 22 15:14:00 2017
@@ -25,11 +25,11 @@ import static com.google.common.base.Pre
 import static java.util.Arrays.fill;
 import static org.apache.jackrabbit.oak.commons.IOUtils.closeQuietly;
 import static 
org.apache.jackrabbit.oak.segment.CacheWeights.OBJECT_HEADER_SIZE;
+import static 
org.apache.jackrabbit.oak.segment.DefaultSegmentWriter.BLOCK_SIZE;
 import static 
org.apache.jackrabbit.oak.segment.RecordNumbers.EMPTY_RECORD_NUMBERS;
 import static org.apache.jackrabbit.oak.segment.SegmentId.isDataSegmentId;
 import static org.apache.jackrabbit.oak.segment.SegmentVersion.LATEST_VERSION;
 import static org.apache.jackrabbit.oak.segment.SegmentVersion.isValid;
-import static org.apache.jackrabbit.oak.segment.SegmentWriter.BLOCK_SIZE;
 
 import java.io.IOException;
 import java.io.OutputStream;

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlob.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlob.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlob.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlob.java
 Thu Jun 22 15:14:00 2017
@@ -21,9 +21,9 @@ package org.apache.jackrabbit.oak.segmen
 import static com.google.common.base.Charsets.UTF_8;
 import static com.google.common.collect.Sets.newHashSet;
 import static java.util.Collections.emptySet;
+import static 
org.apache.jackrabbit.oak.segment.DefaultSegmentWriter.BLOCK_SIZE;
 import static org.apache.jackrabbit.oak.segment.Segment.MEDIUM_LIMIT;
 import static org.apache.jackrabbit.oak.segment.Segment.SMALL_LIMIT;
-import static org.apache.jackrabbit.oak.segment.SegmentWriter.BLOCK_SIZE;
 
 import java.io.InputStream;
 import java.util.List;

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=1799590&r1=1799589&r2=1799590&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
 Thu Jun 22 15:14:00 2017
@@ -63,7 +63,7 @@ import org.slf4j.LoggerFactory;
  * overrun be calling any of the write methods.
  * <p>
  * Instances of this class are <em>not thread safe</em>. See also the class 
comment of
- * {@link SegmentWriter}.
+ * {@link DefaultSegmentWriter}.
  */
 public class SegmentBufferWriter implements WriteOperationHandler {
 

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
 Thu Jun 22 15:14:00 2017
@@ -42,7 +42,7 @@ import com.google.common.util.concurrent
  * which it passes to its {@link #execute(WriteOperation) execute} method.
  * <p>
  * Instances of this class are thread safe. See also the class comment of
- * {@link SegmentWriter}.
+ * {@link DefaultSegmentWriter}.
  */
 public class SegmentBufferWriterPool implements WriteOperationHandler {
 

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeBuilder.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeBuilder.java
 Thu Jun 22 15:14:00 2017
@@ -27,6 +27,7 @@ import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder;
+import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,8 +48,12 @@ public class SegmentNodeBuilder extends
     private static final int UPDATE_LIMIT =
             Integer.getInteger("update.limit", 10000);
 
+    private final BlobStore blobStore;
+
+    private final SegmentReader reader;
+
     @Nonnull
-    private final SegmentWriter writer;
+    private final DefaultSegmentWriter writer;
 
     /**
      * Local update counter for the root builder.
@@ -64,14 +69,18 @@ public class SegmentNodeBuilder extends
      */
     private long updateCount;
 
-    SegmentNodeBuilder(@Nonnull SegmentNodeState base, @Nonnull SegmentWriter 
writer) {
+    SegmentNodeBuilder(@Nonnull SegmentNodeState base, BlobStore blobStore, 
SegmentReader reader, @Nonnull DefaultSegmentWriter writer) {
         super(base);
+        this.blobStore = blobStore;
+        this.reader = reader;
         this.writer = checkNotNull(writer);
         this.updateCount = 0;
     }
 
-    private SegmentNodeBuilder(SegmentNodeBuilder parent, String name, 
@Nonnull SegmentWriter writer) {
+    private SegmentNodeBuilder(SegmentNodeBuilder parent, String name, 
BlobStore blobStore, SegmentReader reader, @Nonnull DefaultSegmentWriter 
writer) {
         super(parent, name);
+        this.blobStore = blobStore;
+        this.reader = reader;
         this.writer = checkNotNull(writer);
         this.updateCount = -1;
     }
@@ -108,7 +117,7 @@ public class SegmentNodeBuilder extends
     public SegmentNodeState getNodeState() {
         try {
             NodeState state = super.getNodeState();
-            SegmentNodeState sState = writer.writeNode(state);
+            SegmentNodeState sState = new SegmentNodeState(reader, writer, 
blobStore, writer.writeNode(state));
             if (state != sState) {
                 set(sState);
                 if(!isChildBuilder()) {
@@ -124,12 +133,12 @@ public class SegmentNodeBuilder extends
 
     @Override
     protected MemoryNodeBuilder createChildBuilder(String name) {
-        return new SegmentNodeBuilder(this, name, writer);
+        return new SegmentNodeBuilder(this, name, blobStore, reader, writer);
     }
 
     @Override
     public Blob createBlob(InputStream stream) throws IOException {
-        return writer.writeStream(stream);
+        return new SegmentBlob(blobStore, writer.writeStream(stream));
     }
 
 }

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
 Thu Jun 22 15:14:00 2017
@@ -50,6 +50,7 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryChildNodeEntry;
+import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.state.AbstractNodeState;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -63,8 +64,10 @@ public class SegmentNodeState extends Re
     @Nonnull
     private final SegmentReader reader;
 
+    private final BlobStore blobStore;
+
     @Nonnull
-    private final Supplier<SegmentWriter> writer;
+    private final Supplier<DefaultSegmentWriter> writer;
 
     private volatile RecordId templateId = null;
 
@@ -72,18 +75,21 @@ public class SegmentNodeState extends Re
 
     SegmentNodeState(
             @Nonnull SegmentReader reader,
-            @Nonnull Supplier<SegmentWriter> writer,
+            @Nonnull Supplier<DefaultSegmentWriter> writer,
+            BlobStore blobStore,
             @Nonnull RecordId id) {
         super(id);
         this.reader = checkNotNull(reader);
         this.writer = checkNotNull(memoize(writer));
+        this.blobStore = blobStore;
     }
 
-    SegmentNodeState(
+    public SegmentNodeState(
             @Nonnull SegmentReader reader,
-            @Nonnull SegmentWriter writer,
+            @Nonnull DefaultSegmentWriter writer,
+            BlobStore blobStore,
             @Nonnull RecordId id) {
-        this(reader, Suppliers.ofInstance(writer), id);
+        this(reader, Suppliers.ofInstance(writer), blobStore, id);
     }
 
     RecordId getTemplateId() {
@@ -448,7 +454,7 @@ public class SegmentNodeState extends Re
 
     @Override @Nonnull
     public SegmentNodeBuilder builder() {
-        return new SegmentNodeBuilder(this, writer.get());
+        return new SegmentNodeBuilder(this, blobStore, reader, writer.get());
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
 Thu Jun 22 15:14:00 2017
@@ -72,7 +72,7 @@ public class SegmentNodeStore implements
         private final SegmentReader reader;
 
         @Nonnull
-        private final SegmentWriter writer;
+        private final DefaultSegmentWriter writer;
 
         @CheckForNull
         private final BlobStore blobStore;
@@ -87,7 +87,7 @@ public class SegmentNodeStore implements
         private SegmentNodeStoreBuilder(
                 @Nonnull Revisions revisions,
                 @Nonnull SegmentReader reader,
-                @Nonnull SegmentWriter writer,
+                @Nonnull DefaultSegmentWriter writer,
                 @Nullable BlobStore blobStore) {
             this.revisions = revisions;
             this.reader = reader;
@@ -138,7 +138,7 @@ public class SegmentNodeStore implements
     public static SegmentNodeStoreBuilder builder(
             @Nonnull Revisions revisions,
             @Nonnull SegmentReader reader,
-            @Nonnull SegmentWriter writer,
+            @Nonnull DefaultSegmentWriter writer,
             @Nullable BlobStore blobStore) {
         return new SegmentNodeStoreBuilder(checkNotNull(revisions),
                 checkNotNull(reader), checkNotNull(writer), blobStore);
@@ -149,7 +149,7 @@ public class SegmentNodeStore implements
     public static final String CHECKPOINTS = "checkpoints";
 
     @Nonnull
-    private final SegmentWriter writer;
+    private final DefaultSegmentWriter writer;
 
     @Nonnull
     private final Scheduler scheduler;
@@ -228,7 +228,7 @@ public class SegmentNodeStore implements
     @Nonnull
     @Override
     public Blob createBlob(InputStream stream) throws IOException {
-        return writer.writeStream(stream);
+        return new SegmentBlob(blobStore, writer.writeStream(stream));
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentParser.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentParser.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentParser.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentParser.java
 Thu Jun 22 15:14:00 2017
@@ -25,11 +25,11 @@ import static com.google.common.collect.
 import static com.google.common.collect.Lists.newArrayListWithCapacity;
 import static java.util.Collections.singletonList;
 import static org.apache.jackrabbit.oak.api.Type.BINARY;
+import static 
org.apache.jackrabbit.oak.segment.DefaultSegmentWriter.BLOCK_SIZE;
 import static org.apache.jackrabbit.oak.segment.ListRecord.LEVEL_SIZE;
 import static org.apache.jackrabbit.oak.segment.Segment.MEDIUM_LIMIT;
 import static org.apache.jackrabbit.oak.segment.Segment.RECORD_ID_BYTES;
 import static org.apache.jackrabbit.oak.segment.Segment.SMALL_LIMIT;
-import static org.apache.jackrabbit.oak.segment.SegmentWriter.BLOCK_SIZE;
 import static org.apache.jackrabbit.oak.segment.Template.MANY_CHILD_NODES;
 import static org.apache.jackrabbit.oak.segment.Template.ZERO_CHILD_NODES;
 

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentStream.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentStream.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentStream.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentStream.java
 Thu Jun 22 15:14:00 2017
@@ -22,7 +22,7 @@ import static com.google.common.base.Pre
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
 import static com.google.common.base.Preconditions.checkState;
-import static org.apache.jackrabbit.oak.segment.SegmentWriter.BLOCK_SIZE;
+import static 
org.apache.jackrabbit.oak.segment.DefaultSegmentWriter.BLOCK_SIZE;
 
 import java.io.IOException;
 import java.io.InputStream;

Added: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java?rev=1799590&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
 Thu Jun 22 15:14:00 2017
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.oak.segment;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.google.common.base.Supplier;
+import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+public interface SegmentWriter {
+
+    void flush() throws IOException;
+
+    /**
+     * Write a map record.
+     *
+     * @param base    base map relative to which the {@code changes} are 
applied
+     *                ot {@code null} for the empty map.
+     * @param changes the changed mapping to apply to the {@code base} map.
+     * @return the map record written
+     * @throws IOException
+     */
+    @Nonnull
+    // TODO frm this method is only used from test code, should it be removed?
+    RecordId writeMap(@Nullable MapRecord base, @Nonnull Map<String, RecordId> 
changes) throws IOException;
+
+    /**
+     * Write a list record.
+     *
+     * @param list the list to write.
+     * @return the record id of the list written
+     * @throws IOException
+     */
+    @Nonnull
+    // TODO frm this method is only used from test code, should it be removed?
+    RecordId writeList(@Nonnull List<RecordId> list) throws IOException;
+
+    /**
+     * Write a string record.
+     *
+     * @param string the string to write.
+     * @return the record id of the string written.
+     * @throws IOException
+     */
+    @Nonnull
+    // TODO frm this method is only used from test code, should it be removed?
+    RecordId writeString(@Nonnull String string) throws IOException;
+
+    /**
+     * Write a blob (as list of block records)
+     *
+     * @param blob blob to write
+     * @return The segment blob written
+     * @throws IOException
+     */
+    @Nonnull
+    RecordId writeBlob(@Nonnull Blob blob) throws IOException;
+
+    /**
+     * Writes a block record containing the given block of bytes.
+     *
+     * @param bytes  source buffer
+     * @param offset offset within the source buffer
+     * @param length number of bytes to write
+     * @return block record identifier
+     */
+    @Nonnull
+    // TODO frm this method is only used from test code, should it be removed?
+    RecordId writeBlock(@Nonnull byte[] bytes, int offset, int length) throws 
IOException;
+
+    /**
+     * Writes a stream value record. The given stream is consumed <em>and
+     * closed</em> by this method.
+     *
+     * @param stream stream to be written
+     * @return blob for the passed {@code stream}
+     * @throws IOException if the input stream could not be read or the output
+     *                     could not be written
+     */
+    @Nonnull
+    RecordId writeStream(@Nonnull InputStream stream) throws IOException;
+
+    /**
+     * Write a property.
+     *
+     * @param state the property to write
+     * @return the property state written
+     * @throws IOException
+     */
+    @Nonnull
+    // TODO frm this method is only used from test code, should it be removed?
+    RecordId writeProperty(@Nonnull PropertyState state) throws IOException;
+
+    /**
+     * Write a node state.
+     * <p>
+     * <em>Note:</em> the returned {@code SegmentNodeState} instance is bound 
to
+     * this {@code SegmentWriter} instance. That is, future calls to {@code
+     * #builder()} return a {@code NodeBuilder} that is also bound to the same
+     * {@code SegmentWriter} instance and uses it for writing any changes. This
+     * might not always be desired and callers of this method need to take care
+     * not to proliferate this writer through the returned node states beyond
+     * the intended bounds.
+     *
+     * @param state node state to write
+     * @return segment node state equal to {@code state}
+     * @throws IOException
+     */
+    @Nonnull
+    RecordId writeNode(@Nonnull NodeState state) throws IOException;
+
+    /**
+     * Write a node state, unless cancelled.
+     * <p>
+     * <em>Note:</em> the returned {@code SegmentNodeState} instance is bound 
to
+     * this {@code SegmentWriter} instance. That is, future calls to {@code
+     * #builder()} return a {@code NodeBuilder} that is also bound to the same
+     * {@code SegmentWriter} instance and uses it for writing any changes. This
+     * might not always be desired and callers of this method need to take care
+     * not to proliferate this writer through the returned node states beyond
+     * the intended bounds.
+     *
+     * @param state  node state to write
+     * @param cancel supplier to signal cancellation of this write operation
+     * @return segment node state equal to {@code state} or {@code null} if
+     * cancelled.
+     * @throws IOException
+     */
+    @CheckForNull
+    RecordId writeNode(@Nonnull NodeState state, @Nonnull Supplier<Boolean> 
cancel) throws IOException;
+
+}

Propchange: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java
 Thu Jun 22 15:14:00 2017
@@ -31,7 +31,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.memory.MemoryStore;
 
 /**
- * Builder for building {@link SegmentWriter} instances.
+ * Builder for building {@link DefaultSegmentWriter} instances.
  * The returned instances are thread safe if {@link #withWriterPool()}
  * was specified and <em>not</em> thread sage if {@link #withoutWriterPool()}
  * was specified (default).
@@ -142,8 +142,8 @@ public final class SegmentWriterBuilder
      * Build a {@code SegmentWriter} for a {@code FileStore}.
      */
     @Nonnull
-    public SegmentWriter build(@Nonnull FileStore store) {
-        return new SegmentWriter(
+    public DefaultSegmentWriter build(@Nonnull FileStore store) {
+        return new DefaultSegmentWriter(
                 checkNotNull(store),
                 store.getReader(),
                 store.getSegmentIdProvider(),
@@ -159,8 +159,8 @@ public final class SegmentWriterBuilder
      * {@code UnsupportedOperationException} to be thrown.
      */
     @Nonnull
-    public SegmentWriter build(@Nonnull ReadOnlyFileStore store) {
-        return new SegmentWriter(
+    public DefaultSegmentWriter build(@Nonnull ReadOnlyFileStore store) {
+        return new DefaultSegmentWriter(
                 checkNotNull(store),
                 store.getReader(),
                 store.getSegmentIdProvider(),
@@ -184,8 +184,8 @@ public final class SegmentWriterBuilder
      * Build a {@code SegmentWriter} for a {@code MemoryStore}.
      */
     @Nonnull
-    public SegmentWriter build(@Nonnull MemoryStore store) {
-        return new SegmentWriter(
+    public DefaultSegmentWriter build(@Nonnull MemoryStore store) {
+        return new DefaultSegmentWriter(
                 checkNotNull(store),
                 store.getReader(),
                 store.getSegmentIdProvider(),

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriteOperationHandler.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriteOperationHandler.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriteOperationHandler.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriteOperationHandler.java
 Thu Jun 22 15:14:00 2017
@@ -25,12 +25,12 @@ import javax.annotation.Nonnull;
 
 /**
  * A {@code WriteOperationHandler} executes {@link WriteOperation 
WriteOperation}s and as
- * such serves as a bridge between {@link SegmentWriter} and {@link 
SegmentBufferWriter}.
+ * such serves as a bridge between {@link DefaultSegmentWriter} and {@link 
SegmentBufferWriter}.
  */
 interface WriteOperationHandler {
 
     /**
-     * A {@code WriteOperation} encapsulates an operation on a {@link 
SegmentWriter}.
+     * A {@code WriteOperation} encapsulates an operation on a {@link 
DefaultSegmentWriter}.
      * Executing it performs the actual act of persisting changes to a
      * {@link SegmentBufferWriter}.
      */

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriterCacheManager.java
 Thu Jun 22 15:14:00 2017
@@ -45,7 +45,7 @@ import org.apache.jackrabbit.oak.stats.S
 
 /**
  * Instances of this class manage the deduplication caches used
- * by the {@link SegmentWriter} to avoid writing multiple copies
+ * by the {@link DefaultSegmentWriter} to avoid writing multiple copies
  * of the same record. The caches are striped into generations
  * with one generation per gc cycle. This avoids records old
  * generations being reused.

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
 Thu Jun 22 15:14:00 2017
@@ -51,7 +51,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.SegmentReader;
 import org.apache.jackrabbit.oak.segment.SegmentStore;
 import org.apache.jackrabbit.oak.segment.SegmentTracker;
-import org.apache.jackrabbit.oak.segment.SegmentWriter;
+import org.apache.jackrabbit.oak.segment.DefaultSegmentWriter;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -122,9 +122,9 @@ public abstract class AbstractFileStore
         });
         this.blobStore = builder.getBlobStore();
         this.segmentCache = new SegmentCache(builder.getSegmentCacheSize());
-        this.segmentReader = new CachingSegmentReader(new 
Supplier<SegmentWriter>() {
+        this.segmentReader = new CachingSegmentReader(new 
Supplier<DefaultSegmentWriter>() {
             @Override
-            public SegmentWriter get() {
+            public DefaultSegmentWriter get() {
                 return getWriter();
             }
         }, blobStore, builder.getStringCacheSize(), 
builder.getTemplateCacheSize());
@@ -195,7 +195,7 @@ public abstract class AbstractFileStore
     }
 
     @Nonnull
-    public abstract SegmentWriter getWriter();
+    public abstract DefaultSegmentWriter getWriter();
 
     @Nonnull
     public SegmentReader getReader() {

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
 Thu Jun 22 15:14:00 2017
@@ -66,13 +66,13 @@ import com.google.common.base.Suppliers;
 import com.google.common.io.Closer;
 import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
 import org.apache.jackrabbit.oak.segment.Compactor;
+import org.apache.jackrabbit.oak.segment.DefaultSegmentWriter;
 import org.apache.jackrabbit.oak.segment.RecordId;
 import org.apache.jackrabbit.oak.segment.Segment;
 import org.apache.jackrabbit.oak.segment.SegmentId;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.segment.SegmentNotFoundException;
 import org.apache.jackrabbit.oak.segment.SegmentNotFoundExceptionListener;
-import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.segment.WriterCacheManager;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.file.GCJournal.GCJournalEntry;
@@ -106,7 +106,7 @@ public class FileStore extends AbstractF
     private static final AtomicLong GC_COUNT = new AtomicLong(0);
 
     @Nonnull
-    private final SegmentWriter segmentWriter;
+    private final DefaultSegmentWriter segmentWriter;
 
     @Nonnull
     private final GarbageCollector garbageCollector;
@@ -268,10 +268,10 @@ public class FileStore extends AbstractF
             @Override
             public RecordId get() {
                 try {
-                    SegmentWriter writer = 
segmentWriterBuilder("init").build(FileStore.this);
+                    DefaultSegmentWriter writer = 
segmentWriterBuilder("init").build(FileStore.this);
                     NodeBuilder builder = EMPTY_NODE.builder();
                     builder.setChildNode("root", EMPTY_NODE);
-                    SegmentNodeState node = 
writer.writeNode(builder.getNodeState());
+                    SegmentNodeState node = new 
SegmentNodeState(segmentReader, writer, getBlobStore(), 
writer.writeNode(builder.getNodeState()));
                     writer.flush();
                     return node.getRecordId();
                 } catch (IOException e) {
@@ -398,7 +398,7 @@ public class FileStore extends AbstractF
 
     @Override
     @Nonnull
-    public SegmentWriter getWriter() {
+    public DefaultSegmentWriter getWriter() {
         return segmentWriter;
     }
 
@@ -667,7 +667,7 @@ public class FileStore extends AbstractF
 
                 SegmentNodeState before = getHead();
                 CancelCompactionSupplier cancel = new 
CancelCompactionSupplier(FileStore.this);
-                SegmentWriter writer = segmentWriterBuilder("c")
+                DefaultSegmentWriter writer = segmentWriterBuilder("c")
                         .with(cacheManager)
                         .withGeneration(newGeneration)
                         .withoutWriterPool()
@@ -763,18 +763,18 @@ public class FileStore extends AbstractF
             }
         }
 
-        private SegmentNodeState compact(NodeState head, SegmentWriter writer, 
Supplier<Boolean> cancel)
+        private SegmentNodeState compact(NodeState head, DefaultSegmentWriter 
writer, Supplier<Boolean> cancel)
         throws IOException {
             if (gcOptions.isOffline()) {
                 return new Compactor(segmentReader, writer, getBlobStore(), 
cancel, gcOptions)
                         .compact(EMPTY_NODE, head, EMPTY_NODE);
             } else {
-                return writer.writeNode(head, cancel);
+                return new SegmentNodeState(segmentReader, writer, 
getBlobStore(), writer.writeNode(head, cancel));
             }
         }
 
         @CheckForNull
-        private SegmentNodeState forceCompact(@Nonnull final SegmentWriter 
writer,
+        private SegmentNodeState forceCompact(@Nonnull final 
DefaultSegmentWriter writer,
                                               @Nonnull final Supplier<Boolean> 
cancel)
         throws InterruptedException {
             RecordId compactedId = revisions.setHead(new Function<RecordId, 
RecordId>() {

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
 Thu Jun 22 15:14:00 2017
@@ -36,7 +36,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.Segment;
 import org.apache.jackrabbit.oak.segment.SegmentGraph.SegmentGraphVisitor;
 import org.apache.jackrabbit.oak.segment.SegmentId;
-import org.apache.jackrabbit.oak.segment.SegmentWriter;
+import org.apache.jackrabbit.oak.segment.DefaultSegmentWriter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -54,7 +54,7 @@ public class ReadOnlyFileStore extends A
     private final TarFiles tarFiles;
 
     @Nonnull
-    private final SegmentWriter writer;
+    private final DefaultSegmentWriter writer;
 
     private ReadOnlyRevisions revisions;
 
@@ -149,7 +149,7 @@ public class ReadOnlyFileStore extends A
 
     @Nonnull
     @Override
-    public SegmentWriter getWriter() {
+    public DefaultSegmentWriter getWriter() {
         return writer;
     }
 

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java
 Thu Jun 22 15:14:00 2017
@@ -40,7 +40,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.SegmentReader;
 import org.apache.jackrabbit.oak.segment.SegmentStore;
 import org.apache.jackrabbit.oak.segment.SegmentTracker;
-import org.apache.jackrabbit.oak.segment.SegmentWriter;
+import org.apache.jackrabbit.oak.segment.DefaultSegmentWriter;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 
 /**
@@ -58,7 +58,7 @@ public class MemoryStore implements Segm
     private final SegmentReader segmentReader;
 
     @Nonnull
-    private final SegmentWriter segmentWriter;
+    private final DefaultSegmentWriter segmentWriter;
 
     private final ConcurrentMap<SegmentId, Segment> segments =
             Maps.newConcurrentMap();
@@ -71,9 +71,9 @@ public class MemoryStore implements Segm
             }
         });
         this.revisions = new MemoryStoreRevisions();
-        Supplier<SegmentWriter> getWriter = new Supplier<SegmentWriter>() {
+        Supplier<DefaultSegmentWriter> getWriter = new 
Supplier<DefaultSegmentWriter>() {
             @Override
-            public SegmentWriter get() {
+            public DefaultSegmentWriter get() {
                 return getWriter();
             }
         };
@@ -84,7 +84,7 @@ public class MemoryStore implements Segm
     }
 
     @Nonnull
-    public SegmentWriter getWriter() {
+    public DefaultSegmentWriter getWriter() {
         return segmentWriter;
     }
 

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStoreRevisions.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStoreRevisions.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStoreRevisions.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStoreRevisions.java
 Thu Jun 22 15:14:00 2017
@@ -45,7 +45,7 @@ public class MemoryStoreRevisions implem
         if (head == null) {
             NodeBuilder builder = EMPTY_NODE.builder();
             builder.setChildNode("root", EMPTY_NODE);
-            head = 
store.getWriter().writeNode(builder.getNodeState()).getRecordId();
+            head = store.getWriter().writeNode(builder.getNodeState());
             store.getWriter().flush();
         }
     }

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BigInlinedBinaryIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BigInlinedBinaryIT.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BigInlinedBinaryIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BigInlinedBinaryIT.java
 Thu Jun 22 15:14:00 2017
@@ -22,7 +22,7 @@ import static java.lang.Long.signum;
 import static java.lang.System.getProperty;
 import static org.apache.jackrabbit.oak.api.Type.BINARY;
 import static org.apache.jackrabbit.oak.segment.ListRecord.LEVEL_SIZE;
-import static org.apache.jackrabbit.oak.segment.SegmentWriter.BLOCK_SIZE;
+import static 
org.apache.jackrabbit.oak.segment.DefaultSegmentWriter.BLOCK_SIZE;
 import static 
org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
 
 import java.io.File;

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/BlobIdRecordTest.java
 Thu Jun 22 15:14:00 2017
@@ -126,9 +126,9 @@ public class BlobIdRecordTest {
     @Test
     public void shortReferencesShouldHaveBlobIdType() throws Exception {
         try (FileStore ss = newFileStore(new ShortIdMappingBlobStore())) {
-            SegmentWriter sw = segmentWriterBuilder("test").build(ss);
+            DefaultSegmentWriter sw = segmentWriterBuilder("test").build(ss);
             byte[] content = new byte[Segment.MEDIUM_LIMIT + 1];
-            SegmentBlob sb = sw.writeBlob(new ArrayBasedBlob(content));
+            SegmentBlob sb = new SegmentBlob(ss.getBlobStore(), 
sw.writeBlob(new ArrayBasedBlob(content)));
             assertRecordTypeEquals(sb, RecordType.BLOB_ID);
         }
     }
@@ -136,9 +136,9 @@ public class BlobIdRecordTest {
     @Test
     public void longReferencesShouldHaveBlobIdType() throws Exception {
         try (FileStore ss = newFileStore(new LongIdMappingBlobStore())) {
-            SegmentWriter sw = segmentWriterBuilder("test").build(ss);
+            DefaultSegmentWriter sw = segmentWriterBuilder("test").build(ss);
             byte[] content = new byte[Segment.MEDIUM_LIMIT + 1];
-            SegmentBlob sb = sw.writeBlob(new ArrayBasedBlob(content));
+            SegmentBlob sb = new SegmentBlob(ss.getBlobStore(), 
sw.writeBlob(new ArrayBasedBlob(content)));
             assertRecordTypeEquals(sb, RecordType.BLOB_ID);
         }
     }

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
 Thu Jun 22 15:14:00 2017
@@ -68,6 +68,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.FileStoreGCMonitor;
 import org.apache.jackrabbit.oak.segment.tool.Compact;
+import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
@@ -755,14 +756,16 @@ public class CompactionAndCleanupIT {
     @Test
     public void cleanupCyclicGraph() throws Exception {
         FileStore fileStore = fileStoreBuilder(getFileStoreFolder()).build();
-        final SegmentWriter writer = fileStore.getWriter();
+        final SegmentReader reader = fileStore.getReader();
+        final DefaultSegmentWriter writer = fileStore.getWriter();
+        final BlobStore blobStore = fileStore.getBlobStore();
         final SegmentNodeState oldHead = fileStore.getHead();
 
         final SegmentNodeState child = run(new Callable<SegmentNodeState>() {
             @Override
             public SegmentNodeState call() throws Exception {
                 NodeBuilder builder = EMPTY_NODE.builder();
-                return writer.writeNode(EMPTY_NODE);
+                return new SegmentNodeState(reader, writer, blobStore, 
writer.writeNode(EMPTY_NODE));
             }
         });
         SegmentNodeState newHead = run(new Callable<SegmentNodeState>() {
@@ -770,7 +773,7 @@ public class CompactionAndCleanupIT {
             public SegmentNodeState call() throws Exception {
                 NodeBuilder builder = oldHead.builder();
                 builder.setChildNode("child", child);
-                return writer.writeNode(builder.getNodeState());
+                return new SegmentNodeState(reader, writer, blobStore, 
writer.writeNode(builder.getNodeState()));
             }
         });
 

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java
 Thu Jun 22 15:14:00 2017
@@ -52,7 +52,7 @@ public class CompactorTest {
         NodeStore store = 
SegmentNodeStoreBuilders.builder(memoryStore).build();
         init(store);
 
-        SegmentWriter writer = 
segmentWriterBuilder("c").withGeneration(1).build(memoryStore);
+        DefaultSegmentWriter writer = 
segmentWriterBuilder("c").withGeneration(1).build(memoryStore);
         Compactor compactor = new Compactor(memoryStore.getReader(), writer,
                 memoryStore.getBlobStore(), Suppliers.ofInstance(false), 
defaultGCOptions());
         addTestContent(store, 0);
@@ -75,7 +75,7 @@ public class CompactorTest {
         // doesn't have the child named "b".
 
         NodeStore store = 
SegmentNodeStoreBuilders.builder(memoryStore).build();
-        SegmentWriter writer = 
segmentWriterBuilder("c").withGeneration(1).build(memoryStore);
+        DefaultSegmentWriter writer = 
segmentWriterBuilder("c").withGeneration(1).build(memoryStore);
         Compactor compactor = new Compactor(memoryStore.getReader(), writer,
                 memoryStore.getBlobStore(), Suppliers.ofInstance(true), 
defaultGCOptions());
         SegmentNodeState sns = compactor.compact(store.getRoot(),

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompareAgainstBaseStateTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompareAgainstBaseStateTest.java?rev=1799590&r1=1799589&r2=1799590&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompareAgainstBaseStateTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompareAgainstBaseStateTest.java
 Thu Jun 22 15:14:00 2017
@@ -44,7 +44,10 @@ public class CompareAgainstBaseStateTest
     private NodeBuilder builder;
 
     public CompareAgainstBaseStateTest() throws IOException {
-        builder = new 
MemoryStore().getWriter().writeNode(EMPTY_NODE).builder();
+        MemoryStore store = new MemoryStore();
+        RecordId id = store.getWriter().writeNode(EMPTY_NODE);
+        SegmentNodeState node = new SegmentNodeState(store.getReader(), 
store.getWriter(), store.getBlobStore(), id);
+        builder = node.builder();
     }
 
     @Before


Reply via email to