You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by is...@apache.org on 2017/07/09 13:47:12 UTC

lucene-solr:jira/solr-6630: SOLR-6630: Deprecate implict router in favour of manual router

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-6630 [created] b6ee770f0


SOLR-6630: Deprecate implict router in favour of manual router


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

Branch: refs/heads/jira/solr-6630
Commit: b6ee770f0e1226441aaf94a074d3dc8163a7762e
Parents: b29951f
Author: Ishan Chattopadhyaya <is...@apache.org>
Authored: Sun Jul 9 19:16:51 2017 +0530
Committer: Ishan Chattopadhyaya <is...@apache.org>
Committed: Sun Jul 9 19:16:51 2017 +0530

----------------------------------------------------------------------
 .../apache/solr/cloud/CreateCollectionCmd.java  |  4 +-
 .../java/org/apache/solr/cloud/RestoreCmd.java  |  4 +-
 .../cloud/overseer/ClusterStateMutator.java     |  4 +-
 .../solr/cloud/overseer/CollectionMutator.java  |  8 +-
 .../solr/handler/admin/CollectionsHandler.java  |  6 +-
 .../AbstractCloudBackupRestoreTestCase.java     | 16 ++--
 .../test/org/apache/solr/cloud/AssignTest.java  |  4 +-
 .../cloud/CollectionTooManyReplicasTest.java    |  4 +-
 .../CollectionsAPIAsyncDistributedZkTest.java   |  2 +-
 .../solr/cloud/CollectionsAPISolrJTest.java     |  8 +-
 .../apache/solr/cloud/CustomCollectionTest.java | 14 +--
 .../DeleteLastCustomShardedReplicaTest.java     |  2 +-
 .../org/apache/solr/cloud/DeleteShardTest.java  |  2 +-
 .../cloud/FullSolrCloudDistribCmdsTest.java     | 14 +--
 .../apache/solr/cloud/TestCollectionAPI.java    |  6 +-
 .../solr/cloud/autoscaling/TestPolicyCloud.java |  4 +-
 .../cloud/overseer/TestClusterStateMutator.java |  6 +-
 .../org/apache/solr/cloud/rule/RulesTest.java   |  8 +-
 .../solr/search/stats/TestDistribIDF.java       | 10 +-
 .../solr/client/solrj/impl/CloudSolrClient.java |  4 +-
 .../solrj/request/CollectionAdminRequest.java   | 16 ++--
 .../org/apache/solr/common/cloud/DocRouter.java |  2 +-
 .../solr/common/cloud/ImplicitDocRouter.java    | 98 -------------------
 .../solr/common/cloud/ManualDocRouter.java      | 99 ++++++++++++++++++++
 ...ollectionAdminRequestRequiredParamsTest.java |  4 +-
 .../request/TestCollectionAdminRequest.java     |  6 +-
 26 files changed, 178 insertions(+), 177 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java b/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java
