Author: chetanm
Date: Wed Sep 6 09:03:27 2017
New Revision: 1807452
URL: http://svn.apache.org/viewvc?rev=1807452&view=rev
Log:
OAK-6353 - Use Document order traversal for reindexing performed on
DocumentNodeStore setups
Complete the support for adding new index definition
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexerSupport.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexer.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/LuceneIndexerProvider.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/NodeStateIndexerProvider.java
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexerSupport.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexerSupport.java?rev=1807452&r1=1807451&r2=1807452&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexerSupport.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexerSupport.java
Wed Sep 6 09:03:27 2017
@@ -27,9 +27,14 @@ import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.apache.felix.inventory.Format;
import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
+import org.apache.jackrabbit.oak.plugins.index.importer.AsyncLaneSwitcher;
import org.apache.jackrabbit.oak.plugins.index.importer.IndexDefinitionUpdater;
import org.apache.jackrabbit.oak.plugins.index.importer.IndexerInfo;
import
org.apache.jackrabbit.oak.plugins.index.inventory.IndexDefinitionPrinter;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
@@ -37,6 +42,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
public class IndexerSupport {
private final Logger log = LoggerFactory.getLogger(getClass());
@@ -50,6 +56,11 @@ public class IndexerSupport {
* This would be mostly used for testing purpose
*/
private static final String HEAD_AS_CHECKPOINT = "head";
+
+ /**
+ * Index lane name which is used for indexing
+ */
+ private static final String REINDEX_LANE = "offline-reindex-async";
private Map<String, String> checkpointInfo = Collections.emptyMap();
private final IndexHelper indexHelper;
private File localIndexDir;
@@ -92,13 +103,13 @@ public class IndexerSupport {
return checkpointedState;
}
- public void updateIndexDefinitions(NodeBuilder rootBuilder) throws
IOException, CommitFailedException {
+ private void updateIndexDefinitions(NodeBuilder rootBuilder) throws
IOException, CommitFailedException {
if (indexDefinitions != null) {
new IndexDefinitionUpdater(indexDefinitions).apply(rootBuilder);
}
}
- public void dumpIndexDefinitions(NodeStore nodeStore) throws IOException,
CommitFailedException {
+ private void dumpIndexDefinitions(NodeStore nodeStore) throws IOException,
CommitFailedException {
IndexDefinitionPrinter printer = new IndexDefinitionPrinter(nodeStore,
indexHelper.getIndexPathService());
printer.setFilter("{\"properties\":[\"*\",
\"-:childOrder\"],\"nodes\":[\"*\", \"-:index-definition\"]}");
PrinterDumper dumper = new PrinterDumper(getLocalIndexDir(),
IndexDefinitionUpdater.INDEX_DEFINITIONS_JSON,
@@ -106,6 +117,42 @@ public class IndexerSupport {
dumper.dump();
}
+ public void switchIndexLanesAndReindexFlag(NodeStore copyOnWriteStore)
throws CommitFailedException, IOException {
+ NodeState root = copyOnWriteStore.getRoot();
+ NodeBuilder builder = root.builder();
+ updateIndexDefinitions(builder);
+
+ for (String indexPath : indexHelper.getIndexPaths()) {
+ //TODO Do it only for lucene indexes for now
+ NodeBuilder idxBuilder = childBuilder(builder, indexPath, false);
+ checkState(idxBuilder.exists(), "No index definition found at path
[%s]", indexPath);
+
+ idxBuilder.setProperty(IndexConstants.REINDEX_PROPERTY_NAME, true);
+ AsyncLaneSwitcher.switchLane(idxBuilder, REINDEX_LANE);
+ }
+
+ copyOnWriteStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ log.info("Switched the async lane for indexes at {} to {} and marked
them for reindex", indexHelper.getIndexPaths(), REINDEX_LANE);
+ }
+
+ public void postIndexWork(NodeStore copyOnWriteStore) throws
CommitFailedException, IOException {
+ switchIndexLanesBack(copyOnWriteStore);
+ dumpIndexDefinitions(copyOnWriteStore);
+ }
+
+ private void switchIndexLanesBack(NodeStore copyOnWriteStore) throws
CommitFailedException, IOException {
+ NodeState root = copyOnWriteStore.getRoot();
+ NodeBuilder builder = root.builder();
+
+ for (String indexPath : indexHelper.getIndexPaths()) {
+ NodeBuilder idxBuilder = childBuilder(builder, indexPath, false);
+ AsyncLaneSwitcher.revertSwitch(idxBuilder, indexPath);
+ }
+
+ copyOnWriteStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ log.info("Switched the async lane for indexes at {} back to there
original lanes", indexHelper.getIndexPaths());
+ }
+
public Map<String, String> getCheckpointInfo() {
return checkpointInfo;
}
@@ -113,4 +160,11 @@ public class IndexerSupport {
public void setIndexDefinitions(File indexDefinitions) {
this.indexDefinitions = indexDefinitions;
}
+
+ public static NodeBuilder childBuilder(NodeBuilder nb, String path,
boolean createNew) {
+ for (String name : PathUtils.elements(checkNotNull(path))) {
+ nb = createNew ? nb.child(name) : nb.getChildNode(name);
+ }
+ return nb;
+ }
}
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java?rev=1807452&r1=1807451&r2=1807452&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java
Wed Sep 6 09:03:27 2017
@@ -89,10 +89,9 @@ public class OutOfBandIndexer implements
NodeState baseState = copyOnWriteStore.getRoot();
//TODO Check for indexPaths being empty
- switchIndexLanesAndReindexFlag();
+ indexerSupport.switchIndexLanesAndReindexFlag(copyOnWriteStore);
preformIndexUpdate(baseState);
- switchIndexLanesBack();
- indexerSupport.dumpIndexDefinitions(copyOnWriteStore);
+ indexerSupport.postIndexWork(copyOnWriteStore);
}
private File getLocalIndexDir() throws IOException {
@@ -163,37 +162,6 @@ public class OutOfBandIndexer implements
return luceneIndexHelper.createEditorProvider();
}
- private void switchIndexLanesAndReindexFlag() throws
CommitFailedException, IOException {
- NodeState root = copyOnWriteStore.getRoot();
- NodeBuilder builder = root.builder();
- indexerSupport.updateIndexDefinitions(builder);
-
- for (String indexPath : indexHelper.getIndexPaths()) {
- //TODO Do it only for lucene indexes for now
- NodeBuilder idxBuilder = childBuilder(builder, indexPath, false);
- checkState(idxBuilder.exists(), "No index definition found at path
[%s]", indexPath);
-
- idxBuilder.setProperty(IndexConstants.REINDEX_PROPERTY_NAME, true);
- AsyncLaneSwitcher.switchLane(idxBuilder, REINDEX_LANE);
- }
-
- copyOnWriteStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
- log.info("Switched the async lane for indexes at {} to {} and marked
them for reindex", indexHelper.getIndexPaths(), REINDEX_LANE);
- }
-
- private void switchIndexLanesBack() throws CommitFailedException,
IOException {
- NodeState root = copyOnWriteStore.getRoot();
- NodeBuilder builder = root.builder();
-
- for (String indexPath : indexHelper.getIndexPaths()) {
- NodeBuilder idxBuilder = childBuilder(builder, indexPath, false);
- AsyncLaneSwitcher.revertSwitch(idxBuilder, indexPath);
- }
-
- copyOnWriteStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
- log.info("Switched the async lane for indexes at {} back to there
original lanes", indexHelper.getIndexPaths());
- }
-
private void configureEstimators(IndexUpdate indexUpdate) {
StatisticsProvider statsProvider = indexHelper.getStatisticsProvider();
if (statsProvider instanceof MetricStatisticsProvider) {
@@ -205,10 +173,4 @@ public class OutOfBandIndexer implements
indexUpdate.setNodeCountEstimator(estimator);
}
- private static NodeBuilder childBuilder(NodeBuilder nb, String path,
boolean createNew) {
- for (String name : PathUtils.elements(checkNotNull(path))) {
- nb = createNew ? nb.child(name) : nb.getChildNode(name);
- }
- return nb;
- }
}
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexer.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexer.java?rev=1807452&r1=1807451&r2=1807452&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexer.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexer.java
Wed Sep 6 09:03:27 2017
@@ -45,9 +45,14 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.index.NodeTraversalCallback;
import
org.apache.jackrabbit.oak.plugins.index.progress.IndexingProgressReporter;
import org.apache.jackrabbit.oak.plugins.index.progress.MetricRateEstimator;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
import org.apache.jackrabbit.oak.plugins.metric.MetricStatisticsProvider;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStateUtils;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
import org.apache.jackrabbit.oak.stats.StatisticsProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -73,8 +78,13 @@ public class DocumentStoreIndexer implem
public void reindex() throws CommitFailedException, IOException {
configureEstimators();
- //TODO Support for adding new index definition
- CompositeIndexer indexer = prepareIndexers();
+
+ NodeState checkpointedState =
indexerSupport.retrieveNodeStateForCheckpoint();
+ NodeStore copyOnWriteStore = new MemoryNodeStore(checkpointedState);
+ indexerSupport.switchIndexLanesAndReindexFlag(copyOnWriteStore);
+
+ NodeBuilder builder = copyOnWriteStore.getRoot().builder();
+ CompositeIndexer indexer = prepareIndexers(copyOnWriteStore, builder);
if (indexer.isEmpty()) {
return;
}
@@ -82,7 +92,6 @@ public class DocumentStoreIndexer implem
closer.register(indexer);
//TODO How to ensure we can safely read from secondary
- NodeState checkpointedState =
indexerSupport.retrieveNodeStateForCheckpoint();
DocumentNodeState rootDocumentState = (DocumentNodeState)
checkpointedState;
DocumentNodeStore nodeStore = (DocumentNodeStore)
indexHelper.getNodeStore();
@@ -107,6 +116,10 @@ public class DocumentStoreIndexer implem
progressReporter.reindexingTraversalEnd();
progressReporter.logReport();
+
+ copyOnWriteStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+
+ indexerSupport.postIndexWork(copyOnWriteStore);
}
private void configureEstimators() {
@@ -182,18 +195,19 @@ public class DocumentStoreIndexer implem
traversalLog.trace(id);
}
- protected CompositeIndexer prepareIndexers() {
- NodeState root = indexHelper.getNodeStore().getRoot();
+ protected CompositeIndexer prepareIndexers(NodeStore copyOnWriteStore,
NodeBuilder builder) {
+ NodeState root = copyOnWriteStore.getRoot();
List<NodeStateIndexer> indexers = new ArrayList<>();
for (String indexPath : indexHelper.getIndexPaths()) {
NodeState indexState = NodeStateUtils.getNode(root, indexPath);
+ NodeBuilder idxBuilder = IndexerSupport.childBuilder(builder,
indexPath, false);
String type = indexState.getString(TYPE_PROPERTY_NAME);
if (type == null) {
log.warn("No 'type' property found on indexPath [{}]. Skipping
it", indexPath);
continue;
}
for (NodeStateIndexerProvider indexerProvider : indexerProviders) {
- NodeStateIndexer indexer = indexerProvider.getIndexer(type,
indexPath, indexState, root, progressReporter);
+ NodeStateIndexer indexer = indexerProvider.getIndexer(type,
indexPath, idxBuilder, root, progressReporter);
if (indexer != null) {
indexers.add(indexer);
closer.register(indexer);
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/LuceneIndexerProvider.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/LuceneIndexerProvider.java?rev=1807452&r1=1807451&r2=1807452&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/LuceneIndexerProvider.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/LuceneIndexerProvider.java
Wed Sep 6 09:03:27 2017
@@ -57,21 +57,20 @@ public class LuceneIndexerProvider imple
@Override
public NodeStateIndexer getIndexer(@Nonnull String type, @Nonnull String
indexPath,
- @Nonnull NodeState definition, @Nonnull
NodeState root,
+ @Nonnull NodeBuilder definition,
@Nonnull NodeState root,
IndexingProgressReporter
progressReporter) {
if (!TYPE_LUCENE.equals(definition.getString(TYPE_PROPERTY_NAME))) {
return null;
}
- NodeBuilder builder = definition.builder();
- IndexDefinition idxDefinition = IndexDefinition.newBuilder(root,
definition, indexPath).reindex().build();
+ IndexDefinition idxDefinition = IndexDefinition.newBuilder(root,
definition.getNodeState(), indexPath).reindex().build();
- LuceneIndexWriter indexWriter =
indexWriterFactory.newInstance(idxDefinition, builder, true);
+ LuceneIndexWriter indexWriter =
indexWriterFactory.newInstance(idxDefinition, definition, true);
BinaryTextExtractor textExtractor = new BinaryTextExtractor(textCache,
idxDefinition, true);
return new LuceneIndexer(
idxDefinition,
indexWriter,
- builder,
+ definition,
textExtractor,
progressReporter
);
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/NodeStateIndexerProvider.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/NodeStateIndexerProvider.java?rev=1807452&r1=1807451&r2=1807452&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/NodeStateIndexerProvider.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/NodeStateIndexerProvider.java
Wed Sep 6 09:03:27 2017
@@ -25,6 +25,7 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import
org.apache.jackrabbit.oak.plugins.index.progress.IndexingProgressReporter;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
public interface NodeStateIndexerProvider extends Closeable {
@@ -32,6 +33,6 @@ public interface NodeStateIndexerProvide
@CheckForNull
NodeStateIndexer getIndexer(@Nonnull String type,
@Nonnull String indexPath,
- @Nonnull NodeState definition,
+ @Nonnull NodeBuilder definition,
@Nonnull NodeState root,
IndexingProgressReporter progressReporter);
}
Modified:
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java?rev=1807452&r1=1807451&r2=1807452&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java
Wed Sep 6 09:03:27 2017
@@ -46,10 +46,12 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.document.util.Utils;
import
org.apache.jackrabbit.oak.plugins.index.lucene.directory.IndexRootDirectory;
import org.apache.jackrabbit.oak.plugins.index.lucene.directory.LocalIndexDir;
+import
org.apache.jackrabbit.oak.plugins.index.lucene.util.IndexDefinitionBuilder;
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
import org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard;
import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
import org.apache.jackrabbit.oak.stats.StatisticsProvider;
@@ -61,7 +63,9 @@ import org.junit.Test;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyMap;
import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+import static
org.apache.jackrabbit.oak.plugins.document.TestUtils.childBuilder;
import static org.apache.jackrabbit.oak.plugins.document.TestUtils.createChild;
+import static org.apache.jackrabbit.oak.plugins.document.TestUtils.merge;
import static
org.apache.jackrabbit.oak.plugins.document.bundlor.BundlingConfigHandler.BUNDLOR;
import static
org.apache.jackrabbit.oak.plugins.document.bundlor.BundlingConfigHandler.DOCUMENT_NODE_STORE;
import static
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
@@ -129,7 +133,8 @@ public class DocumentStoreIndexerIT exte
wb.register(MongoDocumentStore.class, ds, emptyMap());
wb.register(StatisticsProvider.class, StatisticsProvider.NOOP,
emptyMap());
- configureBunding(store);
+ configureIndex(store);
+ configureBundling(store);
NodeBuilder builder = store.getRoot().builder();
NodeBuilder appNB = newNode("app:Asset");
@@ -152,13 +157,13 @@ public class DocumentStoreIndexerIT exte
String checkpoint = store.checkpoint(100000);
IndexHelper helper = new IndexHelper(store, store.getBlobStore(), wb,
temporaryFolder.newFolder(),
- temporaryFolder.newFolder(), asList("/oak:index/foo"));
+ temporaryFolder.newFolder(), asList(TEST_INDEX_PATH));
IndexerSupport support = new IndexerSupport(helper, checkpoint);
CollectingIndexer testIndexer = new CollectingIndexer(p ->
p.startsWith("/test"));
DocumentStoreIndexer index = new DocumentStoreIndexer(helper, support)
{
@Override
- protected CompositeIndexer prepareIndexers() {
+ protected CompositeIndexer prepareIndexers(NodeStore nodeStore,
NodeBuilder builder) {
return new CompositeIndexer(asList(testIndexer));
}
};
@@ -182,6 +187,17 @@ public class DocumentStoreIndexerIT exte
}
+ private void configureIndex(DocumentNodeStore store) throws
CommitFailedException {
+ NodeBuilder builder = store.getRoot().builder();
+ NodeBuilder idxb = childBuilder(builder, TEST_INDEX_PATH);
+
+ IndexDefinitionBuilder defnb = new IndexDefinitionBuilder(idxb);
+ defnb.indexRule("nt:base").property("foo").propertyIndex();
+ defnb.build();
+
+ merge(store, builder);
+ }
+
private DocumentNodeStore getNodeStore(){
return
builderProvider.newBuilder().setMongoDB(getConnection().getDB()).getNodeStore();
}
@@ -193,7 +209,7 @@ public class DocumentStoreIndexerIT exte
return conn;
}
- private static void configureBunding(DocumentNodeStore store) throws
CommitFailedException {
+ private static void configureBundling(DocumentNodeStore store) throws
CommitFailedException {
NodeState registryState = BundledTypesRegistry.builder()
.forType("app:Asset")
.include("jcr:content")