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/09/28 02:18:58 UTC

[21/29] lucene-solr:jira/http2: SOLR-12805: Store previous term (generation) of replica when start recovery process

SOLR-12805: Store previous term (generation) of replica when start recovery process


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

Branch: refs/heads/jira/http2
Commit: 667b8299e69755abfef89b3beb44cacdd292d479
Parents: 5816766
Author: Cao Manh Dat <da...@apache.org>
Authored: Wed Sep 26 10:35:44 2018 +0700
Committer: Cao Manh Dat <da...@apache.org>
Committed: Wed Sep 26 10:35:44 2018 +0700

----------------------------------------------------------------------
 solr/CHANGES.txt                                      |  2 ++
 .../src/java/org/apache/solr/cloud/ZkShardTerms.java  |  8 ++++++--
 .../test/org/apache/solr/cloud/ZkShardTermsTest.java  | 14 +++++++++-----
 3 files changed, 17 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/667b8299/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 6128986..98fb204 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -71,6 +71,8 @@ Other Changes
   java.time.DateTimeFormatter instead of Joda time (see upgrade notes).  "Lenient" is enabled.  Removed Joda Time dependency.
   (David Smiley, Bar Rotstein)
 
+* SOLR-12805: Store previous term (generation) of replica when start recovery process (Cao Manh Dat)
+
 ==================  7.6.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/667b8299/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java b/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
index 99df2a2..bcbb347 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
@@ -588,12 +588,16 @@ public class ZkShardTerms implements AutoCloseable{
      */
     Terms startRecovering(String coreNodeName) {
       long maxTerm = getMaxTerm();
-      if (values.get(coreNodeName) == maxTerm && values.getOrDefault(coreNodeName+"_recovering", -1L) == maxTerm)
+      if (values.get(coreNodeName) == maxTerm)
         return null;
 
       HashMap<String, Long> newValues = new HashMap<>(values);
+      if (!newValues.containsKey(coreNodeName+"_recovering")) {
+        long currentTerm = newValues.getOrDefault(coreNodeName, 0L);
+        // by keeping old term, we will have more information in leader election
+        newValues.put(coreNodeName+"_recovering", currentTerm);
+      }
       newValues.put(coreNodeName, maxTerm);
-      newValues.put(coreNodeName+"_recovering", maxTerm);
       return new Terms(newValues, version);
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/667b8299/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java b/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
index 201de26..1c1b1d2 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
@@ -83,16 +83,19 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
       // List all possible orders of ensureTermIsHigher, startRecovering, doneRecovering
       zkShardTerms.registerTerm("replica1");
       zkShardTerms.registerTerm("replica2");
+
+      // normal case when leader start lir process
       zkShardTerms.ensureTermsIsHigher("replica1", Collections.singleton("replica2"));
       zkShardTerms.startRecovering("replica2");
       assertEquals(zkShardTerms.getTerm("replica2"), 1);
-      assertEquals(zkShardTerms.getTerm("replica2_recovering"), 1);
+      assertEquals(zkShardTerms.getTerm("replica2_recovering"), 0);
 
       zkShardTerms.doneRecovering("replica2");
       assertEquals(zkShardTerms.getTerm("replica1"), 1);
       assertEquals(zkShardTerms.getTerm("replica2"), 1);
       assertEquals(zkShardTerms.getTerm("replica2_recovering"), -1);
 
+      // stack of lir processes
       zkShardTerms.ensureTermsIsHigher("replica1", Collections.singleton("replica2"));
       assertEquals(zkShardTerms.getTerm("replica1"), 2);
       assertEquals(zkShardTerms.getTerm("replica2"), 1);
@@ -100,16 +103,17 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
 
       zkShardTerms.startRecovering("replica2");
       assertEquals(zkShardTerms.getTerm("replica2"), 2);
-      assertEquals(zkShardTerms.getTerm("replica2_recovering"), 2);
+      assertEquals(zkShardTerms.getTerm("replica2_recovering"), 1);
 
       zkShardTerms.ensureTermsIsHigher("replica1", Collections.singleton("replica2"));
       assertEquals(zkShardTerms.getTerm("replica1"), 3);
       assertEquals(zkShardTerms.getTerm("replica2"), 2);
-      assertEquals(zkShardTerms.getTerm("replica2_recovering"), 2);
-      zkShardTerms.doneRecovering("replica2");
+      assertEquals(zkShardTerms.getTerm("replica2_recovering"), 1);
 
+      zkShardTerms.doneRecovering("replica2");
       assertEquals(zkShardTerms.getTerm("replica2"), 2);
       assertEquals(zkShardTerms.getTerm("replica2_recovering"), -1);
+
       zkShardTerms.startRecovering("replica2");
       zkShardTerms.doneRecovering("replica2");
 
@@ -119,7 +123,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
       zkShardTerms.startRecovering("replica2");
       assertEquals(zkShardTerms.getTerm("replica1"), 5);
       assertEquals(zkShardTerms.getTerm("replica2"), 5);
-      assertEquals(zkShardTerms.getTerm("replica2_recovering"), 5);
+      assertEquals(zkShardTerms.getTerm("replica2_recovering"), 3);
       zkShardTerms.doneRecovering("replica2");
       assertEquals(zkShardTerms.getTerm("replica2_recovering"), -1);