lucene-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From a.@apache.org
Subject lucene-solr:jira/solr-11320: SOLR-11448: Support waitForFinalState in AddReplicaCmd.
Date Tue, 10 Oct 2017 18:52:12 GMT
Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-11320 [created] 8c3c22dd1


SOLR-11448: Support waitForFinalState in AddReplicaCmd.


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

Branch: refs/heads/jira/solr-11320
Commit: 8c3c22dd1c8471a7f30f3136f40d0c1f198009ca
Parents: c0abcff
Author: Andrzej Bialecki <ab@apache.org>
Authored: Tue Oct 10 20:51:36 2017 +0200
Committer: Andrzej Bialecki <ab@apache.org>
Committed: Tue Oct 10 20:51:36 2017 +0200

----------------------------------------------------------------------
 .../org/apache/solr/cloud/AddReplicaCmd.java    |  76 +++++++++++++-
 .../org/apache/solr/cloud/MoveReplicaCmd.java   |  14 +--
 .../solr/handler/admin/CollectionsHandler.java  |  16 ++-
 .../org/apache/solr/cloud/AddReplicaTest.java   | 103 +++++++++++++++++++
 .../solrj/request/CollectionAdminRequest.java   |  10 +-
 .../solr/common/params/CommonAdminParams.java   |   4 +-
 6 files changed, 206 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8c3c22dd/solr/core/src/java/org/apache/solr/cloud/AddReplicaCmd.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/AddReplicaCmd.java b/solr/core/src/java/org/apache/solr/cloud/AddReplicaCmd.java
index 62f01c5..ec808ac 100644
--- a/solr/core/src/java/org/apache/solr/cloud/AddReplicaCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/AddReplicaCmd.java
@@ -24,6 +24,9 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.commons.lang.StringUtils;
@@ -31,6 +34,7 @@ import org.apache.solr.client.solrj.cloud.autoscaling.Policy;
 import org.apache.solr.client.solrj.cloud.autoscaling.PolicyHelper;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.CollectionStateWatcher;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
@@ -54,6 +58,7 @@ import static org.apache.solr.common.cloud.ZkStateReader.CORE_NAME_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.SHARD_ID_PROP;
 import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDREPLICA;
 import static org.apache.solr.common.params.CommonAdminParams.ASYNC;
