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/03 13:47:10 UTC

svn commit: r1811011 - in /jackrabbit/oak/trunk/oak-lucene/src: main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/ test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/

Author: chetanm
Date: Tue Oct  3 13:47:10 2017
New Revision: 1811011

URL: http://svn.apache.org/viewvc?rev=1811011&view=rev
Log:
OAK-6535 - Synchronous Lucene Property Indexes

Provide an MBean operation to explicitly invoke the cleaner

Modified:
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleaner.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleanerTest.java

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java?rev=1811011&r1=1811010&r2=1811011&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBean.java Tue Oct  3 13:47:10 2017
@@ -23,6 +23,7 @@ import java.io.IOException;
 
 import javax.management.openmbean.TabularData;
 
+import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.jmx.Description;
 import org.apache.jackrabbit.oak.api.jmx.Name;
 
@@ -106,4 +107,8 @@ public interface LuceneIndexMBean {
                                                   "check if all blobs referred in index files are present in BlobStore")
                                                   boolean fullCheck) throws IOException;
 
+
+    @Description("Performs any possible cleanup of the hybrid property indexes")
+    String performPropertyIndexCleanup() throws CommitFailedException;
+
 }

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java?rev=1811011&r1=1811010&r2=1811011&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexMBeanImpl.java Tue Oct  3 13:47:10 2017
@@ -28,6 +28,7 @@ import java.util.Set;
 import java.util.TreeSet;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.management.openmbean.CompositeDataSupport;
 import javax.management.openmbean.CompositeType;
 import javax.management.openmbean.OpenDataException;
@@ -41,6 +42,7 @@ import com.google.common.base.Stopwatch;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
 import com.google.common.collect.TreeTraverser;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.jmx.Name;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.commons.jmx.AnnotatedStandardMBean;
@@ -49,6 +51,7 @@ import org.apache.jackrabbit.oak.json.Js
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.IndexPathService;
 import org.apache.jackrabbit.oak.plugins.index.lucene.BadIndexTracker.BadIndexInfo;
+import org.apache.jackrabbit.oak.plugins.index.lucene.property.PropertyIndexCleaner;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.PathStoredFieldVisitor;
 import org.apache.jackrabbit.oak.plugins.index.lucene.directory.IndexConsistencyChecker;
 import org.apache.jackrabbit.oak.plugins.index.lucene.directory.IndexConsistencyChecker.Level;
@@ -92,13 +95,15 @@ public class LuceneIndexMBeanImpl extend
     private final NodeStore nodeStore;
     private final IndexPathService indexPathService;
     private final File workDir;
+    private final PropertyIndexCleaner propertyIndexCleaner;
 
-    public LuceneIndexMBeanImpl(IndexTracker indexTracker, NodeStore nodeStore, IndexPathService indexPathService, File workDir) {
+    public LuceneIndexMBeanImpl(IndexTracker indexTracker, NodeStore nodeStore, IndexPathService indexPathService, File workDir, @Nullable PropertyIndexCleaner cleaner) {
         super(LuceneIndexMBean.class);
         this.indexTracker = checkNotNull(indexTracker);
         this.nodeStore = checkNotNull(nodeStore);
         this.indexPathService = indexPathService;
         this.workDir = checkNotNull(workDir);
+        this.propertyIndexCleaner = cleaner;
     }
 
     @Override
@@ -331,6 +336,16 @@ public class LuceneIndexMBeanImpl extend
         return clean;
     }
 
