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 al...@apache.org on 2014/04/08 12:35:18 UTC

svn commit: r1585680 - in /jackrabbit/oak/trunk/oak-core: ./ src/main/java/org/apache/jackrabbit/oak/ src/main/java/org/apache/jackrabbit/oak/api/jmx/ src/main/java/org/apache/jackrabbit/oak/management/ src/main/java/org/apache/jackrabbit/oak/plugins/i...

Author: alexparvulescu
Date: Tue Apr  8 10:35:18 2014
New Revision: 1585680

URL: http://svn.apache.org/r1585680
Log:
OAK-1684 Non-blocking reindexing doesn't save the initial checkpoint

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindex.java   (with props)
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindexMBean.java   (with props)
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/package-info.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-core/pom.xml
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java

Modified: jackrabbit/oak/trunk/oak-core/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/pom.xml?rev=1585680&r1=1585679&r2=1585680&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-core/pom.xml Tue Apr  8 10:35:18 2014
@@ -58,6 +58,7 @@
               org.apache.jackrabbit.oak.plugins.index.aggregate,
               org.apache.jackrabbit.oak.plugins.index.nodetype,
               org.apache.jackrabbit.oak.plugins.index.property,
+              org.apache.jackrabbit.oak.plugins.index.property.jmx,
               org.apache.jackrabbit.oak.plugins.index.reference,
               org.apache.jackrabbit.oak.plugins.itemsave,
               org.apache.jackrabbit.oak.plugins.lock,

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java?rev=1585680&r1=1585679&r2=1585680&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java Tue Apr  8 10:35:18 2014
@@ -62,6 +62,8 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.index.CompositeIndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
+import org.apache.jackrabbit.oak.plugins.index.property.jmx.PropertyIndexAsyncReindex;
+import org.apache.jackrabbit.oak.plugins.index.property.jmx.PropertyIndexAsyncReindexMBean;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.query.QueryEngineSettings;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
@@ -508,6 +510,12 @@ public class Oak {
             scheduleWithFixedDelay(whiteboard, task, 5, true);
             registerMBean(whiteboard, IndexStatsMBean.class,
                     task.getIndexStats(), IndexStatsMBean.TYPE, name);
+
+            PropertyIndexAsyncReindex asyncPI = new PropertyIndexAsyncReindex(
+                    new AsyncIndexUpdate("async-reindex", store, indexEditors,
+                            true), executor);
+            registerMBean(whiteboard, PropertyIndexAsyncReindexMBean.class,
+                    asyncPI, PropertyIndexAsyncReindexMBean.TYPE, name);
         }
 
         registerMBean(whiteboard, QueryEngineSettingsMBean.class,

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java?rev=1585680&r1=1585679&r2=1585680&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java Tue Apr  8 10:35:18 2014
@@ -175,4 +175,23 @@ public interface RepositoryManagementMBe
     @CheckForNull
     String checkpoint(long lifetime);
 
+    /**
+     * Initiate a reindex operation for the property indexes marked for
+     * reindexing
+     * 
+     * @return the status of the operation right after it was initiated
+     */
+    @Nonnull
+    CompositeData startPropertyIndexAsyncReindex();
+
+    /**
+     * Asynchronous Property Index reindexing status
+     * 
+     * @return the status of the ongoing operation or if none the terminal
+     *         status of the last operation or <em>Status not available</em> if
+     *         none.
+     */
+    @Nonnull
+    CompositeData getPropertyIndexAsyncReindexStatus();
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java?rev=1585680&r1=1585679&r2=1585680&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java Tue Apr  8 10:35:18 2014
@@ -35,6 +35,7 @@ import com.google.common.base.Function;
 import org.apache.jackrabbit.oak.api.jmx.RepositoryManagementMBean;
 import org.apache.jackrabbit.oak.plugins.backup.FileStoreBackupRestoreMBean;
 import org.apache.jackrabbit.oak.plugins.blob.BlobGCMBean;
+import org.apache.jackrabbit.oak.plugins.index.property.jmx.PropertyIndexAsyncReindexMBean;
 import org.apache.jackrabbit.oak.spi.state.RevisionGCMBean;
 import org.apache.jackrabbit.oak.spi.whiteboard.Tracker;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
@@ -181,4 +182,30 @@ public class RepositoryManager implement
             : null;
     }
 