+import static org.apache.solr.common.params.CommonAdminParams.WAIT_FOR_FINAL_STATE;
 
 public class AddReplicaCmd implements OverseerCollectionMessageHandler.Cmd {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -77,8 +82,10 @@ public class AddReplicaCmd implements OverseerCollectionMessageHandler.Cmd
{
     String shard = message.getStr(SHARD_ID_PROP);
     String coreName = message.getStr(CoreAdminParams.NAME);
     String coreNodeName = message.getStr(CoreAdminParams.CORE_NODE_NAME);
+    int timeout = message.getInt("timeout", 10 * 60); // 10 minutes
     Replica.Type replicaType = Replica.Type.valueOf(message.getStr(ZkStateReader.REPLICA_TYPE,
Replica.Type.NRT.name()).toUpperCase(Locale.ROOT));
     boolean parallel = message.getBool("parallel", false);
+    boolean waitForFinalState = message.getBool(WAIT_FOR_FINAL_STATE, false);
     if (StringUtils.isBlank(coreName)) {
       coreName = message.getStr(CoreAdminParams.PROPERTY_PREFIX + CoreAdminParams.NAME);
     }
@@ -218,8 +225,22 @@ public class AddReplicaCmd implements OverseerCollectionMessageHandler.Cmd
{
       if (onComplete != null) onComplete.run();
     };
 
-    if (!parallel) {
-      runnable.run();
+    if (!parallel || waitForFinalState) {
+      CountDownLatch countDownLatch = new CountDownLatch(1);
+      if (waitForFinalState) {
+        ActiveReplicaWatcher watcher = new ActiveReplicaWatcher(null, coreName, countDownLatch);
+        try {
+          zkStateReader.registerCollectionStateWatcher(collection, watcher);
+          runnable.run();
+          if (!countDownLatch.await(timeout, TimeUnit.SECONDS)) {
+            throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Timeout waiting
" + timeout + " seconds for replica to become active.");
+          }
+        } finally {
+          zkStateReader.removeCollectionStateWatcher(collection, watcher);
+        }
+      } else {
+        runnable.run();
+      }
     } else {
       ocmh.tpe.submit(runnable);
     }
@@ -232,4 +253,55 @@ public class AddReplicaCmd implements OverseerCollectionMessageHandler.Cmd
{
         ZkStateReader.NODE_NAME_PROP, node
     );
   }
+
+  public static class ActiveReplicaWatcher implements CollectionStateWatcher {
+    String replicaId;
+    String solrCoreName;
+    CountDownLatch countDownLatch;
+
+    Replica activeReplica;
+
+    public ActiveReplicaWatcher(String replicaId, String solrCoreName, CountDownLatch countDownLatch)
{
+      if (replicaId == null && solrCoreName == null) {
+        throw new IllegalArgumentException("Either replicaId or solrCoreName must be set.");
+      }
+      if (replicaId != null && solrCoreName != null) {
+        throw new IllegalArgumentException("Only one of replicaId or solrCoreNAme may be
set.");
+      }
+      this.replicaId = replicaId;
+      this.solrCoreName = solrCoreName;
+      this.countDownLatch = countDownLatch;
+    }
+
+    public Replica getActiveReplica() {
+      return activeReplica;
+    }
+
+    @Override
+    public boolean onStateChanged(Set<String> liveNodes, DocCollection collectionState)
{
+      if (collectionState == null) { // collection has been deleted - don't wait
+        countDownLatch.countDown();
+        return true;
+      }
+      log.info("-- onStateChanged: " + collectionState);
+      for (Slice slice : collectionState.getSlices()) {
+        for (Replica replica : slice.getReplicas()) {
+          if (replicaId != null && replica.getName().equals(replicaId)) {
+            if (replica.isActive(liveNodes)) {
+              activeReplica = replica;
+              countDownLatch.countDown();
+              return true;
+            }
+          } else if (solrCoreName != null && solrCoreName.equals(replica.getStr(ZkStateReader.CORE_NAME_PROP)))
{
+            if (replica.isActive(liveNodes)) {
+              activeReplica = replica;
+              countDownLatch.countDown();
+              return true;
+            }
+          }
+        }
+      }
+      return false;
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8c3c22dd/solr/core/src/java/org/apache/solr/cloud/MoveReplicaCmd.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/MoveReplicaCmd.java b/solr/core/src/java/org/apache/solr/cloud/MoveReplicaCmd.java
index 4ba203c..2f2fbc4 100644
--- a/solr/core/src/java/org/apache/solr/cloud/MoveReplicaCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/MoveReplicaCmd.java
@@ -45,6 +45,7 @@ import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.REPLICA_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.SHARD_ID_PROP;
 import static org.apache.solr.common.params.CommonAdminParams.ASYNC;
+import static org.apache.solr.common.params.CommonAdminParams.WAIT_FOR_FINAL_STATE;
 
 public class MoveReplicaCmd implements Cmd{
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -65,6 +66,7 @@ public class MoveReplicaCmd implements Cmd{
     ocmh.checkRequired(message, COLLECTION_PROP, "targetNode");
     String collection = message.getStr(COLLECTION_PROP);
     String targetNode = message.getStr("targetNode");
+    boolean waitForFinalState = message.getBool(WAIT_FOR_FINAL_STATE, false);
     int timeout = message.getInt("timeout", 10 * 60); // 10 minutes
 
     String async = message.getStr(ASYNC);
@@ -111,14 +113,14 @@ public class MoveReplicaCmd implements Cmd{
     assert slice != null;
     Object dataDir = replica.get("dataDir");
     if (dataDir != null && dataDir.toString().startsWith("hdfs:/")) {
-      moveHdfsReplica(clusterState, results, dataDir.toString(), targetNode, async, coll,
replica, slice, timeout);
+      moveHdfsReplica(clusterState, results, dataDir.toString(), targetNode, async, coll,
replica, slice, timeout, waitForFinalState);
     } else {
-      moveNormalReplica(clusterState, results, targetNode, async, coll, replica, slice, timeout);
+      moveNormalReplica(clusterState, results, targetNode, async, coll, replica, slice, timeout,
waitForFinalState);
     }
   }
 
   private void moveHdfsReplica(ClusterState clusterState, NamedList results, String dataDir,
String targetNode, String async,
-                                 DocCollection coll, Replica replica, Slice slice, int timeout)
throws Exception {
+                                 DocCollection coll, Replica replica, Slice slice, int timeout,
boolean waitForFinalState) throws Exception {
     String skipCreateReplicaInClusterState = "true";
     if (clusterState.getLiveNodes().contains(replica.getNodeName())) {
       skipCreateReplicaInClusterState = "false";
@@ -183,7 +185,7 @@ public class MoveReplicaCmd implements Cmd{
   }
 
   private void moveNormalReplica(ClusterState clusterState, NamedList results, String targetNode,
String async,
-                                 DocCollection coll, Replica replica, Slice slice, int timeout)
throws Exception {
+                                 DocCollection coll, Replica replica, Slice slice, int timeout,
boolean waitForFinalState) throws Exception {
     String newCoreName = Assign.buildCoreName(ocmh.zkStateReader.getZkClient(), coll, slice.getName(),
replica.getType());
     ZkNodeProps addReplicasProps = new ZkNodeProps(
         COLLECTION_PROP, coll.getName(),
@@ -194,7 +196,7 @@ public class MoveReplicaCmd implements Cmd{
     NamedList addResult = new NamedList();
     CountDownLatch countDownLatch = new CountDownLatch(1);
     ReplaceNodeCmd.RecoveryWatcher watcher = null;
-    if (replica.equals(slice.getLeader())) {
+    if (replica.equals(slice.getLeader()) || waitForFinalState) {
       watcher = new ReplaceNodeCmd.RecoveryWatcher(coll.getName(), slice.getName(),
           replica.getName(), null, countDownLatch);
       ocmh.zkStateReader.registerCollectionStateWatcher(coll.getName(), watcher);
@@ -206,7 +208,7 @@ public class MoveReplicaCmd implements Cmd{
       log.warn(errorString);
       results.add("failure", errorString);
       if (watcher != null) { // unregister
-        ocmh.zkStateReader.registerCollectionStateWatcher(coll.getName(), watcher);
+        ocmh.zkStateReader.removeCollectionStateWatcher(coll.getName(), watcher);
       }
       return;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8c3c22dd/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
index 3d01222..9474458 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
@@ -130,6 +130,7 @@ import static org.apache.solr.common.cloud.ZkStateReader.TLOG_REPLICAS;
 import static org.apache.solr.common.params.CollectionAdminParams.COUNT_PROP;
 import static org.apache.solr.common.params.CollectionParams.CollectionAction.*;
 import static org.apache.solr.common.params.CommonAdminParams.ASYNC;
+import static org.apache.solr.common.params.CommonAdminParams.WAIT_FOR_FINAL_STATE;
 import static org.apache.solr.common.params.CommonParams.NAME;
 import static org.apache.solr.common.params.CommonParams.VALUE_LONG;
 import static org.apache.solr.common.params.CoreAdminParams.DATA_DIR;
@@ -414,7 +415,8 @@ public class CollectionsHandler extends RequestHandlerBase implements
Permission
           PULL_REPLICAS,
           TLOG_REPLICAS,
           NRT_REPLICAS,
-          POLICY);
+          POLICY,
+          WAIT_FOR_FINAL_STATE);
 
       if (props.get(STATE_FORMAT) == null) {
         props.put(STATE_FORMAT, "2");
@@ -505,7 +507,8 @@ public class CollectionsHandler extends RequestHandlerBase implements
Permission
           COLLECTION_PROP,
           SHARD_ID_PROP,
           "split.key",
-          CoreAdminParams.RANGES);
+          CoreAdminParams.RANGES,
+          WAIT_FOR_FINAL_STATE);
       return copyPropertiesWithPrefix(req.getParams(), map, COLL_PROP_PREFIX);
     }),
     DELETESHARD_OP(DELETESHARD, (req, rsp, h) -> {
@@ -525,7 +528,8 @@ public class CollectionsHandler extends RequestHandlerBase implements
Permission
     CREATESHARD_OP(CREATESHARD, (req, rsp, h) -> {
       Map<String, Object> map = req.getParams().required().getAll(null,
           COLLECTION_PROP,
-          SHARD_ID_PROP);
+          SHARD_ID_PROP,
+          WAIT_FOR_FINAL_STATE);
       ClusterState clusterState = h.coreContainer.getZkController().getClusterState();
       final String newShardName = SolrIdentifierValidator.validateShardName(req.getParams().get(SHARD_ID_PROP));
       if (!ImplicitDocRouter.NAME.equals(((Map) clusterState.getCollection(req.getParams().get(COLLECTION_PROP)).get(DOC_ROUTER)).get(NAME)))
@@ -644,7 +648,8 @@ public class CollectionsHandler extends RequestHandlerBase implements
Permission
           INSTANCE_DIR,
           DATA_DIR,
           ULOG_DIR,
-          REPLICA_TYPE);
+          REPLICA_TYPE,
+          WAIT_FOR_FINAL_STATE);
       return copyPropertiesWithPrefix(req.getParams(), props, COLL_PROP_PREFIX);
     }),
     OVERSEERSTATUS_OP(OVERSEERSTATUS, (req, rsp, h) -> (Map) new LinkedHashMap<>()),
@@ -901,7 +906,7 @@ public class CollectionsHandler extends RequestHandlerBase implements
Permission
       if (targetNode == null) {
         throw new SolrException(ErrorCode.BAD_REQUEST, CollectionParams.TARGET_NODE + " is
a require parameter");
       }
-      return params.getAll(null, "source", "target", CollectionParams.SOURCE_NODE, CollectionParams.TARGET_NODE);
+      return params.getAll(null, "source", "target", WAIT_FOR_FINAL_STATE, CollectionParams.SOURCE_NODE,
CollectionParams.TARGET_NODE);
     }),
     MOVEREPLICA_OP(MOVEREPLICA, (req, rsp, h) -> {
       Map<String, Object> map = req.getParams().required().getAll(null,
@@ -911,6 +916,7 @@ public class CollectionsHandler extends RequestHandlerBase implements
Permission
           CollectionParams.FROM_NODE,
           CollectionParams.SOURCE_NODE,
           CollectionParams.TARGET_NODE,
+          WAIT_FOR_FINAL_STATE,
           "replica",
           "shard");
     }),

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8c3c22dd/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java b/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java
new file mode 100644
index 0000000..d94f54d
--- /dev/null
+++ b/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java
@@ -0,0 +1,103 @@
+package org.apache.solr.cloud;
+
+import java.lang.invoke.MethodHandles;
+import java.util.Collection;
+
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.client.solrj.response.RequestStatusState;
+import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.DocCollection;
+import org.apache.solr.common.cloud.Replica;
+import org.apache.solr.util.LogLevel;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ */
+@LogLevel("org.apache.solr.cloud=DEBUG")
+public class AddReplicaTest extends SolrCloudTestCase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+  @BeforeClass
+  public static void setupCluster() throws Exception {
+    configureCluster(4)
+        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .configure();
+  }
+
+  @Test
+  public void test() throws Exception {
+    cluster.waitForAllNodes(5000);
+    String collection = "addreplicatest_coll";
+
+    CloudSolrClient cloudClient = cluster.getSolrClient();
+
+    CollectionAdminRequest.Create create = CollectionAdminRequest.createCollection(collection,
"conf1", 2, 1);
+    create.setMaxShardsPerNode(2);
+    cloudClient.request(create);
+
+    ClusterState clusterState = cloudClient.getZkStateReader().getClusterState();
+    DocCollection coll = clusterState.getCollection(collection);
+    String sliceName = coll.getSlices().iterator().next().getName();
+    Collection<Replica> replicas = coll.getSlice(sliceName).getReplicas();
+    CollectionAdminRequest.AddReplica addReplica = CollectionAdminRequest.addReplicaToShard(collection,
sliceName);
+    addReplica.processAsync("000", cloudClient);
+    CollectionAdminRequest.RequestStatus requestStatus = CollectionAdminRequest.requestStatus("000");
+    CollectionAdminRequest.RequestStatusResponse rsp = requestStatus.process(cloudClient);
+    assertTrue(rsp.getRequestStatus() != RequestStatusState.COMPLETED);
+    // wait for async request success
+    boolean success = false;
+    for (int i = 0; i < 200; i++) {
+      rsp = requestStatus.process(cloudClient);
+      if (rsp.getRequestStatus() == RequestStatusState.COMPLETED) {
+        success = true;
+        break;
+      }
+      assertFalse(rsp.getRequestStatus() == RequestStatusState.FAILED);
+      Thread.sleep(500);
+    }
+    assertTrue(success);
+    Collection<Replica> replicas2 = cloudClient.getZkStateReader().getClusterState().getCollection(collection).getSlice(sliceName).getReplicas();
+    replicas2.removeAll(replicas);
+    assertEquals(1, replicas2.size());
+    Replica r = replicas2.iterator().next();
+    assertTrue(r.toString(), r.getState() != Replica.State.ACTIVE);
+
+    // use waitForFinalState
+    addReplica.setWaitForFinalState(true);
+    addReplica.processAsync("001", cloudClient);
+    requestStatus = CollectionAdminRequest.requestStatus("001");
+    rsp = requestStatus.process(cloudClient);
+    assertTrue(rsp.getRequestStatus() != RequestStatusState.COMPLETED);
+    // wait for async request success
+    success = false;
+    for (int i = 0; i < 200; i++) {
+      rsp = requestStatus.process(cloudClient);
+      if (rsp.getRequestStatus() == RequestStatusState.COMPLETED) {
+        success = true;
+        break;
+      }
+      assertFalse(rsp.getRequestStatus() == RequestStatusState.FAILED);
+      Thread.sleep(500);
+    }
+    assertTrue(success);
+    // let the client watch fire
+    Thread.sleep(1000);
+    clusterState = cloudClient.getZkStateReader().getClusterState();
+    coll = clusterState.getCollection(collection);
+    Collection<Replica> replicas3 = coll.getSlice(sliceName).getReplicas();
+    replicas3.removeAll(replicas);
+    String replica2 = replicas2.iterator().next().getName();
+    assertEquals(2, replicas3.size());
+    for (Replica replica : replicas3) {
+      if (replica.getName().equals(replica2)) {
+        continue; // may be still recovering
+      }
+      assertTrue(coll.toString() + "\n" + replica.toString(), replica.getState() == Replica.State.ACTIVE);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8c3c22dd/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 b394364..6faf15a 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
@@ -120,6 +120,9 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
    */
   public abstract static class AsyncCollectionAdminRequest extends CollectionAdminRequest<CollectionAdminResponse>
{
 
+    protected String asyncId = null;
+    protected boolean waitForFinalState = false;
+
     public AsyncCollectionAdminRequest(CollectionAction action) {
       super(action);
     }
@@ -133,12 +136,14 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
       return UUID.randomUUID().toString();
     }
 
-    protected String asyncId = null;
-
     public String getAsyncId() {
       return asyncId;
     }
 
+    public void setWaitForFinalState(boolean waitForFinalState) {
+      this.waitForFinalState = waitForFinalState;
+    }
+
     /**
      * Process this request asynchronously, generating and returning a request id
      * @param client a Solr client
@@ -196,6 +201,7 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
       if (asyncId != null) {
         params.set(CommonAdminParams.ASYNC, asyncId);
       }
+      params.set(CommonAdminParams.WAIT_FOR_FINAL_STATE, waitForFinalState);
       return params;
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8c3c22dd/solr/solrj/src/java/org/apache/solr/common/params/CommonAdminParams.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/params/CommonAdminParams.java b/solr/solrj/src/java/org/apache/solr/common/params/CommonAdminParams.java
index 89895f6..f20afa7 100644
--- a/solr/solrj/src/java/org/apache/solr/common/params/CommonAdminParams.java
+++ b/solr/solrj/src/java/org/apache/solr/common/params/CommonAdminParams.java
@@ -20,6 +20,6 @@ public interface CommonAdminParams
 {
 
   /** async or not? **/
-  public static final String ASYNC = "async";
-
+  String ASYNC = "async";
+  String WAIT_FOR_FINAL_STATE = "waitForFinalState";
 }


Mime
View raw message