You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by al...@apache.org on 2014/10/22 21:48:30 UTC

svn commit: r1633697 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment: SegmentNodeBuilder.java SegmentNodeStore.java

Author: alexparvulescu
Date: Wed Oct 22 19:48:29 2014
New Revision: 1633697

URL: http://svn.apache.org/r1633697
Log:
OAK-2218 Allow SegmentNodeBuilder to provide child builders of the same type

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java?rev=1633697&r1=1633696&r2=1633697&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java Wed Oct 22 19:48:29 2014
@@ -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 @@ public class SegmentNodeBuilder extends 
         this.writer = writer;
     }
 
+    SegmentNodeBuilder(SegmentNodeBuilder parent, String name,
+            SegmentWriter writer) {
+        super(parent, name);
+        this.writer = writer;
+    }
+
     //-------------------------------------------------< MemoryNodeBuilder >--
 
     @Override
@@ -60,12 +70,6 @@ public class SegmentNodeBuilder extends 
     //-------------------------------------------------------< 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);
@@ -76,4 +80,15 @@ public class SegmentNodeBuilder extends 
         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);
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java?rev=1633697&r1=1633696&r2=1633697&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java Wed Oct 22 19:48:29 2014
@@ -34,7 +34,6 @@ import java.util.concurrent.atomic.Atomi
 
 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 @@ public class SegmentNodeStore implements
     @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 @@ public class SegmentNodeStore implements
         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 @@ public class SegmentNodeStore implements
 
         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 @@ public class SegmentNodeStore implements
             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 @@ public class SegmentNodeStore implements
             }
         }
 
-        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 @@ public class SegmentNodeStore implements
                     // 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 @@ public class SegmentNodeStore implements
                     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;
                         }
                     }