+    @Override
+    public CompositeData startPropertyIndexAsyncReindex() {
+        return execute(PropertyIndexAsyncReindexMBean.class,
+                new Function<PropertyIndexAsyncReindexMBean, Status>() {
+                    @Nonnull
+                    @Override
+                    public Status apply(PropertyIndexAsyncReindexMBean reindexer) {
+                        return fromCompositeData(reindexer
+                                .startPropertyIndexAsyncReindex());
+                    }
+                }).toCompositeData();
+    }
+
+    @Override
+    public CompositeData getPropertyIndexAsyncReindexStatus() {
+        return execute(PropertyIndexAsyncReindexMBean.class,
+                new Function<PropertyIndexAsyncReindexMBean, Status>() {
+                    @Nonnull
+                    @Override
+                    public Status apply(PropertyIndexAsyncReindexMBean reindexer) {
+                        return fromCompositeData(reindexer
+                                .getPropertyIndexAsyncReindexStatus());
+                    }
+                }).toCompositeData();
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java?rev=1585680&r1=1585679&r2=1585680&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java Tue Apr  8 10:35:18 2014
@@ -126,7 +126,7 @@ public class AsyncIndexUpdate implements
         public void indexUpdate() throws CommitFailedException {
             if (!dirty) {
                 dirty = true;
-                preAsyncRun(store, name, indexStats);
+                preAsyncRun(store, name);
             }
         }
 
@@ -161,6 +161,7 @@ public class AsyncIndexUpdate implements
         }
 
         AsyncUpdateCallback callback = new AsyncUpdateCallback();
+        preAsyncRunStatsStats(indexStats);
         IndexUpdate indexUpdate = new IndexUpdate(provider, name, after,
                 builder, callback);
 
