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