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 ju...@apache.org on 2012/07/25 13:23:28 UTC

svn commit: r1365522 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel: JsopDiff.java KernelNodeStore.java KernelNodeStoreBranch.java KernelRootStateBuilder.java

Author: jukka
Date: Wed Jul 25 11:23:27 2012
New Revision: 1365522

URL: http://svn.apache.org/viewvc?rev=1365522&view=rev
Log:
OAK-167: Caching NodeStore implementation

Move the diff to jsop conversiont to a separate class and prepare to use it from within KernelRootStateBuilder.

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreBranch.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelRootStateBuilder.java

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java?rev=1365522&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java Wed Jul 25 11:23:27 2012
@@ -0,0 +1,140 @@
+/*
+ * 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.kernel;
+
+import static org.apache.jackrabbit.oak.kernel.CoreValueMapper.TYPE2HINT;
+
+import javax.jcr.PropertyType;
+
+import org.apache.jackrabbit.mk.json.JsopBuilder;
+import org.apache.jackrabbit.oak.api.CoreValue;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
+
+class JsopDiff implements NodeStateDiff {
+
+    private final JsopBuilder jsop;
+
+    private final String path;
+
+    public JsopDiff(JsopBuilder jsop, String path) {
+        this.jsop = jsop;
+        this.path = path;
+    }
+
+    public JsopDiff() {
+        this(new JsopBuilder(), "");
+    }
+
+    public static void diffToJsop(
+            NodeState before, NodeState after,
+            String path, JsopBuilder jsop) {
+        after.compareAgainstBaseState(before, new JsopDiff(jsop, path));
+    }
+
+    //-----------------------------------------------------< NodeStateDiff >--
+
+    @Override
+    public void propertyAdded(PropertyState after) {
+        jsop.tag('^').key(buildPath(after.getName()));
+        toJson(after, jsop);
+    }
+
+    @Override
+    public void propertyChanged(PropertyState before, PropertyState after) {
+        jsop.tag('^').key(buildPath(after.getName()));
+        toJson(after, jsop);
+    }
+
+    @Override
+    public void propertyDeleted(PropertyState before) {
+        jsop.tag('^').key(buildPath(before.getName())).value(null);
+    }
+
+    @Override
+    public void childNodeAdded(String name, NodeState after) {
+        jsop.tag('+').key(buildPath(name));
+        toJson(after, jsop);
+    }
+
+    @Override
+    public void childNodeDeleted(String name, NodeState before) {
+        jsop.tag('-').value(buildPath(name));
+    }
+
+    @Override
+    public void childNodeChanged(String name, NodeState before, NodeState after) {
+        after.compareAgainstBaseState(
+                before, new JsopDiff(jsop, PathUtils.concat(path, name)));
+    }
+
+    //------------------------------------------------------------< Object >--
+
+    public String toString() {
+        return jsop.toString();
+    }
+
+    //-----------------------------------------------------------< private >--
+
+    private String buildPath(String name) {
+        return PathUtils.concat(path, name);
+    }
+
+    private void toJson(NodeState nodeState, JsopBuilder jsop) {
+        jsop.object();
+        for (PropertyState property : nodeState.getProperties()) {
+            jsop.key(property.getName());
+            toJson(property, jsop);
+        }
+        for (ChildNodeEntry child : nodeState.getChildNodeEntries()) {
+            jsop.key(child.getName());
+            toJson(child.getNodeState(), jsop);
+        }
+        jsop.endObject();
+    }
+
+    private void toJson(PropertyState propertyState, JsopBuilder jsop) {
+        if (propertyState.isArray()) {
+            jsop.array();
+            for (CoreValue value : propertyState.getValues()) {
+                toJson(value, jsop);
+            }
+            jsop.endArray();
+        } else {
+            toJson(propertyState.getValue(), jsop);
+        }
+    }
+
+    private void toJson(CoreValue value, JsopBuilder jsop) {
+        int type = value.getType();
+        if (type == PropertyType.BOOLEAN) {
+            jsop.value(value.getBoolean());
+        } else if (type == PropertyType.LONG) {
+            jsop.value(value.getLong());
+        } else {
+            String string = value.getString();
+            if (type != PropertyType.STRING
+                    || CoreValueMapper.startsWithHint(string)) {
+                string = TYPE2HINT.get(type) + ':' + string;
+            }
+            jsop.value(string);
+        }
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/JsopDiff.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java?rev=1365522&r1=1365521&r2=1365522&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java Wed Jul 25 11:23:27 2012
@@ -20,6 +20,7 @@ import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.mk.api.MicroKernel;
 import org.apache.jackrabbit.oak.api.CoreValueFactory;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStateBuilder;
 import org.apache.jackrabbit.oak.spi.commit.CommitEditor;
 import org.apache.jackrabbit.oak.spi.commit.EmptyEditor;
 import org.apache.jackrabbit.oak.spi.commit.EmptyObserver;
@@ -102,7 +103,13 @@ public class KernelNodeStore implements 
 
     @Override
     public NodeStateBuilder getBuilder(NodeState base) {
-        return new KernelRootStateBuilder(base);
+        if (base instanceof KernelNodeState) {
+            KernelNodeState kbase = (KernelNodeState) base;
+            if ("/".equals(kbase.getPath())) {
+                return new KernelRootStateBuilder(kernel, kbase.getRevision());
+            }
+        }
+        return new MemoryNodeStateBuilder(base);
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreBranch.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreBranch.java?rev=1365522&r1=1365521&r2=1365522&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreBranch.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreBranch.java Wed Jul 25 11:23:27 2012
@@ -16,25 +16,17 @@
  */
 package org.apache.jackrabbit.oak.kernel;
 
