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/05/05 06:08:07 UTC

svn commit: r1793949 - in /jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene: LuceneIndexMBean.java LuceneIndexMBeanImpl.java LuceneIndexProviderService.java

Author: chetanm
Date: Fri May  5 06:08:07 2017
New Revision: 1793949

URL: http://svn.apache.org/viewvc?rev=1793949&view=rev
Log:
OAK-5558 - Consistency checker for Lucene indexes

-- Add checkConsistency operation to LuceneIndexMBean to initiate
   consistency check via JMX

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

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=1793949&r1=1793948&r2=1793949&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 Fri May  5 06:08:07 2017
@@ -69,4 +69,12 @@ public interface LuceneIndexMBean {
             "string form")
     String diffStoredIndexDefinition(@Name("indexPath") String indexPath);
 
+    @Description("Performs consistency check on given index")
+    String checkConsistency(@Name("indexPath") String indexPath,
+                            @Name("fullCheck")
+                            @Description("If set to true a full check would be performed which can be slow as " +
+                                    "it reads all index files. If set to false a quick check is performed to " +
+                                    "check if all blobs referred in index files are present in BlobStore")
+                                    boolean fullCheck) throws IOException;
+
 }

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=1793949&r1=1793948&r2=1793949&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 Fri May  5 06:08:07 2017
@@ -40,16 +40,20 @@ import javax.management.openmbean.Tabula
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
 import com.google.common.collect.TreeTraverser;
+import org.apache.jackrabbit.oak.api.jmx.Name;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.commons.jmx.AnnotatedStandardMBean;
-import org.apache.jackrabbit.oak.api.jmx.Name;
 import org.apache.jackrabbit.oak.commons.json.JsopBuilder;
 import org.apache.jackrabbit.oak.json.JsopDiff;
 import org.apache.jackrabbit.oak.plugins.index.lucene.BadIndexTracker.BadIndexInfo;
 import org.apache.jackrabbit.oak.plugins.index.lucene.LucenePropertyIndex.PathStoredFieldVisitor;
+import org.apache.jackrabbit.oak.plugins.index.lucene.directory.IndexConsistencyChecker;
+import org.apache.jackrabbit.oak.plugins.index.lucene.directory.IndexConsistencyChecker.Level;
+import org.apache.jackrabbit.oak.plugins.index.lucene.directory.IndexConsistencyChecker.Result;
 import org.apache.jackrabbit.oak.plugins.index.lucene.reader.LuceneIndexReader;
 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.lucene.index.DirectoryReader;
 import org.apache.lucene.index.Fields;
 import org.apache.lucene.index.IndexReader;
@@ -68,6 +72,7 @@ import org.apache.lucene.store.IOContext
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.apache.jackrabbit.oak.commons.IOUtils.humanReadableByteCount;
 import static org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.INDEX_DEFINITION_NODE;
@@ -77,10 +82,14 @@ import static org.apache.jackrabbit.oak.
 public class LuceneIndexMBeanImpl extends AnnotatedStandardMBean implements LuceneIndexMBean {
     private final Logger log = LoggerFactory.getLogger(getClass());
     private final IndexTracker indexTracker;
+    private final NodeStore nodeStore;
+    private final File workDir;
 
-    public LuceneIndexMBeanImpl(IndexTracker indexTracker) {
+    public LuceneIndexMBeanImpl(IndexTracker indexTracker, NodeStore nodeStore, File workDir) {
         super(LuceneIndexMBean.class);
-        this.indexTracker = indexTracker;
+        this.indexTracker = checkNotNull(indexTracker);
+        this.nodeStore = checkNotNull(nodeStore);
+        this.workDir = checkNotNull(workDir);
     }
 
     @Override
@@ -241,6 +250,20 @@ public class LuceneIndexMBeanImpl extend
         return "No stored index definition found at given path";
     }
 
+    @Override
+    public String checkConsistency(String indexPath, boolean fullCheck) throws IOException {
+        NodeState indexState = NodeStateUtils.getNode(nodeStore.getRoot(), indexPath);
+        checkArgument(indexState.exists(), "No node exist at path [%s]", indexPath);
+        return getConsistencyCheckResult(indexPath, fullCheck).toString();
+    }
+
+    private Result getConsistencyCheckResult(String indexPath, boolean fullCheck) throws IOException {
+        NodeState root = nodeStore.getRoot();
+        Level level = fullCheck ? Level.FULL : Level.BLOBS_ONLY;
+        IndexConsistencyChecker checker = new IndexConsistencyChecker(root, indexPath, workDir);
+        return checker.check(level);
+    }
+
     public void dumpIndexContent(String sourcePath, String destPath) throws IOException {
         IndexNode indexNode = null;
         try {

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=1793949&r1=1793948&r2=1793949&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 Fri May  5 06:08:07 2017
@@ -310,7 +310,7 @@ public class LuceneIndexProviderService
 
         oakRegs.add(registerMBean(whiteboard,
                 LuceneIndexMBean.class,
-                new LuceneIndexMBeanImpl(indexProvider.getTracker()),
+                new LuceneIndexMBeanImpl(indexProvider.getTracker(), nodeStore, new File(indexDir, "indexCheckDir")),
                 LuceneIndexMBean.TYPE,
                 "Lucene Index statistics"));
         registerGCMonitor(whiteboard, indexProvider.getTracker());