You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by tf...@apache.org on 2017/05/13 00:53:32 UTC

[1/2] lucene-solr:jira/solr-10233: PrepRecovery throws NPE when core is not found

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-10233 096ed90b3 -> 659a0b412


PrepRecovery throws NPE when core is not found


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

Branch: refs/heads/jira/solr-10233
Commit: e927db5ad0cb425b8b1f14f8183235d5628412f6
Parents: 096ed90
Author: Tomas Fernandez Lobbe <tf...@apache.org>
Authored: Fri May 12 17:52:50 2017 -0700
Committer: Tomas Fernandez Lobbe <tf...@apache.org>
Committed: Fri May 12 17:52:50 2017 -0700

----------------------------------------------------------------------
 .../solr/handler/admin/PrepRecoveryOp.java      | 27 ++++++++------------
 1 file changed, 10 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e927db5a/solr/core/src/java/org/apache/solr/handler/admin/PrepRecoveryOp.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/PrepRecoveryOp.java b/solr/core/src/java/org/apache/solr/handler/admin/PrepRecoveryOp.java
index 39892b0..748982d 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/PrepRecoveryOp.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/PrepRecoveryOp.java
@@ -64,18 +64,20 @@ class PrepRecoveryOp implements CoreAdminHandler.CoreAdminOp {
     Boolean onlyIfLeader = params.getBool("onlyIfLeader");
     Boolean onlyIfLeaderActive = params.getBool("onlyIfLeaderActive");
 
-    log.info("Going to wait for coreNodeName: " + coreNodeName + ", state: " + waitForState
-        + ", checkLive: " + checkLive + ", onlyIfLeader: " + onlyIfLeader
-        + ", onlyIfLeaderActive: " + onlyIfLeaderActive);
 
-    int maxTries = 0;
+    CoreContainer coreContainer = it.handler.coreContainer;
+    // wait long enough for the leader conflict to work itself out plus a little extra
+    int conflictWaitMs = coreContainer.getZkController().getLeaderConflictResolveWait();
+    int maxTries = (int) Math.round(conflictWaitMs / 1000) + 3;
+    log.info("Going to wait for coreNodeName: {}, state: {}, checkLive: {}, onlyIfLeader: {}, onlyIfLeaderActive: {}, maxTime: {} s",
+        coreNodeName, waitForState, checkLive, onlyIfLeader, onlyIfLeaderActive, maxTries);
+    
     Replica.State state = null;
     boolean live = false;
     int retry = 0;
     while (true) {
-      CoreContainer coreContainer = it.handler.coreContainer;
       try (SolrCore core = coreContainer.getCore(cname)) {
-        if (core == null && retry == 30) {
+        if (core == null && retry == Math.min(30, maxTries)) {
           throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "core not found:"
               + cname);
         }
@@ -103,15 +105,6 @@ class PrepRecoveryOp implements CoreAdminHandler.CoreAdminOp {
             coreContainer.getZkController().getZkStateReader().forceUpdateCollection(collectionName);
           }
 
-          if (maxTries == 0) {
-            // wait long enough for the leader conflict to work itself out plus a little extra
-            int conflictWaitMs = coreContainer.getZkController().getLeaderConflictResolveWait();
-            maxTries = (int) Math.round(conflictWaitMs / 1000) + 3;
-            log.info("Will wait a max of " + maxTries + " seconds to see " + cname + " (" +
-                cloudDescriptor.getShardId() + " of " +
-                cloudDescriptor.getCollectionName() + ") have state: " + waitForState);
-          }
-
           ClusterState clusterState = coreContainer.getZkController().getClusterState();
           DocCollection collection = clusterState.getCollection(collectionName);
           Slice slice = collection.getSlice(cloudDescriptor.getShardId());
@@ -161,6 +154,7 @@ class PrepRecoveryOp implements CoreAdminHandler.CoreAdminOp {
           String collection = null;
           String leaderInfo = null;
           String shardId = null;
+          
           try {
             CloudDescriptor cloudDescriptor =
                 core.getCoreDescriptor().getCloudDescriptor();
@@ -176,8 +170,7 @@ class PrepRecoveryOp implements CoreAdminHandler.CoreAdminOp {
               "I was asked to wait on state " + waitForState + " for "
                   + shardId + " in " + collection + " on " + nodeName
                   + " but I still do not see the requested state. I see state: "
-                  + Objects.toString(state) + " live:" + live + " leader from ZK: " + leaderInfo
-          );
+                  + Objects.toString(state) + " live:" + live + " leader from ZK: " + leaderInfo);
         }
 
         if (coreContainer.isShutDown()) {


[2/2] lucene-solr:jira/solr-10233: Add support for ReplaceNodeCmd

Posted by tf...@apache.org.
Add support for ReplaceNodeCmd


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

Branch: refs/heads/jira/solr-10233
Commit: 659a0b4125559225e8c68efdabc8b670adf0715d
Parents: e927db5
Author: Tomas Fernandez Lobbe <tf...@apache.org>
Authored: Fri May 12 17:53:22 2017 -0700
Committer: Tomas Fernandez Lobbe <tf...@apache.org>
Committed: Fri May 12 17:53:22 2017 -0700

----------------------------------------------------------------------
 .../org/apache/solr/cloud/ReplaceNodeCmd.java   |  4 ++--
 .../org/apache/solr/cloud/ReplaceNodeTest.java  | 21 ++++++++++++++++++--
 .../solrj/request/CollectionAdminRequest.java   |  5 ++---
 3 files changed, 23 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/659a0b41/solr/core/src/java/org/apache/solr/cloud/ReplaceNodeCmd.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/ReplaceNodeCmd.java b/solr/core/src/java/org/apache/solr/cloud/ReplaceNodeCmd.java
index 92c9afe..e4240be 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ReplaceNodeCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ReplaceNodeCmd.java
@@ -154,9 +154,9 @@ public class ReplaceNodeCmd implements OverseerCollectionMessageHandler.Cmd {
                 SHARD_ID_PROP, slice.getName(),
                 ZkStateReader.CORE_NAME_PROP, replica.getCoreName(),
                 ZkStateReader.REPLICA_PROP, replica.getName(),
+                ZkStateReader.REPLICA_TYPE, replica.getType().name(),
                 CoreAdminParams.NODE, source);
-            sourceReplicas.add(props
-            );
+            sourceReplicas.add(props);
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/659a0b41/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java b/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java
index 1c7575d..e1af607 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java
@@ -21,6 +21,7 @@ package org.apache.solr.cloud;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.EnumSet;
 import java.util.Set;
 
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -29,6 +30,9 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.CoreAdminRequest;
 import org.apache.solr.client.solrj.response.CoreAdminResponse;
 import org.apache.solr.client.solrj.response.RequestStatusState;
+import org.apache.solr.common.cloud.DocCollection;
+import org.apache.solr.common.cloud.Replica;
+import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.util.StrUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -60,7 +64,12 @@ public class ReplaceNodeTest extends SolrCloudTestCase {
     Collections.shuffle(l, random());
     String emptyNode = l.remove(0);
     String node2bdecommissioned = l.get(0);
-    CollectionAdminRequest.Create create = CollectionAdminRequest.createCollection(coll, "conf1", 5, 2);
+    CollectionAdminRequest.Create create;
+    create = pickRandom(CollectionAdminRequest.createCollection(coll, "conf1", 5, 2),
+                        CollectionAdminRequest.createCollection(coll, "conf1", 5, 1,1,0),
+                        CollectionAdminRequest.createCollection(coll, "conf1", 5, 0,1,1),
+                        CollectionAdminRequest.createCollection(coll, "conf1", 5, 1,0,1),
+                        CollectionAdminRequest.createCollection(coll, "conf1", 5, 0,2,0));
     create.setCreateNodeSet(StrUtils.join(l, ',')).setMaxShardsPerNode(3);
     cloudClient.request(create);
     log.info("excluded_node : {}  ", emptyNode);
@@ -98,7 +107,15 @@ public class ReplaceNodeTest extends SolrCloudTestCase {
     assertTrue(success);
     try (HttpSolrClient coreclient = getHttpSolrClient(cloudClient.getZkStateReader().getBaseUrlForNodeName(emptyNode))) {
       CoreAdminResponse status = CoreAdminRequest.getStatus(null, coreclient);
-      assertTrue(status.getCoreStatus().size() == 0);
+      assertEquals("Expecting no cores but found some: " + status.getCoreStatus(), 0, status.getCoreStatus().size());
+    }
+    
+    DocCollection collection = cloudClient.getZkStateReader().getClusterState().getCollection(coll);
+    assertEquals(create.getNumShards().intValue(), collection.getSlices().size());
+    for (Slice s:collection.getSlices()) {
+      assertEquals(create.getNumNrtReplicas().intValue(), s.getReplicas(EnumSet.of(Replica.Type.NRT)).size());
+      assertEquals(create.getNumTlogReplicas().intValue(), s.getReplicas(EnumSet.of(Replica.Type.TLOG)).size());
+      assertEquals(create.getNumPullReplicas().intValue(), s.getReplicas(EnumSet.of(Replica.Type.PULL)).size());
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/659a0b41/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
index 0b8dd74..dcfed27 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
@@ -457,9 +457,8 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
     public Integer getReplicationFactor() { return getNumNrtReplicas(); }
     public Integer getNumNrtReplicas() { return nrtReplicas; }
     public Boolean getAutoAddReplicas() { return autoAddReplicas; }
-    public Integer getNrtReplicas() { return nrtReplicas; }
-    public Integer getTlogReplicas() {return tlogReplicas;}
-    public Integer getPullReplicas() {return pullReplicas;}
+    public Integer getNumTlogReplicas() {return tlogReplicas;}
+    public Integer getNumPullReplicas() {return pullReplicas;}
 
     public Integer getStateFormat() { return stateFormat; }