Author: chetanm
Date: Thu May 18 06:28:01 2017
New Revision: 1795479

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

Ensure that directories created are closed

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexConsistencyChecker.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexConsistencyChecker.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexConsistencyChecker.java?rev=1795479&r1=1795478&r2=1795479&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexConsistencyChecker.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexConsistencyChecker.java
 Thu May 18 06:28:01 2017
@@ -33,6 +33,7 @@ import javax.jcr.PropertyType;
 
 import com.google.common.base.Stopwatch;
 import com.google.common.io.ByteStreams;
+import com.google.common.io.Closer;
 import com.google.common.io.CountingInputStream;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
@@ -235,6 +236,12 @@ public class IndexConsistencyChecker {
     }
 
     public Result check(Level level, boolean cleanWorkDir) throws IOException {
+        try (Closer closer = Closer.create()) {
+            return check(level, cleanWorkDir, closer);
+        }
+    }
+
+    private Result check(Level level, boolean cleanWorkDir, Closer closer) 
throws IOException {
         Stopwatch watch = Stopwatch.createStarted();
         Result result = new Result();
         result.indexPath = indexPath;
@@ -245,7 +252,7 @@ public class IndexConsistencyChecker {
 
         checkBlobs(result);
         if (level == Level.FULL && result.clean){
-            checkIndex(result);
+            checkIndex(result, closer);
         }
 
         if (result.clean){
@@ -265,7 +272,7 @@ public class IndexConsistencyChecker {
         return result;
     }
 
-    private void checkIndex(Result result) throws IOException {
+    private void checkIndex(Result result, Closer closer) throws IOException {
         NodeState idx = NodeStateUtils.getNode(rootState, indexPath);
         IndexDefinition defn = IndexDefinition.newBuilder(rootState, idx, 
indexPath).build();
         workDir = createWorkDir(workDirRoot, PathUtils.getName(indexPath));
@@ -277,7 +284,7 @@ public class IndexConsistencyChecker {
                 result.dirStatus.add(dirStatus);
                 log.debug("[{}] Checking directory {}", indexPath, dirName);
                 try {
-                    checkIndexDirectory(dirStatus, idx, defn, workDir, 
dirName);
+                    checkIndexDirectory(dirStatus, idx, defn, workDir, 
dirName, closer);
                 } catch (IOException e){
                     dirStatus.clean = false;
                     log.warn("[{}][{}] Error occurred while performing 
directory check", indexPath, dirName, e);
@@ -291,11 +298,14 @@ public class IndexConsistencyChecker {
     }
 
     private void checkIndexDirectory(DirectoryStatus dirStatus, NodeState idx, 
IndexDefinition defn,
-                                     File workDir, String dirName) throws 
IOException {
+                                     File workDir, String dirName, Closer 
closer) throws IOException {
         File idxDir = createWorkDir(workDir, dirName);
         Directory sourceDir = new OakDirectory(new ReadOnlyBuilder(idx), 
dirName, defn, true);
         Directory targetDir = FSDirectory.open(idxDir);
 
+        closer.register(sourceDir);
+        closer.register(targetDir);
+
         boolean clean = true;
         for (String file : sourceDir.listAll()) {
             log.debug("[{}][{}] Checking {}", indexPath, dirName, file);
@@ -337,7 +347,7 @@ public class IndexConsistencyChecker {
             DirectoryReader dirReader = DirectoryReader.open(targetDir);
             dirStatus.numDocs = dirReader.numDocs();
             log.debug("[{}][{}] DirectoryReader can be opened", indexPath, 
dirName);
-            dirReader.close();
+            closer.register(dirReader);
         }
     }
 


Reply via email to