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 2017/12/20 03:59:51 UTC

lucene-solr:jira/solr-11702: SOLR-11702: Fix ZkShardTerms.ensureTermsIsHigher

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-11702 7160af12c -> d98ca9df9


SOLR-11702: Fix ZkShardTerms.ensureTermsIsHigher


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

Branch: refs/heads/jira/solr-11702
Commit: d98ca9df9d139948b1c9e8546b81cfd09b00a982
Parents: 7160af1
Author: Cao Manh Dat <da...@apache.org>
Authored: Wed Dec 20 10:59:17 2017 +0700
Committer: Cao Manh Dat <da...@apache.org>
Committed: Wed Dec 20 10:59:17 2017 +0700

----------------------------------------------------------------------
 .../src/java/org/apache/solr/cloud/ZkShardTerms.java   | 11 ++++++++++-
 .../test/org/apache/solr/cloud/ZkShardTermsTest.java   | 13 +++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d98ca9df/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 2126ba0..15dfab6 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
@@ -249,16 +249,22 @@ public class ZkShardTerms implements AutoCloseable{
       return terms.getOrDefault(coreNodeName, 0L) == maxTerm;
     }
 
+    Long getTerm(String coreNodeName) {
+      return terms.get(coreNodeName);
+    }
+
     Terms increaseTerms(String leader, Set<String> replicasInLowerTerms) {
       if (!terms.containsKey(leader)) {
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Can not find leader's term " + leader);
       }
 
       boolean changed = false;
+      boolean foundReplicasInLowerTerms = false;
 
       HashMap<String, Long> newValues = new HashMap<>(terms);
       long leaderTerm = newValues.get(leader);
       for (String replica : newValues.keySet()) {
+        if (replicasInLowerTerms.contains(replica)) foundReplicasInLowerTerms = true;
         if (Objects.equals(newValues.get(replica), leaderTerm)) {
           if(replicasInLowerTerms.contains(replica)) {
             changed = true;
@@ -267,7 +273,10 @@ public class ZkShardTerms implements AutoCloseable{
           }
         }
       }
-      if (!changed) return null;
+
+      // We should skip the optimization if there are no replicasInLowerTerms present in local terms,
+      // this may indicate that the current value is stale
+      if (!changed && foundReplicasInLowerTerms) return null;
       return new Terms(newValues, version);
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d98ca9df/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 f2b862d..54503b4 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
@@ -18,6 +18,7 @@
 package org.apache.solr.cloud;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -35,9 +36,13 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.util.TimeOut;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ZkShardTermsTest extends SolrCloudTestCase {
 
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(1)
@@ -181,6 +186,14 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
     replicaTerms.close();
   }
 
+  public void testEnsureTermsIsHigher() {
+    Map<String, Long> map = new HashMap<>();
+    map.put("leader", 0L);
+    ZkShardTerms.Terms terms = new ZkShardTerms.Terms(map, 0);
+    terms = terms.increaseTerms("leader", Collections.singleton("replica"));
+    assertEquals(1L, terms.getTerm("leader").longValue());
+  }
+
   private <T> void waitFor(T expected, Supplier<T> supplier) throws InterruptedException {
     TimeOut timeOut = new TimeOut(2, TimeUnit.SECONDS);
     while (!timeOut.hasTimedOut()) {