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/11/09 13:27:11 UTC

svn commit: r1637667 - in /jackrabbit/oak/branches/1.0: ./ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java

Author: alexparvulescu
Date: Sun Nov  9 12:27:10 2014
New Revision: 1637667

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


Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1633697,1633768

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java?rev=1637667&r1=1637666&r2=1637667&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeBuilder.java Sun Nov  9 12:27:10 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;
 
@@ -30,7 +34,19 @@ public class SegmentNodeBuilder extends 
 
     private final SegmentWriter writer;
 
-    private long updateCount = 0;
+    /**
+     * Local update counter for the root builder.
+     * 
+     * The value encodes both the counter and the type of the node builder:
+     * <ul>
+     * <li>value >= <code>0</code> represents a root builder (builder keeps
+     * counter updates)</li>
+     * <li>value = <code>-1</code> represents a child builder (value doesn't
+     * change, builder doesn't keep an updated counter)</li>
+     * </ul>
+     * 
+     */
+    private long updateCount;
 
     SegmentNodeBuilder(SegmentNodeState base) {
         this(base, base.getTracker().getWriter());
@@ -39,26 +55,36 @@ public class SegmentNodeBuilder extends 
     SegmentNodeBuilder(SegmentNodeState base, SegmentWriter writer) {
         super(base);
         this.writer = writer;
+        this.updateCount = 0;
+    }
+
+    SegmentNodeBuilder(SegmentNodeBuilder parent, String name,
+            SegmentWriter writer) {
+        super(parent, name);
+        this.writer = writer;
+        this.updateCount = -1;
     }
 
     //-------------------------------------------------< MemoryNodeBuilder >--
 
     @Override
     protected void updated() {
-        updateCount++;
-        if (updateCount > UPDATE_LIMIT) {
-            getNodeState();
+        if (isChildBuilder()) {
+            super.updated();
+        } else {
+            updateCount++;
+            if (updateCount > UPDATE_LIMIT) {
+                getNodeState();
+            }
         }
     }
 
-    //-------------------------------------------------------< NodeBuilder >--
-
-    @Override
-    public SegmentNodeState getBaseState() {
-        // guaranteed to be a SegmentNodeState
-        return (SegmentNodeState) super.getBaseState();
+    private boolean isChildBuilder() {
+        return updateCount < 0;
     }
 
+    //-------------------------------------------------------< NodeBuilder >--
+
     @Override
     public SegmentNodeState getNodeState() {
         NodeState state = super.getNodeState();
@@ -70,4 +96,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/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java?rev=1637667&r1=1637666&r2=1637667&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java Sun Nov  9 12:27:10 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;
@@ -127,7 +126,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);
 
@@ -156,7 +155,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);
@@ -301,9 +300,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;
 
@@ -319,10 +318,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);
@@ -334,8 +330,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
@@ -370,9 +365,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;
                     }
                 }
@@ -406,14 +401,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;
                         }
                     }