@@ -170,7 +171,7 @@ public class AsyncIndexUpdate implements
             if (callback.dirty) {
                 async.setProperty(name, checkpoint);
                 try {
-                    store.merge(builder, newCommitHook(name, state, indexStats),
+                    store.merge(builder, newCommitHook(name, state),
                             CommitInfo.EMPTY);
                 } catch (CommitFailedException e) {
                     if (e != CONCURRENT_UPDATE) {
@@ -180,8 +181,10 @@ public class AsyncIndexUpdate implements
                 if (switchOnSync) {
                     reindexedDefinitions.addAll(indexUpdate
                             .getReindexedDefinitions());
+                } else {
+                    postAsyncRunStatsStatus(indexStats);
                 }
-            } else if (switchOnSync && !reindexedDefinitions.isEmpty()) {
+            } else if (switchOnSync) {
                 log.debug("No changes detected after diff, will try to switch to synchronous updates on "
                         + reindexedDefinitions);
                 async.setProperty(name, checkpoint);
@@ -198,9 +201,10 @@ public class AsyncIndexUpdate implements
                 }
 
                 try {
-                    store.merge(builder, newCommitHook(name, state, indexStats),
+                    store.merge(builder, newCommitHook(name, state),
                             CommitInfo.EMPTY);
                     reindexedDefinitions.clear();
+                    postAsyncRunStatsStatus(indexStats);
                 } catch (CommitFailedException e) {
                     if (e != CONCURRENT_UPDATE) {
                         exception = e;
@@ -223,8 +227,7 @@ public class AsyncIndexUpdate implements
     }
 
     private static CommitHook newCommitHook(final String name,
-            final PropertyState state, final AsyncIndexStats indexStats)
-            throws CommitFailedException {
+            final PropertyState state) throws CommitFailedException {
         return new CommitHook() {
             @Override
             @Nonnull
@@ -234,7 +237,7 @@ public class AsyncIndexUpdate implements
                 PropertyState stateAfterRebase = before.getChildNode(ASYNC)
                         .getProperty(name);
                 if (Objects.equal(state, stateAfterRebase)) {
-                    return postAsyncRunStatus(after.builder(), indexStats, name)
+                    return postAsyncRunNodeStatus(after.builder(), name)
                             .getNodeState();
                 } else {
                     throw CONCURRENT_UPDATE;
@@ -243,10 +246,9 @@ public class AsyncIndexUpdate implements
         };
     }
 
-    private static void preAsyncRun(NodeStore store, String name,
-            AsyncIndexStats stats) throws CommitFailedException {
+    private static void preAsyncRun(NodeStore store, String name) throws CommitFailedException {
         NodeBuilder builder = store.getRoot().builder();
-        preAsyncRunStatus(builder, stats, name);
+        preAsyncRunNodeStatus(builder, name);
         store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
     }
 
@@ -278,20 +280,21 @@ public class AsyncIndexUpdate implements
         return false;
     }
 
-    private static void preAsyncRunStatus(NodeBuilder builder,
-            AsyncIndexStats stats, String name) {
+    private static void preAsyncRunNodeStatus(NodeBuilder builder, String name) {
         String now = now();
-        stats.start(now);
         builder.getChildNode(INDEX_DEFINITIONS_NAME)
                 .setProperty(name + "-status", STATUS_RUNNING)
                 .setProperty(name + "-start", now, Type.DATE)
                 .removeProperty(name + "-done");
     }
 
-    private static NodeBuilder postAsyncRunStatus(NodeBuilder builder,
-            AsyncIndexStats stats, String name) {
+    private static void preAsyncRunStatsStats(AsyncIndexStats stats) {
+        stats.start(now());
+    }
+
+    private static NodeBuilder postAsyncRunNodeStatus(NodeBuilder builder,
+            String name) {
         String now = now();
-        stats.done(now);
         builder.getChildNode(INDEX_DEFINITIONS_NAME)
                 .setProperty(name + "-status", STATUS_DONE)
                 .setProperty(name + "-done", now, Type.DATE)
@@ -299,6 +302,10 @@ public class AsyncIndexUpdate implements
         return builder;
     }
 
+    private static void postAsyncRunStatsStatus(AsyncIndexStats stats) {
+        stats.done(now());
+    }
+
     private static String now() {
         return ISO8601.format(Calendar.getInstance());
     }
@@ -307,6 +314,10 @@ public class AsyncIndexUpdate implements
         return indexStats;
     }
 
+    public boolean isFinished() {
+        return indexStats.getStatus() == STATUS_DONE;
+    }
+
     private static final class AsyncIndexStats implements IndexStatsMBean {
 
         private String start = "";
@@ -339,6 +350,12 @@ public class AsyncIndexUpdate implements
         public String getStatus() {
             return status;
         }
+
+        @Override
+        public String toString() {
+            return "AsyncIndexStats [start=" + start + ", done=" + done
+                    + ", status=" + status + "]";
+        }
     }
 
 }

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindex.java?rev=1585680&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindex.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindex.java Tue Apr  8 10:35:18 2014
@@ -0,0 +1,85 @@
+/*
+ * 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.plugins.index.property.jmx;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static java.lang.System.nanoTime;
+import static org.apache.jackrabbit.oak.management.ManagementOperation.done;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executor;
+
+import javax.annotation.Nonnull;
+import javax.management.openmbean.CompositeData;
+
+import org.apache.jackrabbit.oak.management.ManagementOperation;
+import org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate;
+
+/**
+ * Default implementation of {@link PropertyIndexAsyncReindexMBean} based on a
+ * {@code Runnable}.
+ */
+public class PropertyIndexAsyncReindex implements
+        PropertyIndexAsyncReindexMBean {
+
+    public static final String OP_NAME = "Property index asynchronous reindex";
+
+    private final AsyncIndexUpdate async;
+    private final Executor executor;
+
+    private ManagementOperation arOp = done(OP_NAME, 0);
+
+    /**
+     * @param gc
+     *            Revision garbage collector
+     * @param executor
+     *            executor for running the garbage collection task
+     */
+    public PropertyIndexAsyncReindex(@Nonnull AsyncIndexUpdate async,
+            @Nonnull Executor executor) {
+        this.async = checkNotNull(async);
+        this.executor = checkNotNull(executor);
+    }
+
+    @Nonnull
+    @Override
+    public CompositeData startPropertyIndexAsyncReindex() {
+        if (arOp.isDone()) {
+            arOp = new ManagementOperation(OP_NAME, new Callable<Long>() {
+                @Override
+                public Long call() throws Exception {
+                    long t0 = nanoTime();
+                    boolean done = false;
+                    while (!done) {
+                        async.run();
+                        done = async.isFinished();
+                    }
+                    return nanoTime() - t0;
+                }
+            });
+            executor.execute(arOp);
+        }
+        return getPropertyIndexAsyncReindexStatus();
+    }
+
+    @Nonnull
+    @Override
+    public CompositeData getPropertyIndexAsyncReindexStatus() {
+        return arOp.getStatus().toCompositeData();
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindex.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindexMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindexMBean.java?rev=1585680&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindexMBean.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindexMBean.java Tue Apr  8 10:35:18 2014
@@ -0,0 +1,52 @@
+/*
+ * 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.plugins.index.property.jmx;
+
+import javax.annotation.Nonnull;
+import javax.management.openmbean.CompositeData;
+
+/**
+ * MBean for starting and monitoring the progress of asynchronous reindexing of
+ * the property index
+ * 
+ * @see org.apache.jackrabbit.oak.api.jmx.RepositoryManagementMBean
+ */
+public interface PropertyIndexAsyncReindexMBean {
+
+    String TYPE = "PropertyIndexAsyncReindex";
+
+    /**
+     * Initiate a reindex operation for the property indexes marked for
+     * reindexing
+     * 
+     * @return the status of the operation right after it was initiated
+     */
+    @Nonnull
+    CompositeData startPropertyIndexAsyncReindex();
+
+    /**
+     * Asynchronous Property Index reindexing status
+     * 
+     * @return the status of the ongoing operation or if none the terminal
+     *         status of the last operation or <em>Status not available</em> if
+     *         none.
+     */
+    @Nonnull
+    CompositeData getPropertyIndexAsyncReindexStatus();
+
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/PropertyIndexAsyncReindexMBean.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/package-info.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/package-info.java?rev=1585680&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/package-info.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/package-info.java Tue Apr  8 10:35:18 2014
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+@Version("0.21.0")
+@Export(optional = "provide:=true")
+package org.apache.jackrabbit.oak.plugins.index.property.jmx;
+
+import aQute.bnd.annotation.Version;
+import aQute.bnd.annotation.Export;
\ No newline at end of file

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain