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();