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 ch...@apache.org on 2017/07/18 12:42:20 UTC

svn commit: r1802288 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ oak-core/src/main/java/org/apache/jackrabbit/oak...

Author: chetanm
Date: Tue Jul 18 12:42:20 2017
New Revision: 1802288

URL: http://svn.apache.org/viewvc?rev=1802288&view=rev
Log:
OAK-6463 - Property index update fails in composite NodeStore setup

Use a lazy approach to create NodeBuilder for index data nodes

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/FilteringIndexStoreStrategy.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/IndexStoreStrategy.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/UniqueEntryStoreStrategy.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditor.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java
    jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java?rev=1802288&r1=1802287&r2=1802288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexEditor.java Tue Jul 18 12:42:20 2017
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.property;
 
+import static com.google.common.base.Suppliers.memoize;
 import static com.google.common.collect.Sets.newHashSet;
 import static java.util.Collections.singleton;
 import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
@@ -35,6 +36,7 @@ import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.jcr.PropertyType;
 
+import com.google.common.base.Supplier;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
@@ -288,8 +290,7 @@ class PropertyIndexEditor implements Ind
                 String properties = definition.getString(PROPERTY_NAMES);
                 boolean uniqueIndex = keysToCheckForUniqueness != null;
                 for (IndexStoreStrategy strategy : getStrategies(uniqueIndex)) {
-                    NodeBuilder index = definition.child(strategy
-                            .getIndexNodeName());
+                    Supplier<NodeBuilder> index = memoize(() -> definition.child(strategy.getIndexNodeName()));
                     if (uniqueIndex) {
                         keysToCheckForUniqueness.addAll(getExistingKeys(
                                 afterKeys, index, strategy));
@@ -334,7 +335,7 @@ class PropertyIndexEditor implements Ind
      * @param s the index store strategy
      * @return the set of keys that already exist in this unique index
      */
-    private Set<String> getExistingKeys(Set<String> keys, NodeBuilder index, IndexStoreStrategy s) {
+    private Set<String> getExistingKeys(Set<String> keys, Supplier<NodeBuilder> index, IndexStoreStrategy s) {
         Set<String> existing = null;
         for (String key : keys) {
             if (s.exists(index, key)) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java?rev=1802288&r1=1802287&r2=1802288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategy.java Tue Jul 18 12:42:20 2017
@@ -28,6 +28,7 @@ import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import com.google.common.base.Supplier;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
@@ -92,15 +93,15 @@ public class ContentMirrorStoreStrategy
 
     @Override
     public void update(
-            NodeBuilder index, String path,
+            Supplier<NodeBuilder> index, String path,
             @Nullable final String indexName,
             @Nullable final NodeBuilder indexMeta,
             Set<String> beforeKeys, Set<String> afterKeys) {
         for (String key : beforeKeys) {
-            remove(index, key, path);
+            remove(index.get(), key, path);
         }
         for (String key : afterKeys) {
-            insert(index, key, path);
+            insert(index.get(), key, path);
         }
     }
 
@@ -592,7 +593,7 @@ public class ContentMirrorStoreStrategy
     }
 
     @Override
-    public boolean exists(NodeBuilder index, String key) {
+    public boolean exists(Supplier<NodeBuilder> index, String key) {
         // This is currently not implemented, because there is no test case for it,
         // and because there is currently no need for this method with this class.
         // We would need to traverse the tree and search for an entry "match".

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/FilteringIndexStoreStrategy.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/FilteringIndexStoreStrategy.java?rev=1802288&r1=1802287&r2=1802288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/FilteringIndexStoreStrategy.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/FilteringIndexStoreStrategy.java Tue Jul 18 12:42:20 2017
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.util.Set;
 
+import com.google.common.base.Supplier;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.spi.query.Filter;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -50,8 +51,8 @@ public class FilteringIndexStoreStrategy
     }
 
     @Override
-    public void update(NodeBuilder index, String path, String indexName,
-            NodeBuilder indexMeta, Set<String> beforeKeys, Set<String> afterKeys)
+    public void update(Supplier<NodeBuilder> index, String path, String indexName,
+                       NodeBuilder indexMeta, Set<String> beforeKeys, Set<String> afterKeys)
             throws CommitFailedException {
         if (filter.apply(path)) {
             if (readOnly) {
@@ -66,7 +67,7 @@ public class FilteringIndexStoreStrategy
     }
 
     @Override
-    public boolean exists(NodeBuilder index, String key) {
+    public boolean exists(Supplier<NodeBuilder> index, String key) {
         return strategy.exists(index, key);
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/IndexStoreStrategy.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/IndexStoreStrategy.java?rev=1802288&r1=1802287&r2=1802288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/IndexStoreStrategy.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/IndexStoreStrategy.java Tue Jul 18 12:42:20 2017
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.util.Set;
 
+import com.google.common.base.Supplier;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.spi.query.Filter;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -32,7 +33,7 @@ public interface IndexStoreStrategy {
     /**
      * Updates the index for the given path.
      * 
-     * @param index the index node
+     * @param index the index node supplier
      * @param path path stored in the index
      * @param indexName the name of the index. May be null.
      * @param indexMeta the definition of the index. May be null.
@@ -40,18 +41,18 @@ public interface IndexStoreStrategy {
      * @param afterKeys keys that now do apply to the path
      */
     void update(
-        NodeBuilder index, String path,
-        String indexName, NodeBuilder indexMeta,
-        Set<String> beforeKeys, Set<String> afterKeys) throws CommitFailedException;
+            Supplier<NodeBuilder> index, String path,
+            String indexName, NodeBuilder indexMeta,
+            Set<String> beforeKeys, Set<String> afterKeys) throws CommitFailedException;
 
     /**
      * Check whether an entry for the given key exists.
      * 
-     * @param index the index
+     * @param index the index node supplier
      * @param key the key
      * @return true if at least one entry exists
      */
-    boolean exists(NodeBuilder index, String key);
+    boolean exists(Supplier<NodeBuilder> index, String key);
 
     /**
      * Search for a given set of values.

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/UniqueEntryStoreStrategy.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/UniqueEntryStoreStrategy.java?rev=1802288&r1=1802287&r2=1802288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/UniqueEntryStoreStrategy.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/UniqueEntryStoreStrategy.java Tue Jul 18 12:42:20 2017
@@ -25,6 +25,7 @@ import java.util.Set;
 
 import javax.annotation.Nullable;
 
+import com.google.common.base.Supplier;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.memory.MultiStringPropertyState;
@@ -59,15 +60,15 @@ public class UniqueEntryStoreStrategy im
 
     @Override
     public void update(
-            NodeBuilder index, String path,
+            Supplier<NodeBuilder> index, String path,
             @Nullable final String indexName,
             @Nullable final NodeBuilder indexMeta,
             Set<String> beforeKeys, Set<String> afterKeys) {
         for (String key : beforeKeys) {
-            remove(index, key, path);
+            remove(index.get(), key, path);
         }
         for (String key : afterKeys) {
-            insert(index, key, path);
+            insert(index.get(), key, path);
         }
     }
 
@@ -161,8 +162,8 @@ public class UniqueEntryStoreStrategy im
     }
 
     @Override
-    public boolean exists(NodeBuilder index, String key) {
-        return index.hasChildNode(key);
+    public boolean exists(Supplier<NodeBuilder> index, String key) {
+        return index.get().hasChildNode(key);
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditor.java?rev=1802288&r1=1802287&r2=1802288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceEditor.java Tue Jul 18 12:42:20 2017
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.reference;
 
+import static com.google.common.base.Suppliers.memoize;
 import static com.google.common.collect.ImmutableSet.of;
 import static com.google.common.collect.Maps.newHashMap;
 import static com.google.common.collect.Sets.newHashSet;
@@ -37,6 +38,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
+import com.google.common.base.Supplier;
 import com.google.common.collect.Sets;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
@@ -309,12 +311,12 @@ class ReferenceEditor extends DefaultEdi
         for (IndexStoreStrategy store : refStores) {
             Set<String> empty = of();
             for (String p : rm) {
-                NodeBuilder index = definition.child(store.getIndexNodeName());
+                Supplier<NodeBuilder> index = memoize(() -> definition.child(store.getIndexNodeName()));
                 store.update(index, p, name, definition, of(key), empty);
             }
             for (String p : add) {
                 // TODO do we still need to encode the values?
-                NodeBuilder index = definition.child(store.getIndexNodeName());
+                Supplier<NodeBuilder> index = memoize(() -> definition.child(store.getIndexNodeName()));
                 store.update(index, p, name, definition, empty, of(key));
             }
         }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java?rev=1802288&r1=1802287&r2=1802288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java Tue Jul 18 12:42:20 2017
@@ -962,7 +962,6 @@ public class PropertyIndexTest {
 
     }
 
-    @Ignore("OAK-6463")
     @Test
     public void mountWithCommitInWritableMount() throws Exception{
         NodeState root = INITIAL_CONTENT;

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java?rev=1802288&r1=1802287&r2=1802288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/strategy/ContentMirrorStoreStrategyTest.java Tue Jul 18 12:42:20 2017
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.property.strategy;
 
+import static com.google.common.base.Suppliers.memoize;
 import static com.google.common.collect.Sets.newHashSet;
 import static java.util.Arrays.asList;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.ENTRY_COUNT_PROPERTY_NAME;
@@ -29,6 +30,7 @@ import static org.apache.jackrabbit.oak.
 import java.util.Collections;
 import java.util.Set;
 
+import com.google.common.base.Supplier;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
@@ -67,35 +69,36 @@ public class ContentMirrorStoreStrategyT
         IndexStoreStrategy store = new ContentMirrorStoreStrategy();
 
         NodeState root = EMPTY_NODE;
-        NodeBuilder index = root.builder();
+        NodeBuilder builder = root.builder();
+        Supplier<NodeBuilder> index = () -> builder;
 
         for (String path : asList("/", "a/b/c", "a/b/d", "b", "d/e", "d/e/f")) {
             store.update(index, path, null, null, EMPTY, KEY);
         }
-        checkPath(index, "key", "", true);
-        checkPath(index, "key", "a/b/c", true);
-        checkPath(index, "key", "a/b/d", true);
-        checkPath(index, "key", "b", true);
-        checkPath(index, "key", "d/e", true);
-        checkPath(index, "key", "d/e/f", true);
+        checkPath(builder, "key", "", true);
+        checkPath(builder, "key", "a/b/c", true);
+        checkPath(builder, "key", "a/b/d", true);
+        checkPath(builder, "key", "b", true);
+        checkPath(builder, "key", "d/e", true);
+        checkPath(builder, "key", "d/e/f", true);
 
         // remove the root key, removes just the "match" property, when the
         // index is not empty
         store.update(index, "/", null, null, KEY, EMPTY);
-        checkPath(index, "key", "d/e/f", true);
+        checkPath(builder, "key", "d/e/f", true);
 
         // removing intermediary path doesn't remove the entire subtree
         store.update(index, "d/e", null, null, KEY, EMPTY);
-        checkPath(index, "key", "d/e/f", true);
+        checkPath(builder, "key", "d/e/f", true);
 
         // removing intermediary path doesn't remove the entire subtree
         store.update(index, "d/e/f", null, null, KEY, EMPTY);
-        checkNotPath(index, "key", "d");
+        checkNotPath(builder, "key", "d");
 
         // brother segment removed
         store.update(index, "a/b/d", null, null, KEY, EMPTY);
         store.update(index, "a/b", null, null, KEY, EMPTY);
-        checkPath(index, "key", "a/b/c", true);
+        checkPath(builder, "key", "a/b/c", true);
 
         // reinsert root and remove everything else
         store.update(index, "", null, null, EMPTY, KEY);
@@ -105,7 +108,7 @@ public class ContentMirrorStoreStrategyT
 
         // remove the root key when the index is empty
         store.update(index, "", null, null, KEY, EMPTY);
-        Assert.assertEquals(0, index.getChildNodeCount(1));
+        Assert.assertEquals(0, builder.getChildNodeCount(1));
     }
 
     private static void checkPath(NodeBuilder node, String key, String path,
@@ -140,7 +143,7 @@ public class ContentMirrorStoreStrategyT
         IndexStoreStrategy store = new ContentMirrorStoreStrategy();
         NodeState root = EMPTY_NODE;
         NodeBuilder indexMeta = root.builder();
-        NodeBuilder index = indexMeta.child(INDEX_CONTENT_NODE_NAME);
+        Supplier<NodeBuilder> index = memoize(() -> indexMeta.child(INDEX_CONTENT_NODE_NAME));
         store.update(index, "a", null, null, EMPTY, KEY);
         store.update(index, "b", null, null, EMPTY, KEY);
         Assert.assertTrue(

Modified: jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java?rev=1802288&r1=1802287&r2=1802288&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java Tue Jul 18 12:42:20 2017
@@ -796,7 +796,6 @@ public class CompositeNodeStoreTest {
         assertEquals("global", rootBuilder.getChildNode("new").getString("store"));
     }
 
-    @Ignore("OAK-6463")
     @Test
     public void propertyIndex() throws Exception{
         NodeBuilder globalBuilder = globalStore.getRoot().builder();