You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2016/02/26 21:47:25 UTC

lucene-solr git commit: SOLR-8497: Only mark diectory as done if it was not previously in the cache.

Repository: lucene-solr
Updated Branches:
  refs/heads/master efb7bb171 -> 54e7bb5f5


SOLR-8497: Only mark diectory as done if it was not previously in the cache.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/54e7bb5f
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/54e7bb5f
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/54e7bb5f

Branch: refs/heads/master
Commit: 54e7bb5f58931cef9ead049313804c2b9a10ce88
Parents: efb7bb1
Author: markrmiller <ma...@apache.org>
Authored: Fri Feb 26 15:47:12 2016 -0500
Committer: markrmiller <ma...@apache.org>
Committed: Fri Feb 26 15:47:12 2016 -0500

----------------------------------------------------------------------
 .../solr/core/CachingDirectoryFactory.java      |  3 +--
 .../solr/handler/admin/CoreAdminOperation.java  | 22 ++++++++++++++++----
 2 files changed, 19 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54e7bb5f/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java b/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java
index b9fe834..f7877c4 100644
--- a/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java
+++ b/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java
@@ -487,11 +487,10 @@ public abstract class CachingDirectoryFactory extends DirectoryFactory {
   }
   
   /**
-   * Test only method for inspecting the cache
+   * Method for inspecting the cache
    * @return paths in the cache which have not been marked "done"
    *
    * @see #doneWithDirectory
-   * @lucene.internal
    */
   public synchronized Set<String> getLivePaths() {
     HashSet<String> livePaths = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/54e7bb5f/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
index 094a46c..8240189 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminOperation.java
@@ -26,6 +26,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
 import java.util.concurrent.Future;
 
 import com.google.common.collect.Lists;
@@ -52,6 +54,7 @@ import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.params.UpdateParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.core.CachingDirectoryFactory;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.CoreDescriptor;
 import org.apache.solr.core.DirectoryFactory;
@@ -236,7 +239,7 @@ enum CoreAdminOperation {
       List<RefCounted<SolrIndexSearcher>> searchers = Lists.newArrayList();
       // stores readers created from indexDir param values
       List<DirectoryReader> readersToBeClosed = Lists.newArrayList();
-      List<Directory> dirsToBeReleased = Lists.newArrayList();
+      Map<Directory,Boolean> dirsToBeReleased = new HashMap<>();
       if (core != null) {
         try {
           String[] dirNames = params.getParams(CoreAdminParams.INDEX_DIR);
@@ -257,8 +260,14 @@ enum CoreAdminOperation {
           } else {
             DirectoryFactory dirFactory = core.getDirectoryFactory();
             for (int i = 0; i < dirNames.length; i++) {
+              boolean markAsDone = false;
+              if (dirFactory instanceof CachingDirectoryFactory) {
+                if (!((CachingDirectoryFactory)dirFactory).getLivePaths().contains(dirNames[i])) {
+                  markAsDone = true;
+                }
+              }
               Directory dir = dirFactory.get(dirNames[i], DirectoryFactory.DirContext.DEFAULT, core.getSolrConfig().indexConfig.lockType);
-              dirsToBeReleased.add(dir);
+              dirsToBeReleased.put(dir, markAsDone);
               // TODO: why doesn't this use the IR factory? what is going on here?
               readersToBeClosed.add(DirectoryReader.open(dir));
             }
@@ -295,9 +304,14 @@ enum CoreAdminOperation {
             if (solrCore != null) solrCore.close();
           }
           IOUtils.closeWhileHandlingException(readersToBeClosed);
-          for (Directory dir : dirsToBeReleased) {
+          Set<Entry<Directory,Boolean>> entries = dirsToBeReleased.entrySet();
+          for (Entry<Directory,Boolean> entry : entries) {
             DirectoryFactory dirFactory = core.getDirectoryFactory();
-            dirFactory.doneWithDirectory(dir);
+            Directory dir = entry.getKey();
+            boolean markAsDone = entry.getValue();
+            if (markAsDone) {
+              dirFactory.doneWithDirectory(dir);
+            }
             dirFactory.release(dir);
           }
           if (wrappedReq != null) wrappedReq.close();