Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java (date 1413881246000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java (revision ) @@ -16,6 +16,10 @@ */ package org.apache.jackrabbit.oak.plugins.segment; +import java.io.IOException; +import java.io.InputStream; + +import org.apache.jackrabbit.oak.api.Blob; import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeState; @@ -47,6 +51,12 @@ this.writer = writer; } + SegmentNodeBuilder(SegmentNodeBuilder parent, String name, + SegmentWriter writer) { + super(parent, name); + this.writer = writer; + } + //-------------------------------------------------< MemoryNodeBuilder >-- @Override @@ -60,12 +70,6 @@ //-------------------------------------------------------< NodeBuilder >-- @Override - public SegmentNodeState getBaseState() { - // guaranteed to be a SegmentNodeState - return (SegmentNodeState) super.getBaseState(); - } - - @Override public SegmentNodeState getNodeState() { NodeState state = super.getNodeState(); SegmentNodeState sstate = writer.writeNode(state); @@ -74,6 +78,17 @@ updateCount = 0; } return sstate; + } + + @Override + protected MemoryNodeBuilder createChildBuilder(String name) { + return new SegmentNodeBuilder(this, name, writer); + } + + @Override + public Blob createBlob(InputStream stream) throws IOException { + SegmentNodeState sns = getNodeState(); + return sns.getTracker().getWriter().writeStream(stream); } } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java (date 1413881246000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java (revision ) @@ -34,7 +34,6 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.apache.jackrabbit.oak.api.Blob; import org.apache.jackrabbit.oak.api.CommitFailedException; @@ -133,7 +132,7 @@ @Override public NodeState merge( @Nonnull NodeBuilder builder, @Nonnull CommitHook commitHook, - @Nullable CommitInfo info) throws CommitFailedException { + @Nonnull CommitInfo info) throws CommitFailedException { checkArgument(builder instanceof SegmentNodeBuilder); checkNotNull(commitHook); @@ -162,7 +161,7 @@ SegmentNodeBuilder snb = (SegmentNodeBuilder) builder; NodeState root = getRoot(); - SegmentNodeState before = snb.getBaseState(); + NodeState before = snb.getBaseState(); if (!fastEquals(before, root)) { SegmentNodeState after = snb.getNodeState(); snb.reset(root); @@ -307,9 +306,9 @@ private final Random random = new Random(); - private SegmentNodeState before; + private final NodeState before; - private SegmentNodeState after; + private final SegmentNodeState after; private final CommitHook hook; @@ -325,10 +324,7 @@ this.info = checkNotNull(info); } - private boolean setHead(SegmentNodeBuilder builder) { - SegmentNodeState before = builder.getBaseState(); - SegmentNodeState after = builder.getNodeState(); - + private boolean setHead(SegmentNodeState before, SegmentNodeState after) { refreshHead(); if (store.setHead(before, after)) { head.set(after); @@ -340,8 +336,7 @@ } } - private SegmentNodeBuilder prepare() throws CommitFailedException { - SegmentNodeState state = head.get(); + private SegmentNodeBuilder prepare(SegmentNodeState state) throws CommitFailedException { SegmentNodeBuilder builder = state.builder(); if (fastEquals(before, state.getChildNode(ROOT))) { // use a shortcut when there are no external changes @@ -376,9 +371,9 @@ // someone else has a pessimistic lock on the journal, // so we should not try to commit anything yet } else { - SegmentNodeBuilder builder = prepare(); + SegmentNodeBuilder builder = prepare(state); // use optimistic locking to update the journal - if (setHead(builder)) { + if (setHead(state, builder.getNodeState())) { return -1; } } @@ -412,14 +407,14 @@ builder.setProperty("token", UUID.randomUUID().toString()); builder.setProperty("timeout", now + timeout); - if (setHead(builder)) { + if (setHead(state, builder.getNodeState())) { // lock acquired; rebase, apply commit hooks, and unlock - builder = prepare(); + builder = prepare(state); builder.removeProperty("token"); builder.removeProperty("timeout"); // complete the commit - if (setHead(builder)) { + if (setHead(state, builder.getNodeState())) { return; } }