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()) {