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/03/21 02:36:01 UTC

lucene-solr:master: SOLR-12129: After the core is reloaded, term of the core will not be watched

Repository: lucene-solr
Updated Branches:
  refs/heads/master 9cda074e5 -> 63a145aa7


SOLR-12129: After the core is reloaded, term of the core will not be watched


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

Branch: refs/heads/master
Commit: 63a145aa7b96c765f980fa3d2e75dd05e289ea73
Parents: 9cda074
Author: Cao Manh Dat <da...@apache.org>
Authored: Wed Mar 21 09:35:51 2018 +0700
Committer: Cao Manh Dat <da...@apache.org>
Committed: Wed Mar 21 09:35:51 2018 +0700

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  2 +
 .../solr/cloud/RecoveringCoreTermWatcher.java   | 40 ++++++++++++--------
 .../org/apache/solr/cloud/ZkController.java     |  2 +-
 .../apache/solr/cloud/HttpPartitionTest.java    |  4 ++
 4 files changed, 32 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/63a145aa/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 9053b5e..dbc6cec 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -352,6 +352,8 @@ Bug Fixes
 
 * SOLR-12110: Replica which failed to register in Zk can become leader (Cao Manh Dat)
 
+* SOLR-12129: After the core is reloaded, term of the core will not be watched (Cao Manh Dat)
+
 Optimizations
 ----------------------
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/63a145aa/solr/core/src/java/org/apache/solr/cloud/RecoveringCoreTermWatcher.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/RecoveringCoreTermWatcher.java b/solr/core/src/java/org/apache/solr/cloud/RecoveringCoreTermWatcher.java
index 90a500a..007d221 100644
--- a/solr/core/src/java/org/apache/solr/cloud/RecoveringCoreTermWatcher.java
+++ b/solr/core/src/java/org/apache/solr/cloud/RecoveringCoreTermWatcher.java
@@ -20,6 +20,8 @@ package org.apache.solr.cloud;
 import java.lang.invoke.MethodHandles;
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.CoreDescriptor;
 import org.apache.solr.core.SolrCore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,30 +31,38 @@ import org.slf4j.LoggerFactory;
  */
 public class RecoveringCoreTermWatcher implements ZkShardTerms.CoreTermWatcher {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-  private final SolrCore solrCore;
+  private final CoreDescriptor coreDescriptor;
+  private final CoreContainer coreContainer;
   // used to prevent the case when term of other replicas get changed, we redo recovery
   // the idea here is with a specific term of a replica, we only do recovery one
   private final AtomicLong lastTermDoRecovery;
 
-  RecoveringCoreTermWatcher(SolrCore solrCore) {
-    this.solrCore = solrCore;
+  RecoveringCoreTermWatcher(CoreDescriptor coreDescriptor, CoreContainer coreContainer) {
+    this.coreDescriptor = coreDescriptor;
+    this.coreContainer = coreContainer;
     this.lastTermDoRecovery = new AtomicLong(-1);
   }
 
   @Override
   public boolean onTermChanged(ZkShardTerms.Terms terms) {
-    if (solrCore.isClosed()) {
-      return false;
-    }
+    if (coreContainer.isShutDown()) return false;
 
-    if (solrCore.getCoreDescriptor() == null || solrCore.getCoreDescriptor().getCloudDescriptor() == null) return true;
+    try (SolrCore solrCore = coreContainer.getCore(coreDescriptor.getName())) {
+      if (solrCore == null || solrCore.isClosed()) {
+        return false;
+      }
 
-    String coreNodeName = solrCore.getCoreDescriptor().getCloudDescriptor().getCoreNodeName();
-    if (terms.haveHighestTermValue(coreNodeName)) return true;
-    if (lastTermDoRecovery.get() < terms.getTerm(coreNodeName)) {
-      log.info("Start recovery on {} because core's term is less than leader's term", coreNodeName);
-      lastTermDoRecovery.set(terms.getTerm(coreNodeName));
-      solrCore.getUpdateHandler().getSolrCoreState().doRecovery(solrCore.getCoreContainer(), solrCore.getCoreDescriptor());
+      if (solrCore.getCoreDescriptor() == null || solrCore.getCoreDescriptor().getCloudDescriptor() == null) return true;
+      String coreNodeName = solrCore.getCoreDescriptor().getCloudDescriptor().getCoreNodeName();
+      if (terms.haveHighestTermValue(coreNodeName)) return true;
+      if (lastTermDoRecovery.get() < terms.getTerm(coreNodeName)) {
+        log.info("Start recovery on {} because core's term is less than leader's term", coreNodeName);
+        lastTermDoRecovery.set(terms.getTerm(coreNodeName));
+        solrCore.getUpdateHandler().getSolrCoreState().doRecovery(solrCore.getCoreContainer(), solrCore.getCoreDescriptor());
+      }
+    } catch (Exception e) {
+      log.info("Failed to watch term of core {}", coreDescriptor.getName(), e);
+      return false;
     }
 
     return true;
@@ -65,11 +75,11 @@ public class RecoveringCoreTermWatcher implements ZkShardTerms.CoreTermWatcher {
 
     RecoveringCoreTermWatcher that = (RecoveringCoreTermWatcher) o;
 
-    return solrCore.equals(that.solrCore);
+    return coreDescriptor.getName().equals(that.coreDescriptor.getName());
   }
 
   @Override
   public int hashCode() {
-    return solrCore.hashCode();
+    return coreDescriptor.getName().hashCode();
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/63a145aa/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 7a908b2..57f1dd5 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -1138,7 +1138,7 @@ public class ZkController {
         }
 
         if (isRunningInNewLIR && replicaType != Type.PULL) {
-          shardTerms.addListener(new RecoveringCoreTermWatcher(core));
+          shardTerms.addListener(new RecoveringCoreTermWatcher(core.getCoreDescriptor(), getCoreContainer()));
         }
         core.getCoreDescriptor().getCloudDescriptor().setHasRegistered(true);
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/63a145aa/solr/core/src/test/org/apache/solr/cloud/HttpPartitionTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/HttpPartitionTest.java b/solr/core/src/test/org/apache/solr/cloud/HttpPartitionTest.java
index ce454a7..60d7eb7 100644
--- a/solr/core/src/test/org/apache/solr/cloud/HttpPartitionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/HttpPartitionTest.java
@@ -40,6 +40,7 @@ import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.SolrException;
@@ -270,6 +271,9 @@ public class HttpPartitionTest extends AbstractFullDistribZkTestBase {
     createCollection(testCollectionName, "conf1", 1, 3, 1);
     cloudClient.setDefaultCollection(testCollectionName);
 
+    // term of the core still be watched even when the core is reloaded
+    CollectionAdminRequest.reloadCollection(testCollectionName).process(cloudClient);
+
     sendDoc(1, 2);
 
     JettySolrRunner leaderJetty = getJettyOnPort(getReplicaPort(getShardLeader(testCollectionName, "shard1", 1000)));