+    @Override
+    public String performPropertyIndexCleanup() throws CommitFailedException {
+        String result = "PropertyIndexCleaner not enabled";
+        if (propertyIndexCleaner != null) {
+            result = propertyIndexCleaner.performCleanup(true).toString();
+        }
+        log.info("Explicit cleanup run done with result {}", result);
+        return result;
+    }
+
     private Result getConsistencyCheckResult(String indexPath, boolean fullCheck) throws IOException {
         NodeState root = nodeStore.getRoot();
         Level level = fullCheck ? Level.FULL : Level.BLOBS_ONLY;

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java?rev=1811011&r1=1811010&r2=1811011&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexProviderService.java Tue Oct  3 13:47:10 2017
@@ -345,6 +345,8 @@ public class LuceneIndexProviderService
 
     private IndexTracker tracker;
 
+    private PropertyIndexCleaner cleaner;
+
     @Activate
     private void activate(BundleContext bundleContext, Map<String, ?> config)
             throws NotCompliantMBeanException, IOException {
@@ -387,7 +389,7 @@ public class LuceneIndexProviderService
 
         oakRegs.add(registerMBean(whiteboard,
                 LuceneIndexMBean.class,
-                new LuceneIndexMBeanImpl(indexProvider.getTracker(), nodeStore, indexPathService, getIndexCheckDir()),
+                new LuceneIndexMBeanImpl(indexProvider.getTracker(), nodeStore, indexPathService, getIndexCheckDir(), cleaner),
                 LuceneIndexMBean.TYPE,
                 "Lucene Index statistics"));
         registerGCMonitor(whiteboard, indexProvider.getTracker());
@@ -792,7 +794,7 @@ public class LuceneIndexProviderService
             return;
         }
 
-        PropertyIndexCleaner cleaner = new PropertyIndexCleaner(nodeStore, indexPathService, asyncIndexInfoService);
+        cleaner = new PropertyIndexCleaner(nodeStore, indexPathService, asyncIndexInfoService);
         oakRegs.add(scheduleWithFixedDelay(whiteboard, cleaner,
                 ImmutableMap.of("scheduler.name", PropertyIndexCleaner.class.getName()),
                 cleanerInterval, true, true));

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleaner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleaner.java?rev=1811011&r1=1811010&r2=1811011&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleaner.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleaner.java Tue Oct  3 13:47:10 2017
@@ -73,7 +73,7 @@ public class PropertyIndexCleaner implem
     @Override
     public void run() {
         try{
-            performCleanup();
+            performCleanup(false);
         } catch (Exception e) {
             log.warn("Cleanup run failed with error", e);
         }
@@ -82,13 +82,14 @@ public class PropertyIndexCleaner implem
     /**
      * Performs the cleanup run
      *
-     * @return true if the cleanup was attempted
+     * @param forceCleanup if true then clean up would attempted even if no change
+     *                     is found in async indexer state
      */
-    public CleanupStats performCleanup() throws CommitFailedException {
+    public CleanupStats performCleanup(boolean forceCleanup) throws CommitFailedException {
         CleanupStats stats = new CleanupStats();
         Stopwatch w = Stopwatch.createStarted();
         Map<String, Long> asyncInfo = asyncIndexInfoService.getIndexedUptoPerLane();
-        if (lastAsyncInfo.equals(asyncInfo)) {
+        if (lastAsyncInfo.equals(asyncInfo) && !forceCleanup) {
             log.debug("No change found in async state from last run {}. Skipping the run", asyncInfo);
             return stats;
         }

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleanerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleanerTest.java?rev=1811011&r1=1811010&r2=1811011&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleanerTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/PropertyIndexCleanerTest.java Tue Oct  3 13:47:10 2017
@@ -116,7 +116,7 @@ public class PropertyIndexCleanerTest {
 
         //------------------------ Run 1
         asyncService.addInfo("async", 1000);
-        assertCleanUpPerformed(cleaner.performCleanup(), true);
+        assertCleanUpPerformed(cleaner.performCleanup(false), true);
 
         assertThat(query(indexPath, "foo", "bar"), containsInAnyOrder("/a"));
 
@@ -129,14 +129,14 @@ public class PropertyIndexCleanerTest {
 
         //------------------------ Run 2
         asyncService.addInfo("async", 2000);
-        assertCleanUpPerformed(cleaner.performCleanup(), true);
+        assertCleanUpPerformed(cleaner.performCleanup(false), true);
 
         //Now /a would be part of removed bucket
         assertThat(query(indexPath, "foo", "bar"), containsInAnyOrder("/b"));
 
         //------------------------ Run 3
         asyncService.addInfo("async", 3000);
-        assertCleanUpPerformed(cleaner.performCleanup(), true);
+        assertCleanUpPerformed(cleaner.performCleanup(false), true);
 
         //With another run /b would also be removed
         assertThat(query(indexPath, "foo", "bar"), empty());
@@ -174,7 +174,7 @@ public class PropertyIndexCleanerTest {
 
         //------------------------ Run 1
         asyncService.addInfo("async", 1200);
-        assertCleanUpPerformed(cleaner.performCleanup(), true);
+        assertCleanUpPerformed(cleaner.performCleanup(false), true);
 
         // /a would be purged, /b would be retained as its created time 1150 is not older than 100 wrt
         // indexer time of 1200
@@ -194,7 +194,7 @@ public class PropertyIndexCleanerTest {
 
         //------------------------ Run 2
         asyncService.addInfo("async", 1400);
-        assertCleanUpPerformed(cleaner.performCleanup(), true);
+        assertCleanUpPerformed(cleaner.performCleanup(false), true);
 
         //Both entries would have been purged
         assertThat(query(indexPath, "foo", "bar"), empty());
@@ -220,10 +220,10 @@ public class PropertyIndexCleanerTest {
 
         //------------------------ Run 1
         asyncService.addInfo("async", 1000);
-        assertCleanUpPerformed(cleaner.performCleanup(), true);
+        assertCleanUpPerformed(cleaner.performCleanup(false), true);
 
         //Second run should not run
-        assertCleanUpPerformed(cleaner.performCleanup(), false);
+        assertCleanUpPerformed(cleaner.performCleanup(false), false);
     }
 
     private void assertCleanUpPerformed(CleanupStats stats, boolean expected) {