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 2012/02/27 03:52:49 UTC

svn commit: r1294004 - /lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java

Author: markrmiller
Date: Mon Feb 27 02:52:49 2012
New Revision: 1294004

URL: http://svn.apache.org/viewvc?rev=1294004&view=rev
Log:
do not hold the cores lock while calling cancel on recovery

Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java?rev=1294004&r1=1294003&r2=1294004&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java Mon Feb 27 02:52:49 2012
@@ -66,6 +66,7 @@ import org.apache.solr.handler.admin.Cor
 import org.apache.solr.handler.component.HttpShardHandlerFactory;
 import org.apache.solr.handler.component.ShardHandlerFactory;
 import org.apache.solr.schema.IndexSchema;
+import org.apache.solr.update.SolrCoreState;
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -485,14 +486,16 @@ public class CoreContainer 
    * Stops all cores.
    */
   public void shutdown() {
-    log.info("Shutting down CoreContainer instance="+System.identityHashCode(this));    
+    log.info("Shutting down CoreContainer instance="+System.identityHashCode(this));
+    if (isZooKeeperAware()) {
+      cancelCoreRecoveries();
+    }
+    
     synchronized(cores) {
       try {
         for (SolrCore core : cores.values()) {
           try {
              core.close();
-             // make sure we wait for any recoveries to stop
-             core.getUpdateHandler().getSolrCoreState().cancelRecovery();
           } catch (Throwable t) {
             SolrException.log(log, "Error shutting down core", t);
           }
@@ -512,6 +515,28 @@ public class CoreContainer 
       }
     }
   }
+
+  private void cancelCoreRecoveries() {
+    ArrayList<SolrCoreState> coreStates = null;
+    synchronized (cores) {
+        for (SolrCore core : cores.values()) {
+          try {
+            coreStates = new ArrayList<SolrCoreState>(cores.size());
+            // make sure we wait for any recoveries to stop
+            coreStates.add(core.getUpdateHandler().getSolrCoreState());
+          } catch (Throwable t) {
+            SolrException.log(log, "Error canceling recovery for core", t);
+          }
+        }
+    }
+    
+    // we must cancel without holding the cores sync
+    if (coreStates != null) {
+      for (SolrCoreState coreState : coreStates) {
+        coreState.cancelRecovery();
+      }
+    }
+  }
   
   @Override
   protected void finalize() throws Throwable {