index b136335..d685dd0 100644
--- a/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java
@@ -36,7 +36,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocRouter;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkConfigManager;
@@ -107,7 +107,7 @@ public class CreateCollectionCmd implements Cmd {
       Integer numSlices = message.getInt(NUM_SLICES, null);
       String router = message.getStr("router.name", DocRouter.DEFAULT_NAME);
       List<String> shardNames = new ArrayList<>();
-      if(ImplicitDocRouter.NAME.equals(router)){
+      if(ManualDocRouter.NAME.equals(router)){
         ClusterStateMutator.getShardNames(shardNames, message.getStr("shards", null));
         numSlices = shardNames.size();
       } else {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/java/org/apache/solr/cloud/RestoreCmd.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/RestoreCmd.java b/solr/core/src/java/org/apache/solr/cloud/RestoreCmd.java
index fa493c7..461c765 100644
--- a/solr/core/src/java/org/apache/solr/cloud/RestoreCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/RestoreCmd.java
@@ -39,7 +39,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -172,7 +172,7 @@ public class RestoreCmd implements OverseerCollectionMessageHandler.Cmd {
       }
 
       Set<String> sliceNames = backupCollectionState.getActiveSlicesMap().keySet();
-      if (backupCollectionState.getRouter() instanceof ImplicitDocRouter) {
+      if (backupCollectionState.getRouter() instanceof ManualDocRouter) {
         propMap.put(SHARDS_PROP, StrUtils.join(sliceNames, ','));
       } else {
         propMap.put(NUM_SLICES, sliceNames.size());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/java/org/apache/solr/cloud/overseer/ClusterStateMutator.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/ClusterStateMutator.java b/solr/core/src/java/org/apache/solr/cloud/overseer/ClusterStateMutator.java
index 9002c19..004cc17 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/ClusterStateMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/ClusterStateMutator.java
@@ -29,7 +29,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.DocRouter;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -68,7 +68,7 @@ public class ClusterStateMutator {
     } else {
       List<String> shardNames = new ArrayList<>();
 
-      if (router instanceof ImplicitDocRouter) {
+      if (router instanceof ManualDocRouter) {
         getShardNames(shardNames, message.getStr("shards", DocRouter.DEFAULT_NAME));
       } else {
         int numShards = message.getInt(ZkStateReader.NUM_SHARDS_PROP, -1);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java b/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
index 59629de..4d3ed7c 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
@@ -25,7 +25,7 @@ import java.util.Map;
 
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -122,12 +122,12 @@ public class CollectionMutator {
 
     if (collection == null) {
       //  when updateSlice is called on a collection that doesn't exist, it's currently when a core is publishing itself
-      // without explicitly creating a collection.  In this current case, we assume custom sharding with an "implicit" router.
+      // without explicitly creating a collection.  In this current case, we assume custom sharding with a "manual" router.
       slices = new LinkedHashMap<>(1);
       slices.put(slice.getName(), slice);
       Map<String, Object> props = new HashMap<>(1);
-      props.put(DocCollection.DOC_ROUTER, Utils.makeMap(NAME, ImplicitDocRouter.NAME));
-      newCollection = new DocCollection(collectionName, slices, props, new ImplicitDocRouter());
+      props.put(DocCollection.DOC_ROUTER, Utils.makeMap(NAME, ManualDocRouter.NAME));
+      newCollection = new DocCollection(collectionName, slices, props, new ManualDocRouter());
     } else {
       slices = new LinkedHashMap<>(collection.getSlicesMap()); // make a shallow copy
       slices.put(slice.getName(), slice);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/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 256400e..1b72c92 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
@@ -56,7 +56,7 @@ import org.apache.solr.common.cloud.Aliases;
 import org.apache.solr.common.cloud.ClusterProperties;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Replica.State;
 import org.apache.solr.common.cloud.Slice;
@@ -518,8 +518,8 @@ public class CollectionsHandler extends RequestHandlerBase implements Permission
           SHARD_ID_PROP);
       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)))
-        throw new SolrException(ErrorCode.BAD_REQUEST, "shards can be added only to 'implicit' collections");
+      if (!ManualDocRouter.NAME.equals(((Map) clusterState.getCollection(req.getParams().get(COLLECTION_PROP)).get(DOC_ROUTER)).get(NAME)))
+        throw new SolrException(ErrorCode.BAD_REQUEST, "shards can be added only to collections using 'manual' router");
       req.getParams().getAll(map,
           REPLICATION_FACTOR,
           CREATE_NODE_SET);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/AbstractCloudBackupRestoreTestCase.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/AbstractCloudBackupRestoreTestCase.java b/solr/core/src/test/org/apache/solr/cloud/AbstractCloudBackupRestoreTestCase.java
index 526a8df..f2964e0 100644
--- a/solr/core/src/test/org/apache/solr/cloud/AbstractCloudBackupRestoreTestCase.java
+++ b/solr/core/src/test/org/apache/solr/cloud/AbstractCloudBackupRestoreTestCase.java
@@ -40,7 +40,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.params.CollectionAdminParams;
 import org.apache.solr.common.params.CoreAdminParams;
@@ -82,15 +82,15 @@ public abstract class AbstractCloudBackupRestoreTestCase extends SolrCloudTestCa
 
   @Test
   public void test() throws Exception {
-    boolean isImplicit = random().nextBoolean();
-    boolean doSplitShardOperation = !isImplicit && random().nextBoolean();
+    boolean isManual = random().nextBoolean();
+    boolean doSplitShardOperation = !isManual && random().nextBoolean();
     int replFactor = TestUtil.nextInt(random(), 1, 2);
     int numTlogReplicas = TestUtil.nextInt(random(), 0, 1);
     int numPullReplicas = TestUtil.nextInt(random(), 0, 1);
     
-    CollectionAdminRequest.Create create = isImplicit ?
+    CollectionAdminRequest.Create create = isManual ?
       // NOTE: use shard list with same # of shards as NUM_SHARDS; we assume this later
-      CollectionAdminRequest.createCollectionWithImplicitRouter(getCollectionName(), "conf1", "shard1,shard2", replFactor, numTlogReplicas, numPullReplicas) :
+      CollectionAdminRequest.createCollectionWithManualRouter(getCollectionName(), "conf1", "shard1,shard2", replFactor, numTlogReplicas, numPullReplicas) :
       CollectionAdminRequest.createCollection(getCollectionName(), "conf1", NUM_SHARDS, replFactor, numTlogReplicas, numPullReplicas);
     
     if (NUM_SHARDS * (replFactor + numTlogReplicas + numPullReplicas) > cluster.getJettySolrRunners().size() || random().nextBoolean()) {
@@ -105,7 +105,7 @@ public abstract class AbstractCloudBackupRestoreTestCase extends SolrCloudTestCa
     Properties coreProps = new Properties();
     coreProps.put("customKey", "customValue");//just to assert it survives the restoration
     create.setProperties(coreProps);
-    if (isImplicit) { //implicit router
+    if (isManual) { // manual router
       create.setRouterField("shard_s");
     } else {//composite id router
       if (random().nextBoolean()) {
@@ -202,7 +202,7 @@ public abstract class AbstractCloudBackupRestoreTestCase extends SolrCloudTestCa
     for (int i=0; i<numDocs; i++) {
       SolrInputDocument doc = new SolrInputDocument();
       doc.addField("id", i);
-      doc.addField("shard_s", "shard" + (1 + random.nextInt(NUM_SHARDS))); // for implicit router
+      doc.addField("shard_s", "shard" + (1 + random.nextInt(NUM_SHARDS))); // for manual router
       docs.add(doc);
     }
     CloudSolrClient client = cluster.getSolrClient();
@@ -285,7 +285,7 @@ public abstract class AbstractCloudBackupRestoreTestCase extends SolrCloudTestCa
     assertEquals(origShardToDocCount, getShardToDocCountMap(client, restoreCollection));
     //Re-index same docs (should be identical docs given same random seed) and test we have the same result.  Helps
     //  test we reconstituted the hash ranges / doc router.
-    if (!(restoreCollection.getRouter() instanceof ImplicitDocRouter) && random().nextBoolean()) {
+    if (!(restoreCollection.getRouter() instanceof ManualDocRouter) && random().nextBoolean()) {
       indexDocs(restoreCollectionName);
       assertEquals(origShardToDocCount, getShardToDocCountMap(client, restoreCollection));
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/AssignTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/AssignTest.java b/solr/core/src/test/org/apache/solr/cloud/AssignTest.java
index 8e32510..ac55313 100644
--- a/solr/core/src/test/org/apache/solr/cloud/AssignTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/AssignTest.java
@@ -25,7 +25,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.DocRouter;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -75,7 +75,7 @@ public class AssignTest extends SolrTestCaseJ4 {
     Slice slice = new Slice("slice1", replicas , new HashMap<String,Object>(0));
     slices.put("slice1", slice);
     
-    DocRouter router = new ImplicitDocRouter();
+    DocRouter router = new ManualDocRouter();
     DocCollection docCollection = new DocCollection(cname, slices, new HashMap<String,Object>(0), router);
 
     collectionStates.put(cname, docCollection);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/CollectionTooManyReplicasTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/CollectionTooManyReplicasTest.java b/solr/core/src/test/org/apache/solr/cloud/CollectionTooManyReplicasTest.java
index a1c2175..972f517 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CollectionTooManyReplicasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CollectionTooManyReplicasTest.java
@@ -121,7 +121,7 @@ public class CollectionTooManyReplicasTest extends SolrCloudTestCase {
   public void testAddShard() throws Exception {
 
     String collectionName = "TooManyReplicasWhenAddingShards";
-    CollectionAdminRequest.createCollectionWithImplicitRouter(collectionName, "conf", "shardstart", 2)
+    CollectionAdminRequest.createCollectionWithManualRouter(collectionName, "conf", "shardstart", 2)
         .setMaxShardsPerNode(2)
         .process(cluster.getSolrClient());
 
@@ -178,7 +178,7 @@ public class CollectionTooManyReplicasTest extends SolrCloudTestCase {
   @Test
   public void testDownedShards() throws Exception {
     String collectionName = "TooManyReplicasWhenAddingDownedNode";
-    CollectionAdminRequest.createCollectionWithImplicitRouter(collectionName, "conf", "shardstart", 1)
+    CollectionAdminRequest.createCollectionWithManualRouter(collectionName, "conf", "shardstart", 1)
         .setMaxShardsPerNode(2)
         .process(cluster.getSolrClient());
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIAsyncDistributedZkTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIAsyncDistributedZkTest.java b/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIAsyncDistributedZkTest.java
index 1474b5c..5605f272 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIAsyncDistributedZkTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIAsyncDistributedZkTest.java
@@ -78,7 +78,7 @@ public class CollectionsAPIAsyncDistributedZkTest extends SolrCloudTestCase {
     final CloudSolrClient client = cluster.getSolrClient();
 
     RequestStatusState state = CollectionAdminRequest.createCollection(collection,"conf1",1,1)
-        .setRouterName("implicit")
+        .setRouterName("manual")
         .setShards("shard1")
         .processAndWait(client, MAX_TIMEOUT_SECONDS);
     assertSame("CreateCollection task did not complete!", RequestStatusState.COMPLETED, state);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java b/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
index 77db071..71a7a5c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
@@ -148,10 +148,10 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
 
   @Test
   public void testCreateAndDeleteShard() throws IOException, SolrServerException {
-    // Create an implicit collection
-    String collectionName = "solrj_implicit";
+    // Create a manual collection
+    String collectionName = "solrj_manual";
     CollectionAdminResponse response
-        = CollectionAdminRequest.createCollectionWithImplicitRouter(collectionName, "conf", "shardA,shardB", 1, 1, 1)
+        = CollectionAdminRequest.createCollectionWithManualRouter(collectionName, "conf", "shardA,shardB", 1, 1, 1)
         .setMaxShardsPerNode(3)
         .process(cluster.getSolrClient());
 
@@ -160,7 +160,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
     Map<String, NamedList<Integer>> coresStatus = response.getCollectionCoresStatus();
     assertEquals(6, coresStatus.size());
 
-    // Add a shard to the implicit collection
+    // Add a shard to the manual collection
     response = CollectionAdminRequest.createShard(collectionName, "shardC").process(cluster.getSolrClient());
 
     assertEquals(0, response.getStatus());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java b/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java
index 63a3272..bcf09c6 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CustomCollectionTest.java
@@ -56,20 +56,20 @@ public class CustomCollectionTest extends SolrCloudTestCase {
   @Test
   public void testCustomCollectionsAPI() throws Exception {
 
-    final String collection = "implicitcoll";
+    final String collection = "manualcoll";
     int replicationFactor = TestUtil.nextInt(random(), 0, 3) + 2;
     int numShards = 3;
     int maxShardsPerNode = (((numShards + 1) * replicationFactor) / NODE_COUNT) + 1;
 
-    CollectionAdminRequest.createCollectionWithImplicitRouter(collection, "conf", "a,b,c", replicationFactor)
+    CollectionAdminRequest.createCollectionWithManualRouter(collection, "conf", "a,b,c", replicationFactor)
         .setMaxShardsPerNode(maxShardsPerNode)
         .process(cluster.getSolrClient());
 
     DocCollection coll = getCollectionState(collection);
-    assertEquals("implicit", ((Map) coll.get(DOC_ROUTER)).get("name"));
+    assertEquals("manual", ((Map) coll.get(DOC_ROUTER)).get("name"));
     assertNotNull(coll.getStr(REPLICATION_FACTOR));
     assertNotNull(coll.getStr(MAX_SHARDS_PER_NODE));
-    assertNull("A shard of a Collection configured with implicit router must have null range",
+    assertNull("A shard of a Collection configured with manual router must have null range",
         coll.getSlice("a").getRange());
 
     new UpdateRequest()
@@ -120,7 +120,7 @@ public class CustomCollectionTest extends SolrCloudTestCase {
   }
 
   @Test
-  public void testRouteFieldForImplicitRouter() throws Exception {
+  public void testRouteFieldForManualRouter() throws Exception {
 
     int numShards = 4;
     int replicationFactor = TestUtil.nextInt(random(), 0, 3) + 2;
@@ -129,7 +129,7 @@ public class CustomCollectionTest extends SolrCloudTestCase {
 
     final String collection = "withShardField";
 
-    CollectionAdminRequest.createCollectionWithImplicitRouter(collection, "conf", "a,b,c,d", replicationFactor)
+    CollectionAdminRequest.createCollectionWithManualRouter(collection, "conf", "a,b,c,d", replicationFactor)
         .setMaxShardsPerNode(maxShardsPerNode)
         .setRouterField(shard_fld)
         .process(cluster.getSolrClient());
@@ -183,7 +183,7 @@ public class CustomCollectionTest extends SolrCloudTestCase {
   @Test
   public void testCreateShardRepFactor() throws Exception  {
     final String collectionName = "testCreateShardRepFactor";
-    CollectionAdminRequest.createCollectionWithImplicitRouter(collectionName, "conf", "a,b", 1)
+    CollectionAdminRequest.createCollectionWithManualRouter(collectionName, "conf", "a,b", 1)
         .process(cluster.getSolrClient());
 
     CollectionAdminRequest.createShard(collectionName, "x")

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/DeleteLastCustomShardedReplicaTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteLastCustomShardedReplicaTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteLastCustomShardedReplicaTest.java
index c46362e..07abdee 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteLastCustomShardedReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteLastCustomShardedReplicaTest.java
@@ -36,7 +36,7 @@ public class DeleteLastCustomShardedReplicaTest extends SolrCloudTestCase {
 
     final String collectionName = "customcollreplicadeletion";
 
-    CollectionAdminRequest.createCollectionWithImplicitRouter(collectionName, "conf", "a,b", 1)
+    CollectionAdminRequest.createCollectionWithManualRouter(collectionName, "conf", "a,b", 1)
         .setMaxShardsPerNode(5)
         .process(cluster.getSolrClient());
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
index ed3d03b..a91faab 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
@@ -106,7 +106,7 @@ public class DeleteShardTest extends SolrCloudTestCase {
   public void testDirectoryCleanupAfterDeleteShard() throws InterruptedException, IOException, SolrServerException {
 
     final String collection = "deleteshard_test";
-    CollectionAdminRequest.createCollectionWithImplicitRouter(collection, "conf", "a,b,c", 1)
+    CollectionAdminRequest.createCollectionWithManualRouter(collection, "conf", "a,b,c", 1)
         .setMaxShardsPerNode(2)
         .process(cluster.getSolrClient());
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java b/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
index b4c5a46..6f56144 100644
--- a/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
@@ -142,7 +142,7 @@ public class FullSolrCloudDistribCmdsTest extends AbstractFullDistribZkTestBase
     testDeleteByQueryDistrib();
 
     // See SOLR-7384
-//    testDeleteByIdImplicitRouter();
+//    testDeleteByIdManualRouter();
 //
 //    testDeleteByIdCompositeRouterWithRouterField();
 
@@ -152,13 +152,13 @@ public class FullSolrCloudDistribCmdsTest extends AbstractFullDistribZkTestBase
     docId = testIndexingBatchPerRequestWithHttpSolrClient(docId);
   }
 
-  private void testDeleteByIdImplicitRouter() throws Exception {
+  private void testDeleteByIdManualRouter() throws Exception {
     SolrClient server = createNewSolrClient("", getBaseUrl((HttpSolrClient) clients.get(0)));
     CollectionAdminResponse response;
     Map<String, NamedList<Integer>> coresStatus;
 
     CollectionAdminRequest.Create createCollectionRequest
-      = CollectionAdminRequest.createCollectionWithImplicitRouter("implicit_collection_without_routerfield",
+      = CollectionAdminRequest.createCollectionWithManualRouter("manual_collection_without_routerfield",
                                                                   "conf1","shard1,shard2",2);
     response = createCollectionRequest.process(server);
 
@@ -167,16 +167,16 @@ public class FullSolrCloudDistribCmdsTest extends AbstractFullDistribZkTestBase
     coresStatus = response.getCollectionCoresStatus();
     assertEquals(4, coresStatus.size());
     for (int i = 0; i < 4; i++) {
-      NamedList<Integer> status = coresStatus.get("implicit_collection_without_routerfield_shard" + (i / 2 + 1) + "_replica" + (i % 2 + 1));
+      NamedList<Integer> status = coresStatus.get("manual_collection_without_routerfield_shard" + (i / 2 + 1) + "_replica" + (i % 2 + 1));
       assertEquals(0, (int) status.get("status"));
       assertTrue(status.get("QTime") > 0);
     }
 
-    waitForRecoveriesToFinish("implicit_collection_without_routerfield", true);
+    waitForRecoveriesToFinish("manual_collection_without_routerfield", true);
 
-    SolrClient shard1 = createNewSolrClient("implicit_collection_without_routerfield_shard1_replica1",
+    SolrClient shard1 = createNewSolrClient("manual_collection_without_routerfield_shard1_replica1",
         getBaseUrl((HttpSolrClient) clients.get(0)));
-    SolrClient shard2 = createNewSolrClient("implicit_collection_without_routerfield_shard2_replica1",
+    SolrClient shard2 = createNewSolrClient("manual_collection_without_routerfield_shard2_replica1",
         getBaseUrl((HttpSolrClient) clients.get(0)));
 
     SolrInputDocument doc = new SolrInputDocument();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/TestCollectionAPI.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCollectionAPI.java b/solr/core/src/test/org/apache/solr/cloud/TestCollectionAPI.java
index abe4ed3..201f2b8 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCollectionAPI.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCollectionAPI.java
@@ -690,7 +690,7 @@ public class TestCollectionAPI extends ReplicaPropertiesBase {
       ModifiableSolrParams params = new ModifiableSolrParams();
       params.set("action", CollectionParams.CollectionAction.CREATE.toString());
       params.set("name", "valid_collection_name");
-      params.set("router.name", "implicit");
+      params.set("router.name", "manual");
       params.set("numShards", "1");
       params.set("shards", "invalid@name#with$weird%characters");
       SolrRequest request = new QueryRequest(params);
@@ -732,12 +732,12 @@ public class TestCollectionAPI extends ReplicaPropertiesBase {
   private void testShardCreationNameValidation() throws Exception {
     try (CloudSolrClient client = createCloudClient(null)) {
       client.connect();
-      // Create a collection w/ implicit router
+      // Create a collection w/ manual router
       ModifiableSolrParams params = new ModifiableSolrParams();
       params.set("action", CollectionParams.CollectionAction.CREATE.toString());
       params.set("name", "valid_collection_name");
       params.set("shards", "a");
-      params.set("router.name", "implicit");
+      params.set("router.name", "manual");
       SolrRequest request = new QueryRequest(params);
       request.setPath("/admin/collections");
       client.request(request);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
index cb519f2..e2da9ac 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
@@ -140,7 +140,7 @@ public class TestPolicyCloud extends SolrCloudTestCase {
     Map<String, Object> json = Utils.getJson(cluster.getZkClient(), ZkStateReader.SOLR_AUTOSCALING_CONF_PATH, true);
     assertEquals("full json:"+ Utils.toJSONString(json) , "#EACH",
         Utils.getObjectByPath(json, true, "/policies/c1[0]/shard"));
-    CollectionAdminRequest.createCollectionWithImplicitRouter("policiesTest", "conf", "s1,s2", 1)
+    CollectionAdminRequest.createCollectionWithManualRouter("policiesTest", "conf", "s1,s2", 1)
         .setPolicy("c1")
         .process(cluster.getSolrClient());
 
@@ -155,7 +155,7 @@ public class TestPolicyCloud extends SolrCloudTestCase {
   }
 
   public void testDataProvider() throws IOException, SolrServerException, KeeperException, InterruptedException {
-    CollectionAdminRequest.createCollectionWithImplicitRouter("policiesTest", "conf", "shard1", 2)
+    CollectionAdminRequest.createCollectionWithManualRouter("policiesTest", "conf", "shard1", 2)
         .process(cluster.getSolrClient());
     DocCollection rulesCollection = getCollectionState("policiesTest");
     SolrClientDataProvider provider = new SolrClientDataProvider(cluster.getSolrClient());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java b/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
index 18cf763..3ed6403 100644
--- a/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
+++ b/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
@@ -22,7 +22,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.cloud.MockZkStateReader;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.util.Utils;
@@ -48,7 +48,7 @@ public class TestClusterStateMutator extends SolrTestCaseJ4 {
     message = new ZkNodeProps(Utils.makeMap(
         "name", "abc",
         "numShards", "2",
-        "router.name", "implicit",
+        "router.name", "manual",
         "shards", "x,y",
         "replicationFactor", "3",
         "maxShardsPerNode", "4"
@@ -64,7 +64,7 @@ public class TestClusterStateMutator extends SolrTestCaseJ4 {
     assertSame(Slice.State.ACTIVE, collection.getSlicesMap().get("x").getState());
     assertSame(Slice.State.ACTIVE, collection.getSlicesMap().get("y").getState());
     assertEquals(4, collection.getMaxShardsPerNode());
-    assertEquals(ImplicitDocRouter.class, collection.getRouter().getClass());
+    assertEquals(ManualDocRouter.class, collection.getRouter().getClass());
     assertNotNull(state.getCollectionOrNull("xyz")); // we still have the old collection
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/cloud/rule/RulesTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/rule/RulesTest.java b/solr/core/src/test/org/apache/solr/cloud/rule/RulesTest.java
index d4a72bf..8598f3b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/rule/RulesTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/rule/RulesTest.java
@@ -70,7 +70,7 @@ public class RulesTest extends SolrCloudTestCase {
         ImplicitSnitch.getUsableSpaceInGB(Paths.get("/")) > minGB);
 
     String rulesColl = "rulesColl";
-    CollectionAdminRequest.createCollectionWithImplicitRouter(rulesColl, "conf", "shard1", 2)
+    CollectionAdminRequest.createCollectionWithManualRouter(rulesColl, "conf", "shard1", 2)
         .setRule("cores:<4", "node:*,replica:<2", "freedisk:>"+minGB)
         .setSnitch("class:ImplicitSnitch")
         .process(cluster.getSolrClient());
@@ -98,7 +98,7 @@ public class RulesTest extends SolrCloudTestCase {
     String port = Integer.toString(jetty.getLocalPort());
 
     String rulesColl = "portRuleColl";
-    CollectionAdminRequest.createCollectionWithImplicitRouter(rulesColl, "conf", "shard1", 2)
+    CollectionAdminRequest.createCollectionWithManualRouter(rulesColl, "conf", "shard1", 2)
         .setRule("port:" + port)
         .setSnitch("class:ImplicitSnitch")
         .process(cluster.getSolrClient());
@@ -125,7 +125,7 @@ public class RulesTest extends SolrCloudTestCase {
     String ip_1 = ipFragments[ipFragments.length - 1];
     String ip_2 = ipFragments[ipFragments.length - 2];
 
-    CollectionAdminRequest.createCollectionWithImplicitRouter(rulesColl, "conf", "shard1", 2)
+    CollectionAdminRequest.createCollectionWithManualRouter(rulesColl, "conf", "shard1", 2)
         .setRule("ip_2:" + ip_2, "ip_1:" + ip_1)
         .setSnitch("class:ImplicitSnitch")
         .process(cluster.getSolrClient());
@@ -157,7 +157,7 @@ public class RulesTest extends SolrCloudTestCase {
     expectedException.expect(HttpSolrClient.RemoteSolrException.class);
     expectedException.expectMessage(containsString("ip_1"));
 
-    CollectionAdminRequest.createCollectionWithImplicitRouter(rulesColl, "conf", "shard1", 2)
+    CollectionAdminRequest.createCollectionWithManualRouter(rulesColl, "conf", "shard1", 2)
         .setRule("ip_2:" + ip_2, "ip_1:" + ip_1 + "9999")
         .setSnitch("class:ImplicitSnitch")
         .process(cluster.getSolrClient());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/core/src/test/org/apache/solr/search/stats/TestDistribIDF.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/stats/TestDistribIDF.java b/solr/core/src/test/org/apache/solr/search/stats/TestDistribIDF.java
index cac2dc5..c8f760a 100644
--- a/solr/core/src/test/org/apache/solr/search/stats/TestDistribIDF.java
+++ b/solr/core/src/test/org/apache/solr/search/stats/TestDistribIDF.java
@@ -32,7 +32,7 @@ import org.apache.solr.cloud.AbstractDistribZkTestBase;
 import org.apache.solr.cloud.MiniSolrCloudCluster;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.CompositeIdRouter;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.ShardParams;
 import org.junit.Test;
@@ -74,8 +74,8 @@ public class TestDistribIDF extends SolrTestCaseJ4 {
   @Test
   public void testSimpleQuery() throws Exception {
     //3 shards. 3rd shard won't have any data.
-    createCollection("onecollection", "conf1", ImplicitDocRouter.NAME);
-    createCollection("onecollection_local", "conf2", ImplicitDocRouter.NAME);
+    createCollection("onecollection", "conf1", ManualDocRouter.NAME);
+    createCollection("onecollection_local", "conf2", ManualDocRouter.NAME);
 
     SolrInputDocument doc = new SolrInputDocument();
     doc.setField("id", "1");
@@ -195,8 +195,8 @@ public class TestDistribIDF extends SolrTestCaseJ4 {
 
   private void createCollection(String name, String config, String router) throws Exception {
     CollectionAdminResponse response;
-    if (router.equals(ImplicitDocRouter.NAME)) {
-      CollectionAdminRequest.Create create = CollectionAdminRequest.createCollectionWithImplicitRouter(name,config,"a,b,c",1);
+    if (router.equals(ManualDocRouter.NAME)) {
+      CollectionAdminRequest.Create create = CollectionAdminRequest.createCollectionWithManualRouter(name,config,"a,b,c",1);
       create.setMaxShardsPerNode(1);
       response = create.process(solrCluster.getSolrClient());
     } else {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
index eeb96af..51b79c8 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
@@ -64,7 +64,7 @@ import org.apache.solr.common.cloud.CollectionStatePredicate;
 import org.apache.solr.common.cloud.CollectionStateWatcher;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.DocRouter;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
@@ -479,7 +479,7 @@ public class CloudSolrClient extends SolrClient {
 
     DocRouter router = col.getRouter();
     
-    if (router instanceof ImplicitDocRouter) {
+    if (router instanceof ManualDocRouter) {
       // short circuit as optimization
       return null;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/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 f039ba4..8b48b8c 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
@@ -33,7 +33,7 @@ import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.client.solrj.response.RequestStatusState;
 import org.apache.solr.client.solrj.util.SolrIdentifierValidator;
 import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.ImplicitDocRouter;
+import org.apache.solr.common.cloud.ManualDocRouter;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CollectionAdminParams;
@@ -323,18 +323,18 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
   }
 
   /**
-   * Returns a SolrRequest for creating a collection with the implicit router
+   * Returns a SolrRequest for creating a collection with the manual router
    * @param collection  the collection name
    * @param config      the collection config
    * @param shards      a shard definition string
    * @param numReplicas the replication factor of the collection
    */
-  public static Create createCollectionWithImplicitRouter(String collection, String config, String shards, int numReplicas) {
+  public static Create createCollectionWithManualRouter(String collection, String config, String shards, int numReplicas) {
     return new Create(collection, config, shards, numReplicas);
   }
   
   /**
-   * Returns a SolrRequest for creating a collection with the implicit router and specific types of replicas
+   * Returns a SolrRequest for creating a collection with the manual router and specific types of replicas
    * @param collection  the collection name
    * @param config      the collection config
    * @param shards      a shard definition string
@@ -342,8 +342,8 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
    * @param numTlogReplicas the number of replicas of type {@link org.apache.solr.common.cloud.Replica.Type#TLOG}
    * @param numPullReplicas the number of replicas of type {@link org.apache.solr.common.cloud.Replica.Type#PULL}
    */
-  public static Create createCollectionWithImplicitRouter(String collection, String config, String shards, int numNrtReplicas, int numTlogReplicas, int numPullReplicas) {
-    return new Create(collection, config, ImplicitDocRouter.NAME, null, checkNotNull("shards",shards), numNrtReplicas, numTlogReplicas, numPullReplicas);
+  public static Create createCollectionWithManualRouter(String collection, String config, String shards, int numNrtReplicas, int numTlogReplicas, int numPullReplicas) {
+    return new Create(collection, config, ManualDocRouter.NAME, null, checkNotNull("shards",shards), numNrtReplicas, numTlogReplicas, numPullReplicas);
   }
 
   // CREATE request
@@ -371,9 +371,9 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
       this(collection, config, null, numShards, null, numNrtReplicas, numTlogReplicas, numPullReplicas);
     }
 
-    /** Constructor that assumes {@link ImplicitDocRouter#NAME} and an explicit list of <code>shards</code> */
+    /** Constructor that assumes {@link ManualDocRouter#NAME} and an explicit list of <code>shards</code> */
     protected Create(String collection, String config, String shards, int numNrtReplicas) {
-      this(collection, config, ImplicitDocRouter.NAME, null, checkNotNull("shards",shards), numNrtReplicas, null, null);
+      this(collection, config, ManualDocRouter.NAME, null, checkNotNull("shards",shards), numNrtReplicas, null, null);
     }
     
     private Create(String collection, String config, String routerName, Integer numShards, String shards, Integer numNrtReplicas, Integer  numTlogReplicas, Integer numPullReplicas) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/solrj/src/java/org/apache/solr/common/cloud/DocRouter.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/DocRouter.java b/solr/solrj/src/java/org/apache/solr/common/cloud/DocRouter.java
index 846c25e..7893102 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/DocRouter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/DocRouter.java
@@ -77,7 +77,7 @@ public abstract class DocRouter {
     routerMap.put(null, plain);     // back compat with 4.0
     routerMap.put(PlainIdRouter.NAME, plain);
     routerMap.put(CompositeIdRouter.NAME, DEFAULT_NAME.equals(CompositeIdRouter.NAME) ? DEFAULT : new CompositeIdRouter());
-    routerMap.put(ImplicitDocRouter.NAME, new ImplicitDocRouter());
+    routerMap.put(ManualDocRouter.NAME, new ManualDocRouter());
     // NOTE: careful that the map keys (the static .NAME members) are filled in by making them final
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/solrj/src/java/org/apache/solr/common/cloud/ImplicitDocRouter.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ImplicitDocRouter.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ImplicitDocRouter.java
deleted file mode 100644
index 0b25fcb..0000000
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ImplicitDocRouter.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.common.cloud;
-
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.params.SolrParams;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import static org.apache.solr.common.params.ShardParams._ROUTE_;
-
-/** This document router is for custom sharding
- */
-public class ImplicitDocRouter extends DocRouter {
-
-  public static final String NAME = "implicit";
-
-  @Override
-  public Slice getTargetSlice(String id, SolrInputDocument sdoc, String route, SolrParams params, DocCollection collection) {
-    String shard = null;
-
-    if (route != null) // if a route is already passed in, try to use it
-      shard = route;
-    else if (sdoc != null) {
-      String f = getRouteField(collection);
-      if(f !=null) {
-        Object o = sdoc.getFieldValue(f);
-        if (o != null) shard = o.toString();
-        else throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No value for field "+f +" in " + sdoc);
-      }
-      if(shard == null) {
-        Object o = sdoc.getFieldValue(_ROUTE_);
-        if (o != null) {
-          shard = o.toString();
-        }
-      }
-    }
-
-    if (shard == null) {
-      shard = params.get(_ROUTE_);
-    }
-
-    if (shard != null) {
-
-      Slice slice = collection.getSlice(shard);
-      if (slice == null) {
-        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No shard called =" + shard + " in " + collection);
-      }
-      return slice;
-    }
-
-    return null;  // no shard specified... use default.
-  }
-
-  @Override
-  public boolean isTargetSlice(String id, SolrInputDocument sdoc, SolrParams params, String shardId, DocCollection collection) {
-
-    // todo : how to handle this?
-    return false;
-  }
-
-  @Override
-  public Collection<Slice> getSearchSlicesSingle(String shardKey, SolrParams params, DocCollection collection) {
-
-    if (shardKey == null) {
-      return collection.getActiveSlices();
-    }
-
-    // assume the shardKey is just a slice name
-    Slice slice = collection.getSlice(shardKey);
-    if (slice == null) {
-      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "implicit router can't find shard " + shardKey + " in collection " + collection.getName());
-    }
-
-    return Collections.singleton(slice);
-  }
-
-  @Override
-  public List<Range> partitionRange(int partitions, Range range) {
-    return null;
-  }
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/solrj/src/java/org/apache/solr/common/cloud/ManualDocRouter.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ManualDocRouter.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ManualDocRouter.java
new file mode 100644
index 0000000..bc7b145
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ManualDocRouter.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.common.cloud;
+
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.params.SolrParams;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import static org.apache.solr.common.params.ShardParams._ROUTE_;
+
+/** This document router is for custom sharding
+ */
+public class ManualDocRouter extends DocRouter {
+
+  public static final String NAME = "manual";
+  @Deprecated public static final String DEPRECATED_NAME = "implicit";
+
+  @Override
+  public Slice getTargetSlice(String id, SolrInputDocument sdoc, String route, SolrParams params, DocCollection collection) {
+    String shard = null;
+
+    if (route != null) // if a route is already passed in, try to use it
+      shard = route;
+    else if (sdoc != null) {
+      String f = getRouteField(collection);
+      if(f !=null) {
+        Object o = sdoc.getFieldValue(f);
+        if (o != null) shard = o.toString();
+        else throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No value for field "+f +" in " + sdoc);
+      }
+      if(shard == null) {
+        Object o = sdoc.getFieldValue(_ROUTE_);
+        if (o != null) {
+          shard = o.toString();
+        }
+      }
+    }
+
+    if (shard == null) {
+      shard = params.get(_ROUTE_);
+    }
+
+    if (shard != null) {
+
+      Slice slice = collection.getSlice(shard);
+      if (slice == null) {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No shard called =" + shard + " in " + collection);
+      }
+      return slice;
+    }
+
+    return null;  // no shard specified... use default.
+  }
+
+  @Override
+  public boolean isTargetSlice(String id, SolrInputDocument sdoc, SolrParams params, String shardId, DocCollection collection) {
+
+    // todo : how to handle this?
+    return false;
+  }
+
+  @Override
+  public Collection<Slice> getSearchSlicesSingle(String shardKey, SolrParams params, DocCollection collection) {
+
+    if (shardKey == null) {
+      return collection.getActiveSlices();
+    }
+
+    // assume the shardKey is just a slice name
+    Slice slice = collection.getSlice(shardKey);
+    if (slice == null) {
+      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "manual router can't find shard " + shardKey + " in collection " + collection.getName());
+    }
+
+    return Collections.singleton(slice);
+  }
+
+  @Override
+  public List<Range> partitionRange(int partitions, Range range) {
+    return null;
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/solrj/src/test/org/apache/solr/client/solrj/CollectionAdminRequestRequiredParamsTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/CollectionAdminRequestRequiredParamsTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/CollectionAdminRequestRequiredParamsTest.java
index 870aa34..d8f71bb 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/CollectionAdminRequestRequiredParamsTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/CollectionAdminRequestRequiredParamsTest.java
@@ -140,8 +140,8 @@ public class CollectionAdminRequestRequiredParamsTest extends LuceneTestCase {
     assertContainsParams(CollectionAdminRequest.createCollection("foo", null, 1, 1).getParams(),
                          ACTION, NAME, ZkStateReader.NUM_SHARDS_PROP,
                          "replicationFactor", ZkStateReader.NRT_REPLICAS);
-    // shortest form w/ "explicitly" choosing "implicit" router
-    assertContainsParams(CollectionAdminRequest.createCollectionWithImplicitRouter("foo", null, "bar", 1).getParams(),
+    // shortest form w/ "explicitly" choosing "manual" router
+    assertContainsParams(CollectionAdminRequest.createCollectionWithManualRouter("foo", null, "bar", 1).getParams(),
                          ACTION, NAME, "shards", "router.name",
                          "replicationFactor", ZkStateReader.NRT_REPLICAS);
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b6ee770f/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCollectionAdminRequest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCollectionAdminRequest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCollectionAdminRequest.java
index 29b273e..be217f9 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCollectionAdminRequest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCollectionAdminRequest.java
@@ -40,9 +40,9 @@ public class TestCollectionAdminRequest extends LuceneTestCase {
   }
   
   @Test
-  public void testInvalidShardNamesRejectedWhenCreatingImplicitCollection() {
+  public void testInvalidShardNamesRejectedWhenCreatingManualCollection() {
     final SolrException e = expectThrows(SolrException.class, () -> {
-        CollectionAdminRequest.createCollectionWithImplicitRouter("fine", "fine", "invalid$shard@name",1,0,0);
+        CollectionAdminRequest.createCollectionWithManualRouter("fine", "fine", "invalid$shard@name",1,0,0);
       });
     final String exceptionMessage = e.getMessage();
     assertTrue(exceptionMessage.contains("Invalid shard"));
@@ -52,7 +52,7 @@ public class TestCollectionAdminRequest extends LuceneTestCase {
   
   @Test
   public void testInvalidShardNamesRejectedWhenCallingSetShards() {
-    CollectionAdminRequest.Create request = CollectionAdminRequest.createCollectionWithImplicitRouter("fine",null,"fine",1);
+    CollectionAdminRequest.Create request = CollectionAdminRequest.createCollectionWithManualRouter("fine",null,"fine",1);
     final SolrException e = expectThrows(SolrException.class, () -> {
         request.setShards("invalid$shard@name");
       });