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());


Reply via email to