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/16 00:35:29 UTC
lucene-solr:jira/solr-11702: SOLR-11702: Fixing deadlock problem
Repository: lucene-solr
Updated Branches:
refs/heads/jira/solr-11702 27be8a853 -> 225150e37
SOLR-11702: Fixing deadlock problem
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/225150e3
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/225150e3
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/225150e3
Branch: refs/heads/jira/solr-11702
Commit: 225150e37b2ca8298447ddf219041fc9edb66052
Parents: 27be8a8
Author: Cao Manh Dat <da...@apache.org>
Authored: Sat Dec 16 07:35:03 2017 +0700
Committer: Cao Manh Dat <da...@apache.org>
Committed: Sat Dec 16 07:35:03 2017 +0700
----------------------------------------------------------------------
.../apache/solr/cloud/ZkCollectionTerms.java | 7 ++++++
.../org/apache/solr/cloud/ZkController.java | 8 ++++--
.../org/apache/solr/cloud/ZkShardTerms.java | 26 ++++++++++----------
3 files changed, 26 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/225150e3/solr/core/src/java/org/apache/solr/cloud/ZkCollectionTerms.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkCollectionTerms.java b/solr/core/src/java/org/apache/solr/cloud/ZkCollectionTerms.java
index 93126b0..20aa9c5 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkCollectionTerms.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkCollectionTerms.java
@@ -22,6 +22,7 @@ import java.util.Map;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.util.ObjectReleaseTracker;
+import org.apache.solr.core.CoreDescriptor;
public class ZkCollectionTerms implements AutoCloseable {
private String collection;
@@ -41,6 +42,12 @@ public class ZkCollectionTerms implements AutoCloseable {
return terms.get(shardId);
}
+ public synchronized void remove(String shardId, CoreDescriptor coreDescriptor) {
+ if (getShard(shardId).removeTerm(coreDescriptor)) {
+ terms.remove(shardId).close();
+ }
+ }
+
public void close() {
terms.values().forEach(ZkShardTerms::close);
ObjectReleaseTracker.release(this);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/225150e3/solr/core/src/java/org/apache/solr/cloud/ZkController.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index 5d4a9ac..1efc8cd 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -1424,16 +1424,20 @@ public class ZkController {
}
public ZkShardTerms getShardTerms(String collection, String shardId) {
+ return getCollectionTerms(collection).getShard(shardId);
+ }
+
+ public ZkCollectionTerms getCollectionTerms(String collection) {
synchronized (collectionToTerms) {
if (!collectionToTerms.containsKey(collection)) collectionToTerms.put(collection, new ZkCollectionTerms(collection, zkClient));
+ return collectionToTerms.get(collection);
}
- return collectionToTerms.get(collection).getShard(shardId);
}
public void unregister(String coreName, CoreDescriptor cd) throws Exception {
final String coreNodeName = cd.getCloudDescriptor().getCoreNodeName();
final String collection = cd.getCloudDescriptor().getCollectionName();
- getShardTerms(collection, cd.getCloudDescriptor().getShardId()).removeTerm(cd);
+ getCollectionTerms(collection).remove(cd.getCloudDescriptor().getShardId(), cd);
if (Strings.isNullOrEmpty(collection)) {
log.error("No collection was specified.");
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/225150e3/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 46ee583..2398832 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
@@ -98,7 +98,7 @@ public class ZkShardTerms implements AutoCloseable{
}
}
- void removeTerm(CoreDescriptor cd) {
+ boolean removeTerm(CoreDescriptor cd) {
synchronized (listeners) {
// solrcore already closed
listeners.removeIf(coreTermWatcher -> !coreTermWatcher.onTermChanged(terms));
@@ -106,11 +106,12 @@ public class ZkShardTerms implements AutoCloseable{
Terms newTerms;
while ( (newTerms = terms.removeTerm(cd.getCloudDescriptor().getCoreNodeName())) != null) {
try {
- if (saveTerms(newTerms)) break;
- } catch (NoSuchElementException e) {
- return;
+ if (saveTerms(newTerms)) return newTerms.terms.isEmpty();
+ } catch (KeeperException.NoNodeException e) {
+ return true;
}
}
+ return true;
}
void registerTerm(String replica) {
@@ -136,13 +137,13 @@ public class ZkShardTerms implements AutoCloseable{
private boolean forceSaveTerms(Terms newTerms) {
try {
return saveTerms(newTerms);
- } catch (NoSuchElementException e) {
+ } catch (KeeperException.NoNodeException e) {
ensureTermNodeExist();
return false;
}
}
- private boolean saveTerms(Terms newTerms) throws NoSuchElementException {
+ private boolean saveTerms(Terms newTerms) throws KeeperException.NoNodeException {
byte[] znodeData = Utils.toJSON(newTerms.terms);
// must retry on conn loss otherwise future election attempts may assume wrong LIR state
try {
@@ -150,9 +151,9 @@ public class ZkShardTerms implements AutoCloseable{
updateTerms(new Terms(newTerms.terms, stat.getVersion()));
return true;
} catch (KeeperException.BadVersionException e) {
- log.info("Failed to save terms, version is not match, updating local terms");
+ log.info("Failed to save terms, version is not match, retrying");
updateTerms();
- } catch (NoSuchElementException e) {
+ } catch (KeeperException.NoNodeException e) {
throw e;
} catch (Exception e) {
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error save shard term for collection:" + collection, e);
@@ -211,15 +212,14 @@ public class ZkShardTerms implements AutoCloseable{
}
private void updateTerms(Terms newTerms) {
- boolean isNewer = false;
+ boolean isChanged = false;
synchronized (writingLock) {
- if (terms == null || newTerms.version > terms.version) {
+ if (terms == null || newTerms.version != terms.version) {
terms = newTerms;
- isNewer = true;
+ isChanged = true;
}
}
-
- if (isNewer) onTermUpdates(newTerms);
+ if (isChanged) onTermUpdates(newTerms);
}
private void onTermUpdates(Terms newTerms) {