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/01/26 16:29:05 UTC

svn commit: r1236240 - /lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java

Author: markrmiller
Date: Thu Jan 26 15:29:04 2012
New Revision: 1236240

URL: http://svn.apache.org/viewvc?rev=1236240&view=rev
Log:
cleanup/fix logic around setting active state on startup

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

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java?rev=1236240&r1=1236239&r2=1236240&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java Thu Jan 26 15:29:04 2012
@@ -508,9 +508,33 @@ public final class ZkController {
       try {
         core = cc.getCore(desc.getName());
 
-        boolean startRecovery = checkRecovery(coreName, desc, recoverReloadedCores, isLeader, cloudDesc,
+        if (isLeader) {
+          // recover from local transaction log and wait for it to complete before
+          // going active
+          // TODO: should this be moved to another thread? To recoveryStrat?
+          // TODO: should this actually be done earlier, before (or as part of)
+          // leader election perhaps?
+          // TODO: ensure that a replica that is trying to recover waits until I'm
+          // active (or don't make me the
+          // leader until my local replay is done. But this replay is only needed
+          // on the leader - replicas
+          // will do recovery anyway
+          
+          UpdateLog ulog = core.getUpdateHandler().getUpdateLog();
+          if (!core.isReloaded() && ulog != null) {
+            Future<UpdateLog.RecoveryInfo> recoveryFuture = core.getUpdateHandler()
+                .getUpdateLog().recoverFromLog();
+            if (recoveryFuture != null) {
+              recoveryFuture.get(); // NOTE: this could potentially block for
+                                    // minutes or more!
+              // TODO: public as recovering in the mean time?
+            }
+          }
+        }
+        
+        boolean didRecovery = checkRecovery(coreName, desc, recoverReloadedCores, isLeader, cloudDesc,
             collection, coreZkNodeName, shardId, leaderProps, core, cc);
-        if (!startRecovery) {
+        if (didRecovery) {
           publishAsActive(baseUrl, desc, coreZkNodeName, coreName);
         }
       } finally {
@@ -546,46 +570,18 @@ public final class ZkController {
       SolrCore core, CoreContainer cc) throws InterruptedException,
       KeeperException, IOException, ExecutionException {
 
-    
     boolean doRecovery = true;
-
-
-    if (isLeader) {
-      doRecovery = false;
-      
-      // recover from local transaction log and wait for it to complete before
-      // going active
-      // TODO: should this be moved to another thread? To recoveryStrat?
-      // TODO: should this actually be done earlier, before (or as part of)
-      // leader election perhaps?
-      // TODO: ensure that a replica that is trying to recover waits until I'm
-      // active (or don't make me the
-      // leader until my local replay is done. But this replay is only needed
-      // on the leader - replicas
-      // will do recovery anyway
-      
-      UpdateLog ulog = core.getUpdateHandler().getUpdateLog();
-      if (!core.isReloaded() && ulog != null) {
-        Future<UpdateLog.RecoveryInfo> recoveryFuture = core.getUpdateHandler()
-            .getUpdateLog().recoverFromLog();
-        if (recoveryFuture != null) {
-          recoveryFuture.get(); // NOTE: this could potentially block for
-                                // minutes or more!
-          // TODO: public as recovering in the mean time?
-        }
-      }
-      return false;
-    } else {
+    if (!isLeader) {
       
       if (core.isReloaded() && !recoverReloadedCores) {
         doRecovery = false;
       }
-    }
-    
-    if (doRecovery && !SKIP_AUTO_RECOVERY) {
-      log.info("Core needs to recover:" + core.getName());
-      core.getUpdateHandler().getSolrCoreState().doRecovery(core);
-      return true;
+      
+      if (doRecovery && !SKIP_AUTO_RECOVERY) {
+        log.info("Core needs to recover:" + core.getName());
+        core.getUpdateHandler().getSolrCoreState().doRecovery(core);
+        return true;
+      }
     }
     
     return false;