-import javax.jcr.PropertyType;
 
 import org.apache.jackrabbit.mk.api.MicroKernel;
 import org.apache.jackrabbit.mk.api.MicroKernelException;
-import org.apache.jackrabbit.mk.json.JsopBuilder;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
-import org.apache.jackrabbit.oak.api.CoreValue;
-import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.spi.commit.CommitEditor;
-import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
 
 import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
 import static org.apache.jackrabbit.oak.commons.PathUtils.getName;
 import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
-import static org.apache.jackrabbit.oak.kernel.CoreValueMapper.TYPE2HINT;
 
 /**
  * {@code NodeStoreBranch} based on {@link MicroKernel} branching and merging.
@@ -82,7 +74,9 @@ class KernelNodeStoreBranch implements N
     public void setRoot(NodeState newRoot) {
         if (!currentRoot.equals(newRoot)) {
             currentRoot = newRoot;
-            commit(buildJsop());
+            JsopDiff diff = new JsopDiff();
+            currentRoot.compareAgainstBaseState(committed, diff);
+            commit(diff.toString());
         }
     }
 
@@ -169,93 +163,4 @@ class KernelNodeStoreBranch implements N
         committed = currentRoot;
     }
 
-    private String buildJsop() {
-        JsopBuilder jsop = new JsopBuilder();
-        diffToJsop(committed, currentRoot, "", jsop);
-        return jsop.toString();
-    }
-
-    private static void diffToJsop(NodeState before, NodeState after, final String path,
-            final JsopBuilder jsop) {
-        after.compareAgainstBaseState(before, new NodeStateDiff() {
-            @Override
-            public void propertyAdded(PropertyState after) {
-                jsop.tag('^').key(buildPath(after.getName()));
-                toJson(after, jsop);
-            }
-
-            @Override
-            public void propertyChanged(PropertyState before, PropertyState after) {
-                jsop.tag('^').key(buildPath(after.getName()));
-                toJson(after, jsop);
-            }
-
-            @Override
-            public void propertyDeleted(PropertyState before) {
-                jsop.tag('^').key(buildPath(before.getName())).value(null);
-            }
-
-            @Override
-            public void childNodeAdded(String name, NodeState after) {
-                jsop.tag('+').key(buildPath(name));
-                toJson(after, jsop);
-            }
-
-            @Override
-            public void childNodeDeleted(String name, NodeState before) {
-                jsop.tag('-').value(buildPath(name));
-            }
-
-            @Override
-            public void childNodeChanged(String name, NodeState before, NodeState after) {
-                diffToJsop(before, after, PathUtils.concat(path, name), jsop);
-            }
-
-            private String buildPath(String name) {
-                return PathUtils.concat(path, name);
-            }
-
-            private void toJson(NodeState nodeState, JsopBuilder jsop) {
-                jsop.object();
-                for (PropertyState property : nodeState.getProperties()) {
-                    jsop.key(property.getName());
-                    toJson(property, jsop);
-                }
-                for (ChildNodeEntry child : nodeState.getChildNodeEntries()) {
-                    jsop.key(child.getName());
-                    toJson(child.getNodeState(), jsop);
-                }
-                jsop.endObject();
-            }
-
-            private void toJson(PropertyState propertyState, JsopBuilder jsop) {
-                if (propertyState.isArray()) {
-                    jsop.array();
-                    for (CoreValue value : propertyState.getValues()) {
-                        toJson(value, jsop);
-                    }
-                    jsop.endArray();
-                } else {
-                    toJson(propertyState.getValue(), jsop);
-                }
-            }
-
-            private void toJson(CoreValue value, JsopBuilder jsop) {
-                int type = value.getType();
-                if (type == PropertyType.BOOLEAN) {
-                    jsop.value(value.getBoolean());
-                } else if (type == PropertyType.LONG) {
-                    jsop.value(value.getLong());
-                } else {
-                    String string = value.getString();
-                    if (type != PropertyType.STRING
-                            || CoreValueMapper.startsWithHint(string)) {
-                        string = TYPE2HINT.get(type) + ':' + string;
-                    }
-                    jsop.value(string);
-                }
-            }
-
-        });
-    }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelRootStateBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelRootStateBuilder.java?rev=1365522&r1=1365521&r2=1365522&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelRootStateBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelRootStateBuilder.java Wed Jul 25 11:23:27 2012
@@ -16,15 +16,31 @@
  */
 package org.apache.jackrabbit.oak.kernel;
 
+import org.apache.jackrabbit.mk.api.MicroKernel;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStateBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 class KernelRootStateBuilder extends MemoryNodeStateBuilder {
 
+    /**
+     * Number of content updates that need to happen before the updates
+     * are automatically committed to a branch in the MicroKernel.
+     */
+    private static final int UPDATE_LIMIT = 10000;
+
+    private final MicroKernel kernel;
+
+    private String baseRevision;
+
+    private String branchRevision;
+
     private int updates = 0;
 
-    public KernelRootStateBuilder(NodeState base) {
-        super(base);
+    public KernelRootStateBuilder(MicroKernel kernel, String revision) {
+        super(new KernelNodeState(kernel, "/", revision));
+        this.kernel = kernel;
+        this.baseRevision = revision;
+        this.branchRevision = null;
     }
 
     @Override
@@ -35,7 +51,13 @@ class KernelRootStateBuilder extends Mem
 
     @Override
     protected void updated() {
-        updates++;
+        if (updates++ > UPDATE_LIMIT) {
+            if (branchRevision == null) {
+                branchRevision = kernel.branch(baseRevision);
+            }
+
+            updates = 0;
+        }
     }
 
 }