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 mr...@apache.org on 2021/02/26 14:43:15 UTC

svn commit: r1886954 - in /jackrabbit/oak/trunk/oak-store-document/src: main/java/org/apache/jackrabbit/oak/plugins/document/ test/java/org/apache/jackrabbit/oak/plugins/document/

Author: mreutegg
Date: Fri Feb 26 14:43:14 2021
New Revision: 1886954

URL: http://svn.apache.org/viewvc?rev=1886954&view=rev
Log:
OAK-9158: Performance issue due to AbstractDocumentNodeState#equals

Patch provided by Alexander Lüders
Added test to reproduce the problem

Modified:
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/AbstractDocumentNodeState.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/ModifiedDocumentNodeState.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/AbstractDocumentNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/AbstractDocumentNodeState.java?rev=1886954&r1=1886953&r2=1886954&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/AbstractDocumentNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/AbstractDocumentNodeState.java Fri Feb 26 14:43:14 2021
@@ -83,7 +83,11 @@ public abstract class AbstractDocumentNo
             // revision does not match: might still be equals
         } else if (that instanceof ModifiedNodeState) {
             ModifiedNodeState modified = (ModifiedNodeState) that;
-            if (modified.getBaseState() == this) {
+            NodeState baseState = modified.getBaseState();
+            if (baseState instanceof ModifiedDocumentNodeState) {
+                baseState = ((ModifiedDocumentNodeState) baseState).getBaseState();
+            }
+            if (baseState == this) {
                 return EqualsDiff.equals(this, modified);
             }
         }

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/ModifiedDocumentNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/ModifiedDocumentNodeState.java?rev=1886954&r1=1886953&r2=1886954&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/ModifiedDocumentNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/ModifiedDocumentNodeState.java Fri Feb 26 14:43:14 2021
@@ -142,6 +142,10 @@ class ModifiedDocumentNodeState extends
         return super.compareAgainstBaseState(base, diff);
     }
 
+    NodeState getBaseState() {
+        return base;
+    }
+
     private boolean revisionEquals(AbstractDocumentNodeState a,
                                    AbstractDocumentNodeState b) {
         RevisionVector rv1 = a.getLastRevision();

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java?rev=1886954&r1=1886953&r2=1886954&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreTest.java Fri Feb 26 14:43:14 2021
@@ -35,8 +35,10 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.document.util.Utils.isCommitted;
 import static org.hamcrest.CoreMatchers.everyItem;
 import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.lessThan;
 import static org.hamcrest.Matchers.lessThanOrEqualTo;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -44,7 +46,6 @@ import static org.junit.Assert.assertNot
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -789,7 +790,7 @@ public class DocumentNodeStoreTest {
         assertNotNull(afterRootDoc);
         Revision afterLastRev = afterRootDoc.getLastRev().get(clusterId);
 
-        assertThat("lastRev must be greater or equal '" + Utils.timestampToString(timeBeforeStartup) + "', but was '" 
+        assertThat("lastRev must be greater or equal '" + Utils.timestampToString(timeBeforeStartup) + "', but was '"
             + Utils.timestampToString(afterLastRev.getTimestamp()) + "'", afterLastRev.getTimestamp(), 
             OrderingComparison.greaterThanOrEqualTo(timeBeforeStartup));
         assertNotEquals("Last revision should be updated after 1 minute even if background thread is not running",
@@ -4092,6 +4093,35 @@ public class DocumentNodeStoreTest {
     }
     // End of tests for OAK-9300
 
+    @Test // OAK-9158
+    public void manyNodesBelowRoot() throws Exception {
+        CountingDocumentStore store = new CountingDocumentStore(new MemoryDocumentStore());
+        DocumentNodeStore ns = builderProvider.newBuilder()
+                .setBundlingDisabled(true)
+                .setDocumentStore(store).setAsyncDelay(0)
+                .getNodeStore();
+        NodeBuilder builder = ns.getRoot().builder();
+        for (int i = 0; i < 250; i++) {
+            builder.child("node-" + i);
+        }
+        merge(ns, builder);
+        ns.dispose();
+        store.resetCounters();
+
+        ns = builderProvider.newBuilder()
+                .setBundlingDisabled(true)
+                .setDocumentStore(store).setAsyncDelay(0).setUpdateLimit(5)
+                .getNodeStore();
+
+        builder = ns.getRoot().builder();
+        for (int i = 0; i < 10; i++) {
+            builder.child("foo").setProperty("p", i);
+        }
+        merge(ns, builder);
+        assertThat(store.getNumFindCalls(NODES), lessThan(10));
+        assertEquals(0, store.getNumQueryCalls(NODES));
+    }
+
     private void getChildNodeCountTest(int numChildren,
                                        Iterable<Long> maxValues,
                                        Iterable<Long> expectedValues)