You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by da...@apache.org on 2018/01/07 02:18:36 UTC

lucene-solr:jira/solr-11702: SOLR-11702: RecoveringCoreTermWatcher should not do recovery if it is not necessary

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-11702 917dbc653 -> 974de38c0


SOLR-11702: RecoveringCoreTermWatcher should not do recovery if it is not necessary


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

Branch: refs/heads/jira/solr-11702
Commit: 974de38c0e40430d415b185e010fdea382a12e3d
Parents: 917dbc6
Author: Cao Manh Dat <da...@apache.org>
Authored: Sun Jan 7 09:18:05 2018 +0700
Committer: Cao Manh Dat <da...@apache.org>
Committed: Sun Jan 7 09:18:05 2018 +0700

----------------------------------------------------------------------
 .../org/apache/solr/cloud/RecoveringCoreTermWatcher.java | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/974de38c/solr/core/src/java/org/apache/solr/cloud/RecoveringCoreTermWatcher.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/RecoveringCoreTermWatcher.java b/solr/core/src/java/org/apache/solr/cloud/RecoveringCoreTermWatcher.java
index 59f4cc5..9ffd3c9 100644
--- a/solr/core/src/java/org/apache/solr/cloud/RecoveringCoreTermWatcher.java
+++ b/solr/core/src/java/org/apache/solr/cloud/RecoveringCoreTermWatcher.java
@@ -18,6 +18,9 @@
 package org.apache.solr.cloud;
 
 import java.lang.invoke.MethodHandles;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.solr.core.CoreDescriptor;
 import org.apache.solr.core.SolrCore;
@@ -27,9 +30,13 @@ import org.slf4j.LoggerFactory;
 public class RecoveringCoreTermWatcher implements ZkShardTerms.CoreTermWatcher {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private final SolrCore solrCore;
+  // used to prevent the case when term of other replicas get changed, we won't redo recovery
+  // the idea here is with a specific term of a replica, we only do recovery one
+  private final AtomicLong lastTermDoRecovery;
 
   public RecoveringCoreTermWatcher(SolrCore solrCore) {
     this.solrCore = solrCore;
+    this.lastTermDoRecovery = new AtomicLong(-1);
   }
 
   @Override
@@ -39,8 +46,10 @@ public class RecoveringCoreTermWatcher implements ZkShardTerms.CoreTermWatcher {
     }
     try {
       String coreNodeName = solrCore.getCoreDescriptor().getCloudDescriptor().getCoreNodeName();
-      if (!terms.canBecomeLeader(coreNodeName)) {
+      if (terms.canBecomeLeader(coreNodeName)) return true;
+      if (lastTermDoRecovery.get() < terms.getTerm(coreNodeName)) {
         log.info("Start recovery on {} because core's term is less than leader's term", coreNodeName);
+        lastTermDoRecovery.set(terms.getTerm(coreNodeName));
         solrCore.getUpdateHandler().getSolrCoreState().doRecovery(solrCore.getCoreContainer(), solrCore.getCoreDescriptor());
       }
     } catch (NullPointerException e) {