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/10 14:48:15 UTC

svn commit: r1586284 - in /jackrabbit/oak/branches/1.0: ./ oak-core/ oak-core/src/main/java/org/apache/jackrabbit/oak/ oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/ oak-core/src/main/java/org/apache/jackrabbit/oak/management/ oak-core/src/m...

Author: alexparvulescu
Date: Thu Apr 10 12:48:15 2014
New Revision: 1586284

URL: http://svn.apache.org/r1586284
Log:
OAK-1684 Non-blocking reindexing doesn't save the initial checkpoint
 merged to 1.0 branch


Added:
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/
      - copied from r1585680, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/jmx/
Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-core/pom.xml
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1585680

Modified: jackrabbit/oak/branches/1.0/oak-core/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/pom.xml?rev=1586284&r1=1586283&r2=1586284&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/pom.xml (original)
+++ jackrabbit/oak/branches/1.0/oak-core/pom.xml Thu Apr 10 12:48:15 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/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java?rev=1586284&r1=1586283&r2=1586284&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java Thu Apr 10 12:48:15 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;
@@ -514,6 +516,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/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java?rev=1586284&r1=1586283&r2=1586284&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryManagementMBean.java Thu Apr 10 12:48:15 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/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java?rev=1586284&r1=1586283&r2=1586284&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/management/RepositoryManager.java Thu Apr 10 12:48:15 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/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java?rev=1586284&r1=1586283&r2=1586284&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java Thu Apr 10 12:48:15 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 + "]";
+        }
     }
 
 }