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/10/22 06:16:05 UTC

svn commit: r1812868 - in /jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index: OutOfBandIndexer.java SegmentPropertyIndexEditorProvider.java

Author: chetanm
Date: Sun Oct 22 06:16:05 2017
New Revision: 1812868

URL: http://svn.apache.org/viewvc?rev=1812868&view=rev
Log:
OAK-6853 - Oak run tooling to store reindexed property index in segment store

Added:
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/SegmentPropertyIndexEditorProvider.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java

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=1812868&r1=1812867&r2=1812868&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 Sun Oct 22 06:16:05 2017
@@ -147,11 +147,19 @@ public class OutOfBandIndexer implements
 
     private IndexEditorProvider createIndexEditorProvider() throws IOException {
         IndexEditorProvider lucene = createLuceneEditorProvider();
-        IndexEditorProvider property = new PropertyIndexEditorProvider().with(indexHelper.getMountInfoProvider());
+        IndexEditorProvider property = createPropertyEditorProvider();
 
         return CompositeIndexEditorProvider.compose(asList(lucene, property));
     }
 
+    private IndexEditorProvider createPropertyEditorProvider() throws IOException {
+        SegmentPropertyIndexEditorProvider provider =
+                new SegmentPropertyIndexEditorProvider(new File(getLocalIndexDir(), "propertyIndexStore"));
+        provider.with(indexHelper.getMountInfoProvider());
+        closer.register(provider);
+        return provider;
+    }
+
     private IndexEditorProvider createLuceneEditorProvider() throws IOException {
         LuceneIndexHelper luceneIndexHelper = indexHelper.getLuceneIndexHelper();
         DirectoryFactory dirFactory = new FSDirectoryFactory(getLocalIndexDir());

Added: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/SegmentPropertyIndexEditorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/SegmentPropertyIndexEditorProvider.java?rev=1812868&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/SegmentPropertyIndexEditorProvider.java (added)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/SegmentPropertyIndexEditorProvider.java Sun Oct 22 06:16:05 2017
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.index;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+import joptsimple.OptionParser;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.index.ContextAwareCallback;
+import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback;
+import org.apache.jackrabbit.oak.plugins.index.IndexingContext;
+import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
+import org.apache.jackrabbit.oak.run.cli.NodeStoreFixture;
+import org.apache.jackrabbit.oak.run.cli.NodeStoreFixtureProvider;
+import org.apache.jackrabbit.oak.run.cli.Options;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.Editor;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
+import org.apache.jackrabbit.oak.spi.mount.Mounts;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Editor implementation which stores the property index NodeState data in a different
+ * SegmentNodeStore used solely for property index storage purpose
+ */
+public class SegmentPropertyIndexEditorProvider implements IndexEditorProvider, Closeable {
+
+    private MountInfoProvider mountInfoProvider = Mounts.defaultMountInfoProvider();
+
+    private final File indexStoreDir;
+    private NodeBuilder rootBuilder;
+    private NodeStoreFixture fixture;
+
+    public SegmentPropertyIndexEditorProvider(File storeDir) {
+        this.indexStoreDir = storeDir;
+    }
+
+    @CheckForNull
+    @Override
+    public Editor getIndexEditor(@Nonnull String type, @Nonnull NodeBuilder definition,
+                                 @Nonnull NodeState root, @Nonnull IndexUpdateCallback callback)
+            throws CommitFailedException {
+        if (!PropertyIndexEditorProvider.TYPE.equals(type)) {
+            return null;
+        }
+        IndexingContext idxCtx = ((ContextAwareCallback) callback).getIndexingContext();
+        String indexPath = idxCtx.getIndexPath();
+
+        PropertyIndexEditorProvider pie = new PropertyIndexEditorProvider();
+        pie.with(mountInfoProvider);
+
+        NodeBuilder idxb = definition;
+        if (idxCtx.isReindexing()) {
+            //In case of reindex use the NodeBuilder from SegmentNodeStore instead of default one
+            idxb = createNewBuilder(indexPath, definition);
+        }
+
+        return pie.getIndexEditor(type, idxb, root, callback);
+    }
+
+    @Override
+    public void close() throws IOException {
+        if (rootBuilder != null) {
+            try {
+                fixture.getStore().merge(rootBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+            } catch (CommitFailedException e) {
+                throw new IOException(e);
+            }
+            fixture.close();
+        }
+    }
+
+    private NodeBuilder createNewBuilder(String indexPath, NodeBuilder definition) {
+        String idxNodeName = PathUtils.getName(indexPath);
+        String idxParentPath = PathUtils.getParentPath(indexPath);
+        NodeBuilder newIdxBuilder = child(getRootBuilder(), idxParentPath);
+        newIdxBuilder.setChildNode(idxNodeName, definition.getNodeState());
+        return newIdxBuilder.child(idxNodeName);
+    }
+
+    private NodeBuilder getRootBuilder() {
+        if (rootBuilder == null) {
+            rootBuilder = createRootBuilder();
+        }
+        return rootBuilder;
+    }
+
+    private NodeBuilder createRootBuilder() {
+        try {
+            indexStoreDir.mkdirs();
+            fixture = NodeStoreFixtureProvider.create(createSegmentOptions(indexStoreDir), false);
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to create Segment store at " + indexStoreDir.getAbsolutePath(), e);
+        }
+        return fixture.getStore().getRoot().builder();
+    }
+
+    private static Options createSegmentOptions(File storePath) throws IOException {
+        OptionParser parser = new OptionParser();
+        Options opts = new Options().withDisableSystemExit();
+        opts.parseAndConfigure(parser, new String[] {storePath.getAbsolutePath()});
+        return opts;
+    }
+
+    private static NodeBuilder child(NodeBuilder nb, String path) {
+        for (String name : PathUtils.elements(checkNotNull(path))) {
+            nb = nb.child(name);
+        }
+        return nb;
+    }
+
+    public SegmentPropertyIndexEditorProvider with(MountInfoProvider mountInfoProvider) {
+        this.mountInfoProvider = mountInfoProvider;
+        return this;
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/SegmentPropertyIndexEditorProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native