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 2013/07/18 14:14:36 UTC

svn commit: r1504448 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/memory/ main/java/org/apache/jackrabbit/oak/plugins/segment/ main/java/org/apache/jackrabbit/oak/spi/commit/ main/java/org/apache/jackrabbit/oak/s...

Author: jukka
Date: Thu Jul 18 12:14:36 2013
New Revision: 1504448

URL: http://svn.apache.org/r1504448
Log:
OAK-914: Relax the NodeStateDiff.childNodeChanged() semantics

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeState.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/FailingValidator.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/AbstractNodeState.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateDiff.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeState.java?rev=1504448&r1=1504447&r2=1504448&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeState.java Thu Jul 18 12:14:36 2013
@@ -157,7 +157,7 @@ class MemoryNodeState extends AbstractNo
                 if (!diff.childNodeDeleted(name, before)) {
                     return false;
                 }
-            } else if (!after.equals(before)) {
+            } else if (after != before) {
                 if (!diff.childNodeChanged(name, before, after)) {
                     return false;
                 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java?rev=1504448&r1=1504447&r2=1504448&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java Thu Jul 18 12:14:36 2013
@@ -370,7 +370,7 @@ public class ModifiedNodeState extends A
                 if (!diff.childNodeAdded(name, after)) {
                     return false;
                 }
-            } else if (!before.equals(after)
+            } else if (before != after // TODO: fastEquals?
                     && !diff.childNodeChanged(name, before, after)) {
                 return false;
             }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java?rev=1504448&r1=1504447&r2=1504448&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Template.java Thu Jul 18 12:14:36 2013
@@ -469,7 +469,7 @@ public class Template {
                 if (!diff.childNodeAdded(childName, afterNode)) {
                     return false;
                 }
-            } else if (!beforeNode.equals(afterNode)) {
+            } else if (!fastEquals(afterNode, beforeNode)) {
                 if (!diff.childNodeChanged(childName, beforeNode, afterNode)) {
                     return false;
                 }
@@ -502,7 +502,7 @@ public class Template {
                     NodeState beforeChild =
                             beforeTemplate.getChildNode(name, store, beforeId);
                     if (beforeChild.exists()) {
-                        if (!afterChild.equals(beforeChild)
+                        if (!fastEquals(afterChild, beforeChild)
                                 && !diff.childNodeChanged(
                                         childName, beforeChild, afterChild)) {
                             return false;
@@ -544,6 +544,18 @@ public class Template {
         return true;
     }
 
+    private boolean fastEquals(NodeState a, NodeState b) {
+        if (a == b) {
+            return true;
+        } else if (a instanceof SegmentNodeState
+                && b instanceof SegmentNodeState) {
+            return ((SegmentNodeState) a).getRecordId().equals(
+                    ((SegmentNodeState) b).getRecordId());
+        } else {
+            return false;
+        }
+    }
+
     private boolean compareProperties(
             PropertyState before, PropertyState after, NodeStateDiff diff) {
         if (before == null) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/FailingValidator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/FailingValidator.java?rev=1504448&r1=1504447&r2=1504448&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/FailingValidator.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/FailingValidator.java Thu Jul 18 12:14:36 2013
@@ -45,15 +45,11 @@ public class FailingValidator implements
     }
 
     @Override
-    public void enter(NodeState before, NodeState after)
-            throws CommitFailedException {
-        throw new CommitFailedException(type, code, message);
+    public void enter(NodeState before, NodeState after) {
     }
 
     @Override
-    public void leave(NodeState before, NodeState after)
-            throws CommitFailedException {
-        throw new CommitFailedException(type, code, message);
+    public void leave(NodeState before, NodeState after) {
     }
 
     @Override
@@ -82,9 +78,8 @@ public class FailingValidator implements
 
     @Override
     public Validator childNodeChanged(
-            String name, NodeState before, NodeState after)
-            throws CommitFailedException {
-        throw new CommitFailedException(type, code, message);
+            String name, NodeState before, NodeState after) {
+        return this; // the subtree might not have changed, so recurse
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/AbstractNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/AbstractNodeState.java?rev=1504448&r1=1504447&r2=1504448&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/AbstractNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/AbstractNodeState.java Thu Jul 18 12:14:36 2013
@@ -162,7 +162,7 @@ public abstract class AbstractNodeState 
                 }
             } else {
                 baseChildNodes.add(name);
-                if (!beforeChild.equals(afterChild)) {
+                if (afterChild != beforeChild) { // TODO: fastEquals?
                     if (!diff.childNodeChanged(name, beforeChild, afterChild)) {
                         return false;
                     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateDiff.java?rev=1504448&r1=1504447&r2=1504448&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateDiff.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateDiff.java Thu Jul 18 12:14:36 2013
@@ -80,7 +80,10 @@ public interface NodeStateDiff {
     boolean childNodeAdded(String name, NodeState after);
 
     /**
-     * Called for all changed child nodes.
+     * Called for all child nodes that may contain changes between the before
+     * and after states. The comparison implementation is expected to make an
+     * effort to avoid calling this method on child nodes under which nothing
+     * has changed.
      *
      * @param name name of the changed child node
      * @param before child node state before the change

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java?rev=1504448&r1=1504447&r2=1504448&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java Thu Jul 18 12:14:36 2013
@@ -41,7 +41,7 @@ public class CompareAgainstBaseStateTest
     private final NodeStateDiff diff =
             createControl().createMock("diff", NodeStateDiff.class);
 
-    private final NodeBuilder builder = EMPTY_NODE.builder();
+    private NodeBuilder builder = EMPTY_NODE.builder();
 
     @Before
     public void setUp() {
@@ -63,7 +63,7 @@ public class CompareAgainstBaseStateTest
     @Test
     public void testEqualState() {
         NodeState before = persist(builder);
-        NodeState after = persist(builder);
+        NodeState after = persist(before.builder());
 
         replay(diff);
 
@@ -74,6 +74,7 @@ public class CompareAgainstBaseStateTest
     @Test
     public void testPropertyAdded() {
         NodeState before = persist(builder);
+        builder = before.builder();
         builder.setProperty("test", "test");
         NodeState after = persist(builder);
 
@@ -87,6 +88,7 @@ public class CompareAgainstBaseStateTest
     @Test
     public void testPropertyChanged() {
         NodeState before = persist(builder);
+        builder = before.builder();
         builder.setProperty("foo", "test");
         NodeState after = persist(builder);
 
@@ -101,6 +103,7 @@ public class CompareAgainstBaseStateTest
     @Test
     public void testPropertyDeleted() {
         NodeState before = persist(builder);
+        builder = before.builder();
         builder.removeProperty("foo");
         NodeState after = persist(builder);
 
@@ -114,6 +117,7 @@ public class CompareAgainstBaseStateTest
     @Test
     public void testChildNodeAdded() {
         NodeState before = persist(builder);
+        builder = before.builder();
         builder.child("test");
         NodeState after = persist(builder);