This is an automated email from the ASF dual-hosted git repository.

epugh pushed a commit to branch branch_10_0
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_10_0 by this push:
     new 327121d0e8c SOLR-16312: Merge AbstractDistribZkTestBase into 
AbstractFullDistribZkTestBase (#3912)
327121d0e8c is described below

commit 327121d0e8caacf65bef9f4f8487dd055abe55fd
Author: Eric Pugh <[email protected]>
AuthorDate: Mon Dec 1 07:31:41 2025 -0500

    SOLR-16312: Merge AbstractDistribZkTestBase into 
AbstractFullDistribZkTestBase (#3912)
---
 .../org/apache/solr/cli/SolrCLIZkToolsTest.java    |  20 +-
 .../org/apache/solr/cli/ZkSubcommandsTest.java     |   4 +-
 .../solr/cloud/ChaosMonkeyShardSplitTest.java      |   8 +-
 .../solr/cloud/LeaderElectionContextKeyTest.java   |   4 +-
 .../test/org/apache/solr/cloud/OverseerTest.java   |   2 +-
 .../solr/cloud/ParallelCommitExecutionTest.java    |   2 +-
 .../TestCloudPhrasesIdentificationComponent.java   |   2 +-
 .../solr/cloud/TestCloudPseudoReturnFields.java    |   2 +-
 .../org/apache/solr/cloud/TestCloudRecovery2.java  |   2 +-
 .../apache/solr/cloud/TestRandomFlRTGCloud.java    |   2 +-
 .../cloud/TestStressCloudBlindAtomicUpdates.java   |   2 +-
 .../LocalFSCloudIncrementalBackupTest.java         |   4 +-
 .../solr/cloud/api/collections/ShardSplitTest.java |  70 ++--
 .../TestCollectionsAPIViaSolrCloudCluster.java     |   6 +-
 .../core/snapshots/TestSolrCloudSnapshots.java     |   4 +-
 .../component/CustomHighlightComponentTest.java    |   4 +-
 .../component/SearchHandlerAppendsCloudTest.java   |   4 +-
 .../solr/handler/component/UpdateLogCloudTest.java |   8 +-
 .../transform/TestSubQueryTransformerDistrib.java  |   6 +-
 .../search/facet/TestCloudJSONFacetJoinDomain.java |   4 +-
 .../solr/search/facet/TestCloudJSONFacetSKG.java   |   4 +-
 .../search/facet/TestCloudJSONFacetSKGEquiv.java   |   4 +-
 .../solr/search/join/TestCloudNestedDocsSort.java  |   4 +-
 .../apache/solr/servlet/HttpSolrCallCloudTest.java |   4 +-
 .../client/solrj/io/graph/GraphExpressionTest.java |   4 +-
 .../apache/solr/client/solrj/io/sql/JdbcTest.java  |   4 +-
 .../client/solrj/io/stream/JDBCStreamTest.java     |   4 +-
 .../client/solrj/io/stream/MathExpressionTest.java |   4 +-
 .../solrj/io/stream/SelectWithEvaluatorsTest.java  |   4 +-
 .../solrj/io/stream/StreamDecoratorTest.java       |   4 +-
 .../solrj/impl/CloudHttp2SolrClientTest.java       |   6 +-
 .../solr/cloud/AbstractDistribZkTestBase.java      | 402 ---------------------
 .../solr/cloud/AbstractFullDistribZkTestBase.java  | 319 +++++++++++++++-
 .../apache/solr/cloud/MultiSolrCloudTestCase.java  |   2 +-
 .../AbstractCloudBackupRestoreTestCase.java        |   4 +-
 .../collections/AbstractIncrementalBackupTest.java |   8 +-
 .../client/solrj/apache/CloudSolrClientTest.java   |   6 +-
 37 files changed, 431 insertions(+), 516 deletions(-)

diff --git a/solr/core/src/test/org/apache/solr/cli/SolrCLIZkToolsTest.java 
b/solr/core/src/test/org/apache/solr/cli/SolrCLIZkToolsTest.java
index c7101a0f493..d7c86595dbc 100644
--- a/solr/core/src/test/org/apache/solr/cli/SolrCLIZkToolsTest.java
+++ b/solr/core/src/test/org/apache/solr/cli/SolrCLIZkToolsTest.java
@@ -27,7 +27,7 @@ import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkMaintenanceUtils;
@@ -72,7 +72,7 @@ public class SolrCLIZkToolsTest extends SolrCloudTestCase {
 
     Path configSet = TEST_PATH().resolve("configsets");
     Path srcPathCheck = configSet.resolve("cloud-subdirs").resolve("conf");
-    AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"upconfig1", zkAddr);
+    AbstractFullDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"upconfig1", zkAddr);
     // Now do we have that config up on ZK?
     verifyZkLocalPathsMatch(srcPathCheck, "/configs/upconfig1");
 
@@ -115,7 +115,7 @@ public class SolrCLIZkToolsTest extends SolrCloudTestCase {
 
     Path configSet = TEST_PATH().resolve("configsets");
     Path srcPathCheck = configSet.resolve("cloud-subdirs").resolve("conf");
-    AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"downconfig1", zkAddr);
+    AbstractFullDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"downconfig1", zkAddr);
     // Now do we have that config up on ZK?
     verifyZkLocalPathsMatch(srcPathCheck, "/configs/downconfig1");
 
@@ -134,7 +134,7 @@ public class SolrCLIZkToolsTest extends SolrCloudTestCase {
     Files.createFile(emptyFile);
 
     // Now copy it up and back and insure it's still a file in the new place
-    AbstractDistribZkTestBase.copyConfigUp(tmp.getParent(), "myconfset", 
"downconfig2", zkAddr);
+    AbstractFullDistribZkTestBase.copyConfigUp(tmp.getParent(), "myconfset", 
"downconfig2", zkAddr);
     Path tmp2 = createTempDir("downConfigNewPlace2");
     args =
         new String[] {
@@ -157,7 +157,7 @@ public class SolrCLIZkToolsTest extends SolrCloudTestCase {
     Path configSet = TEST_PATH().resolve("configsets");
     Path srcPathCheck = configSet.resolve("cloud-subdirs").resolve("conf");
 
-    AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "cp1", 
zkAddr);
+    AbstractFullDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"cp1", zkAddr);
 
     // Now copy it somewhere else on ZK.
     String[] args =
@@ -398,7 +398,7 @@ public class SolrCLIZkToolsTest extends SolrCloudTestCase {
     Path configSet = TEST_PATH().resolve("configsets");
     Path srcPathCheck = configSet.resolve("cloud-subdirs").resolve("conf");
 
-    AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "mv1", 
zkAddr);
+    AbstractFullDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"mv1", zkAddr);
 
     // Now move it somewhere else.
     String[] args = new String[] {"mv", "--zk-host", zkAddr, 
"zk:/configs/mv1", "zk:/mv2"};
@@ -467,7 +467,7 @@ public class SolrCLIZkToolsTest extends SolrCloudTestCase {
 
     Path configSet = TEST_PATH().resolve("configsets");
 
-    AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"lister", zkAddr);
+    AbstractFullDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"lister", zkAddr);
 
     // Should only find a single level.
     String[] args = new String[] {"ls", "--zk-host", zkAddr, "/configs"};
@@ -540,8 +540,8 @@ public class SolrCLIZkToolsTest extends SolrCloudTestCase {
     Path configSet = TEST_PATH().resolve("configsets");
     Path srcPathCheck = configSet.resolve("cloud-subdirs").resolve("conf");
 
-    AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "rm1", 
zkAddr);
-    AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "rm2", 
zkAddr);
+    AbstractFullDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"rm1", zkAddr);
+    AbstractFullDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"rm2", zkAddr);
 
     // Should fail if recursive not set.
     String[] args = new String[] {"rm", "--zk-host", zkAddr, "/configs/rm1"};
@@ -580,7 +580,7 @@ public class SolrCLIZkToolsTest extends SolrCloudTestCase {
     // This should silently just refuse to do anything to the / or /zookeeper
     args = new String[] {"rm", "--recursive", "--zk-host", zkAddr, "zk:/"};
 
-    AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "rm3", 
zkAddr);
+    AbstractFullDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", 
"rm3", zkAddr);
     res = CLITestHelper.runTool(args, ZkRmTool.class);
     assertNotEquals("Should fail when trying to remove /.", 0, res);
   }
diff --git a/solr/core/src/test/org/apache/solr/cli/ZkSubcommandsTest.java 
b/solr/core/src/test/org/apache/solr/cli/ZkSubcommandsTest.java
index 2dad25d6719..26cc304ef84 100644
--- a/solr/core/src/test/org/apache/solr/cli/ZkSubcommandsTest.java
+++ b/solr/core/src/test/org/apache/solr/cli/ZkSubcommandsTest.java
@@ -28,7 +28,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.Stream;
 import org.apache.lucene.tests.mockfile.FilterPath;
 import org.apache.solr.SolrTestCaseJ4;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.AbstractZkTestCase;
 import org.apache.solr.cloud.ZkConfigSetService;
 import org.apache.solr.cloud.ZkTestServer;
@@ -605,7 +605,7 @@ public class ZkSubcommandsTest extends SolrTestCaseJ4 {
         new SolrZkClient.Builder()
             .withUrl(zkServer.getZkAddress())
             .withTimeout(
-                AbstractDistribZkTestBase.DEFAULT_CONNECTION_TIMEOUT, 
TimeUnit.MILLISECONDS)
+                AbstractFullDistribZkTestBase.DEFAULT_CONNECTION_TIMEOUT, 
TimeUnit.MILLISECONDS)
             .build()) {
       zkClient.getData("/", null, null, true);
     } catch (KeeperException.NoAuthException e) {
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java 
b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
index 103efc7856c..ca017ca376b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
@@ -67,9 +67,11 @@ public class ChaosMonkeyShardSplitTest extends 
ShardSplitTest {
 
     ClusterState clusterState = cloudClient.getClusterState();
     final DocRouter router =
-        
clusterState.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION).getRouter();
+        
clusterState.getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION).getRouter();
     Slice shard1 =
-        
clusterState.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION).getSlice(SHARD1);
+        clusterState
+            .getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION)
+            .getSlice(SHARD1);
     DocRouter.Range shard1Range =
         shard1.getRange() != null ? shard1.getRange() : router.fullRange();
     final List<DocRouter.Range> ranges = router.partitionRange(2, shard1Range);
@@ -142,7 +144,7 @@ public class ChaosMonkeyShardSplitTest extends 
ShardSplitTest {
       killerThread.start();
       killCounter.incrementAndGet();
 
-      splitShard(AbstractDistribZkTestBase.DEFAULT_COLLECTION, SHARD1, null, 
null, false);
+      splitShard(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION, SHARD1, 
null, null, false);
 
       log.info("Layout after split: \n");
       printLayout();
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionContextKeyTest.java 
b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionContextKeyTest.java
index ea48ae83a96..e8519f6382c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionContextKeyTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionContextKeyTest.java
@@ -59,9 +59,9 @@ public class LeaderElectionContextKeyTest extends 
SolrCloudTestCase {
           .process(cluster.getSolrClient());
     }
 
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         "testCollection1", cluster.getZkStateReader(), false, true, 30);
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         "testCollection2", cluster.getZkStateReader(), false, true, 30);
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java 
b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
index b1aaf9e457b..757da989ad9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.solr.cloud;
 
-import static 
org.apache.solr.cloud.AbstractDistribZkTestBase.verifyReplicaStatus;
+import static 
org.apache.solr.cloud.AbstractFullDistribZkTestBase.verifyReplicaStatus;
 import static org.apache.zookeeper.WatchedEvent.NO_ZXID;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/ParallelCommitExecutionTest.java 
b/solr/core/src/test/org/apache/solr/cloud/ParallelCommitExecutionTest.java
index 1f07d6fcf45..234640f3256 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ParallelCommitExecutionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ParallelCommitExecutionTest.java
@@ -100,7 +100,7 @@ public class ParallelCommitExecutionTest extends 
SolrCloudTestCase {
 
   public static void waitForRecoveriesToFinish(CloudSolrClient client) throws 
Exception {
     assertNotNull(client.getDefaultCollection());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         client.getDefaultCollection(), ZkStateReader.from(client), true, true, 
330);
   }
 
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/TestCloudPhrasesIdentificationComponent.java
 
b/solr/core/src/test/org/apache/solr/cloud/TestCloudPhrasesIdentificationComponent.java
index c0d79824b8b..1bd20b5db22 100644
--- 
a/solr/core/src/test/org/apache/solr/cloud/TestCloudPhrasesIdentificationComponent.java
+++ 
b/solr/core/src/test/org/apache/solr/cloud/TestCloudPhrasesIdentificationComponent.java
@@ -203,7 +203,7 @@ public class TestCloudPhrasesIdentificationComponent 
extends SolrCloudTestCase {
 
   public static void waitForRecoveriesToFinish(CloudSolrClient client) throws 
Exception {
     assertNotNull(client.getDefaultCollection());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         client.getDefaultCollection(), ZkStateReader.from(client), true, true, 
330);
   }
 }
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/TestCloudPseudoReturnFields.java 
b/solr/core/src/test/org/apache/solr/cloud/TestCloudPseudoReturnFields.java
index 483c9b9ecf5..81969dae345 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudPseudoReturnFields.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudPseudoReturnFields.java
@@ -1130,7 +1130,7 @@ public class TestCloudPseudoReturnFields extends 
SolrCloudTestCase {
 
   public static void waitForRecoveriesToFinish(CloudSolrClient client) throws 
Exception {
     assertNotNull(client.getDefaultCollection());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         client.getDefaultCollection(), ZkStateReader.from(client), true, true, 
330);
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery2.java 
b/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery2.java
index 3297529cfdf..84f8dbf3086 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery2.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery2.java
@@ -41,7 +41,7 @@ public class TestCloudRecovery2 extends SolrCloudTestCase {
 
     CollectionAdminRequest.createCollection(COLLECTION, "config", 1, 2)
         .process(cluster.getSolrClient());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         COLLECTION, cluster.getZkStateReader(), false, true, 30);
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestRandomFlRTGCloud.java 
b/solr/core/src/test/org/apache/solr/cloud/TestRandomFlRTGCloud.java
index 3cf825f02bd..15cfa0d2c0a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestRandomFlRTGCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestRandomFlRTGCloud.java
@@ -625,7 +625,7 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase 
{
 
   public static void waitForRecoveriesToFinish(CloudSolrClient client) throws 
Exception {
     assertNotNull(client.getDefaultCollection());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         client.getDefaultCollection(), ZkStateReader.from(client), true, true, 
330);
   }
 
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java
 
b/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java
index 72593d91e2f..8f692d3006f 100644
--- 
a/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java
+++ 
b/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java
@@ -525,7 +525,7 @@ public class TestStressCloudBlindAtomicUpdates extends 
SolrCloudTestCase {
   public static void waitForRecoveriesToFinish(CloudSolrClient client) throws 
Exception {
     assertNotNull(client.getDefaultCollection());
     
ZkStateReader.from(client).forceUpdateCollection(client.getDefaultCollection());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         client.getDefaultCollection(), ZkStateReader.from(client), true, true, 
330);
   }
 
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/api/collections/LocalFSCloudIncrementalBackupTest.java
 
b/solr/core/src/test/org/apache/solr/cloud/api/collections/LocalFSCloudIncrementalBackupTest.java
index 93d95752670..7661e6ce71e 100644
--- 
a/solr/core/src/test/org/apache/solr/cloud/api/collections/LocalFSCloudIncrementalBackupTest.java
+++ 
b/solr/core/src/test/org/apache/solr/cloud/api/collections/LocalFSCloudIncrementalBackupTest.java
@@ -25,7 +25,7 @@ import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.core.backup.repository.BackupRepository;
 import org.junit.BeforeClass;
@@ -140,7 +140,7 @@ public class LocalFSCloudIncrementalBackupTest extends 
AbstractIncrementalBackup
           .setRepositoryName(BACKUP_REPO_NAME)
           .processAndWait(solrClient, 500);
 
-      AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+      AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
           restoreCollectionName, ZkStateReader.from(solrClient), false, false, 
3);
       assertEquals(
           numDocs,
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java 
b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
index 9a827e2a8b7..f231974cc90 100644
--- 
a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
+++ 
b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
@@ -49,7 +49,7 @@ import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.client.solrj.response.RequestStatusState;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.BasicDistributedZkTest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.cloud.StoppableIndexingThread;
@@ -134,7 +134,9 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     waitForThingsToLevelOut(15, TimeUnit.SECONDS);
 
     DocCollection defCol =
-        
cloudClient.getClusterState().getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION);
+        cloudClient
+            .getClusterState()
+            .getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION);
     Replica replica = defCol.getReplicas().get(0);
     String nodeName = replica.getNodeName();
 
@@ -351,7 +353,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
   private void splitAfterFailedSplit() throws KeeperException, 
InterruptedException {
     try {
       CollectionAdminRequest.SplitShard splitShard =
-          
CollectionAdminRequest.splitShard(AbstractDistribZkTestBase.DEFAULT_COLLECTION);
+          
CollectionAdminRequest.splitShard(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION);
       splitShard.setShardName(SHARD1);
       splitShard.process(cloudClient);
       fail("Shard split was not supposed to succeed after failure injection!");
@@ -361,9 +363,10 @@ public class ShardSplitTest extends BasicDistributedZkTest 
{
 
     // assert that sub-shards cores exist and sub-shard is in construction 
state
     ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
-    
zkStateReader.forceUpdateCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION);
+    
zkStateReader.forceUpdateCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION);
     ClusterState state = zkStateReader.getClusterState();
-    DocCollection collection = 
state.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION);
+    DocCollection collection =
+        state.getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION);
 
     // should be cleaned up
     Slice shard10 = collection.getSlice(SHARD1_0);
@@ -376,7 +379,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     TestInjection.reset(); // let the split succeed
     try {
       CollectionAdminRequest.SplitShard splitShard =
-          
CollectionAdminRequest.splitShard(AbstractDistribZkTestBase.DEFAULT_COLLECTION);
+          
CollectionAdminRequest.splitShard(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION);
       splitShard.setShardName(SHARD1);
       splitShard.process(cloudClient);
       // Yay!
@@ -516,7 +519,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
         () -> {
           ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
           zkStateReader.registerCollectionStateWatcher(
-              AbstractDistribZkTestBase.DEFAULT_COLLECTION,
+              AbstractFullDistribZkTestBase.DEFAULT_COLLECTION,
               (liveNodes, collectionState) -> {
                 if (stop.get()) {
                   return true; // abort and remove the watch
@@ -527,7 +530,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
                   if (killed.compareAndSet(false, true)) {
                     log.info(
                         "Monkey thread found 2 replicas for {} {}",
-                        AbstractDistribZkTestBase.DEFAULT_COLLECTION,
+                        AbstractFullDistribZkTestBase.DEFAULT_COLLECTION,
                         SHARD1);
                     CloudJettyRunner cjetty = shardToLeaderJetty.get(SHARD1);
                     try {
@@ -543,7 +546,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
                 }
                 log.info(
                     "Monkey thread found only one replica for {} {}",
-                    AbstractDistribZkTestBase.DEFAULT_COLLECTION,
+                    AbstractFullDistribZkTestBase.DEFAULT_COLLECTION,
                     SHARD1);
                 return false;
               });
@@ -553,7 +556,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     monkeyThread.start();
     try {
       CollectionAdminRequest.SplitShard splitShard =
-          
CollectionAdminRequest.splitShard(AbstractDistribZkTestBase.DEFAULT_COLLECTION);
+          
CollectionAdminRequest.splitShard(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION);
       splitShard.setShardName(SHARD1);
       String asyncId = splitShard.processAsync(cloudClient);
       RequestStatusState splitStatus = null;
@@ -590,23 +593,23 @@ public class ShardSplitTest extends 
BasicDistributedZkTest {
       }
       cjetty.jetty.start();
       ZkStateReader.from(cloudClient)
-          .forceUpdateCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION);
+          
.forceUpdateCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION);
       if (log.isInfoEnabled()) {
         log.info(
             "Current collection state: {}",
-            
printClusterStateInfo(AbstractDistribZkTestBase.DEFAULT_COLLECTION));
+            
printClusterStateInfo(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION));
       }
 
       // true if sub-shard states switch to 'active' eventually
       AtomicBoolean areSubShardsActive = new AtomicBoolean(false);
       if (splitStatus == RequestStatusState.COMPLETED) {
         // all sub-shard replicas were created successfully so all cores must 
recover eventually
-        
waitForRecoveriesToFinish(AbstractDistribZkTestBase.DEFAULT_COLLECTION, true);
+        
waitForRecoveriesToFinish(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION, 
true);
         // let's wait for the overseer to switch shard states
         CountDownLatch latch = new CountDownLatch(1);
         ZkStateReader.from(cloudClient)
             .registerCollectionStateWatcher(
-                AbstractDistribZkTestBase.DEFAULT_COLLECTION,
+                AbstractFullDistribZkTestBase.DEFAULT_COLLECTION,
                 (liveNodes, collectionState) -> {
                   Slice parent = collectionState.getSlice(SHARD1);
                   Slice slice10 = collectionState.getSlice(SHARD1_0);
@@ -657,7 +660,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
       if (areSubShardsActive.get()) {
         ClusterState clusterState = cloudClient.getClusterState();
         DocCollection collection =
-            
clusterState.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION);
+            
clusterState.getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION);
         int numReplicasChecked = 
assertConsistentReplicas(collection.getSlice(SHARD1_0));
         assertEquals(
             "We should have checked consistency for exactly 2 replicas of 
shard1_0",
@@ -782,9 +785,11 @@ public class ShardSplitTest extends BasicDistributedZkTest 
{
   private void incompleteOrOverlappingCustomRangeTest() throws Exception {
     ClusterState clusterState = cloudClient.getClusterState();
     final DocRouter router =
-        
clusterState.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION).getRouter();
+        
clusterState.getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION).getRouter();
     Slice shard1 =
-        
clusterState.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION).getSlice(SHARD1);
+        clusterState
+            .getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION)
+            .getSlice(SHARD1);
     DocRouter.Range shard1Range =
         shard1.getRange() != null ? shard1.getRange() : router.fullRange();
 
@@ -794,7 +799,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     // test with only one range
     subRanges.add(ranges.get(0));
     try {
-      splitShard(AbstractDistribZkTestBase.DEFAULT_COLLECTION, SHARD1, 
subRanges, null, false);
+      splitShard(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION, SHARD1, 
subRanges, null, false);
       fail("Shard splitting with just one custom hash range should not 
succeed");
     } catch (SolrClient.RemoteSolrException e) {
       log.info("Expected exception:", e);
@@ -805,7 +810,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     subRanges.add(ranges.get(3)); // order shouldn't matter
     subRanges.add(ranges.get(0));
     try {
-      splitShard(AbstractDistribZkTestBase.DEFAULT_COLLECTION, SHARD1, 
subRanges, null, false);
+      splitShard(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION, SHARD1, 
subRanges, null, false);
       fail("Shard splitting with missing hashes in between given ranges should 
not succeed");
     } catch (SolrClient.RemoteSolrException e) {
       log.info("Expected exception:", e);
@@ -818,7 +823,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     subRanges.add(ranges.get(2));
     subRanges.add(new DocRouter.Range(ranges.get(3).min - 15, 
ranges.get(3).max));
     try {
-      splitShard(AbstractDistribZkTestBase.DEFAULT_COLLECTION, SHARD1, 
subRanges, null, false);
+      splitShard(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION, SHARD1, 
subRanges, null, false);
       fail("Shard splitting with overlapping ranges should not succeed");
     } catch (SolrClient.RemoteSolrException e) {
       log.info("Expected exception:", e);
@@ -829,9 +834,11 @@ public class ShardSplitTest extends BasicDistributedZkTest 
{
   private void splitByUniqueKeyTest() throws Exception {
     ClusterState clusterState = cloudClient.getClusterState();
     final DocRouter router =
-        
clusterState.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION).getRouter();
+        
clusterState.getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION).getRouter();
     Slice shard1 =
-        
clusterState.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION).getSlice(SHARD1);
+        clusterState
+            .getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION)
+            .getSlice(SHARD1);
     DocRouter.Range shard1Range =
         shard1.getRange() != null ? shard1.getRange() : router.fullRange();
     List<DocRouter.Range> subRanges = new ArrayList<>();
@@ -849,12 +856,12 @@ public class ShardSplitTest extends 
BasicDistributedZkTest {
     int numReplicas = shard1.getReplicas().size();
 
     ZkStateReader.from(cloudClient)
-        .forceUpdateCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION);
+        
.forceUpdateCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION);
     clusterState = cloudClient.getClusterState();
     if (log.isDebugEnabled()) {
       log.debug(
           "-- COLLECTION: {}",
-          
clusterState.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION));
+          
clusterState.getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION));
     }
     del("*:*");
     for (int id = 0; id <= 100; id++) {
@@ -908,7 +915,8 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     try {
       for (int i = 0; i < 3; i++) {
         try {
-          splitShard(AbstractDistribZkTestBase.DEFAULT_COLLECTION, SHARD1, 
subRanges, null, false);
+          splitShard(
+              AbstractFullDistribZkTestBase.DEFAULT_COLLECTION, SHARD1, 
subRanges, null, false);
           log.info("Layout after split: \n");
           printLayout();
           break;
@@ -1153,11 +1161,11 @@ public class ShardSplitTest extends 
BasicDistributedZkTest {
       clusterState = zkStateReader.getClusterState();
       slice1_0 =
           clusterState
-              .getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION)
+              .getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION)
               .getSlice("shard1_0");
       slice1_1 =
           clusterState
-              .getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION)
+              .getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION)
               .getSlice("shard1_1");
       if (slice1_0.getState() == Slice.State.ACTIVE && slice1_1.getState() == 
Slice.State.ACTIVE) {
         break;
@@ -1189,7 +1197,7 @@ public class ShardSplitTest extends 
BasicDistributedZkTest {
     SolrQuery query = new SolrQuery("*:*").setRows(1000).setFields("id", 
"_version_");
     query.set("distrib", false);
 
-    Replica shard1_0 = 
getLeaderFromZk(AbstractDistribZkTestBase.DEFAULT_COLLECTION, SHARD1_0);
+    Replica shard1_0 = 
getLeaderFromZk(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION, SHARD1_0);
     QueryResponse response;
     try (SolrClient shard1_0Client =
         getHttpSolrClient(shard1_0.getBaseUrl(), shard1_0.getCoreName())) {
@@ -1197,7 +1205,7 @@ public class ShardSplitTest extends 
BasicDistributedZkTest {
     }
     long shard10Count = response.getResults().getNumFound();
 
-    Replica shard1_1 = 
getLeaderFromZk(AbstractDistribZkTestBase.DEFAULT_COLLECTION, SHARD1_1);
+    Replica shard1_1 = 
getLeaderFromZk(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION, SHARD1_1);
     QueryResponse response2;
     try (SolrClient shard1_1Client =
         getHttpSolrClient(shard1_1.getBaseUrl(), shard1_1.getCoreName())) {
@@ -1217,7 +1225,9 @@ public class ShardSplitTest extends 
BasicDistributedZkTest {
 
     ClusterState clusterState = cloudClient.getClusterState();
     Slice slice =
-        
clusterState.getCollection(AbstractDistribZkTestBase.DEFAULT_COLLECTION).getSlice(shard);
+        clusterState
+            .getCollection(AbstractFullDistribZkTestBase.DEFAULT_COLLECTION)
+            .getSlice(shard);
     long[] numFound = new long[slice.getReplicasMap().size()];
     int c = 0;
     for (Replica replica : slice.getReplicas()) {
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java
 
b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java
index 5b7efcfb940..a836b07401e 100644
--- 
a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java
+++ 
b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java
@@ -37,7 +37,7 @@ import 
org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.ClusterState;
@@ -167,7 +167,7 @@ public class TestCollectionsAPIViaSolrCloudCluster extends 
SolrCloudTestCase {
     assertEquals(nodeCount, cluster.getJettySolrRunners().size());
 
     CollectionAdminRequest.deleteCollection(collectionName).process(client);
-    AbstractDistribZkTestBase.waitForCollectionToDisappear(
+    AbstractFullDistribZkTestBase.waitForCollectionToDisappear(
         collectionName, ZkStateReader.from(client), true, 330);
 
     // create it again
@@ -206,7 +206,7 @@ public class TestCollectionsAPIViaSolrCloudCluster extends 
SolrCloudTestCase {
 
     // delete the collection
     CollectionAdminRequest.deleteCollection(collectionName).process(client);
-    AbstractDistribZkTestBase.waitForCollectionToDisappear(
+    AbstractFullDistribZkTestBase.waitForCollectionToDisappear(
         collectionName, ZkStateReader.from(client), true, 330);
   }
 
diff --git 
a/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCloudSnapshots.java 
b/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCloudSnapshots.java
index a6e04654eb6..9b23db09695 100644
--- 
a/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCloudSnapshots.java
+++ 
b/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCloudSnapshots.java
@@ -33,7 +33,7 @@ import 
org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.CoreAdminRequest.ListSnapshots;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.client.solrj.response.RequestStatusState;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
@@ -216,7 +216,7 @@ public class TestSolrCloudSnapshots extends 
SolrCloudTestCase {
       } else {
         assertEquals(RequestStatusState.COMPLETED, 
restore.processAndWait(solrClient, 30)); // async
       }
-      AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+      AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
           restoreCollectionName, ZkStateReader.from(solrClient), 
log.isDebugEnabled(), true, 30);
       BackupRestoreUtils.verifyDocs(nDocs, solrClient, restoreCollectionName);
     }
diff --git 
a/solr/core/src/test/org/apache/solr/handler/component/CustomHighlightComponentTest.java
 
b/solr/core/src/test/org/apache/solr/handler/component/CustomHighlightComponentTest.java
index 3c7c79ca904..299940aff9a 100644
--- 
a/solr/core/src/test/org/apache/solr/handler/component/CustomHighlightComponentTest.java
+++ 
b/solr/core/src/test/org/apache/solr/handler/component/CustomHighlightComponentTest.java
@@ -27,7 +27,7 @@ import 
org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.ConfigRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.util.NamedList;
@@ -118,7 +118,7 @@ public class CustomHighlightComponentTest extends 
SolrCloudTestCase {
     // create an empty collection
     CollectionAdminRequest.createCollection(COLLECTION, "conf", numShards, 
numReplicas)
         .process(cluster.getSolrClient());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         COLLECTION, cluster.getZkStateReader(), false, true, DEFAULT_TIMEOUT);
   }
 
diff --git 
a/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerAppendsCloudTest.java
 
b/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerAppendsCloudTest.java
index 1d9c2ca96e1..cb6b60b2681 100644
--- 
a/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerAppendsCloudTest.java
+++ 
b/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerAppendsCloudTest.java
@@ -26,7 +26,7 @@ import 
org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.ConfigRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -58,7 +58,7 @@ public class SearchHandlerAppendsCloudTest extends 
SolrCloudTestCase {
     // create an empty collection
     CollectionAdminRequest.createCollection(COLLECTION, "conf", NUM_SHARDS, 
NUM_REPLICAS)
         .processAndWait(cluster.getSolrClient(), DEFAULT_TIMEOUT);
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         COLLECTION, ZkStateReader.from(cluster.getSolrClient()), false, true, 
DEFAULT_TIMEOUT);
   }
 
diff --git 
a/solr/core/src/test/org/apache/solr/handler/component/UpdateLogCloudTest.java 
b/solr/core/src/test/org/apache/solr/handler/component/UpdateLogCloudTest.java
index b4b7efe17d5..c36da38c8cd 100644
--- 
a/solr/core/src/test/org/apache/solr/handler/component/UpdateLogCloudTest.java
+++ 
b/solr/core/src/test/org/apache/solr/handler/component/UpdateLogCloudTest.java
@@ -25,7 +25,7 @@ import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.MockDirectoryFactory;
@@ -68,7 +68,7 @@ public class UpdateLogCloudTest extends SolrCloudTestCase {
     // create an empty collection
     CollectionAdminRequest.createCollection(COLLECTION, "conf", NUM_SHARDS, 
NUM_REPLICAS)
         .processAndWait(cluster.getSolrClient(), DEFAULT_TIMEOUT);
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         COLLECTION, cluster.getZkStateReader(), false, true, DEFAULT_TIMEOUT);
   }
 
@@ -102,7 +102,7 @@ public class UpdateLogCloudTest extends SolrCloudTestCase {
     }
 
     cluster.getJettySolrRunner(specialIdx).stop();
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         COLLECTION, cluster.getZkStateReader(), false, true, DEFAULT_TIMEOUT);
 
     new UpdateRequest()
@@ -112,7 +112,7 @@ public class UpdateLogCloudTest extends SolrCloudTestCase {
         .commit(cluster.getSolrClient(), COLLECTION);
 
     cluster.getJettySolrRunner(specialIdx).start();
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         COLLECTION, cluster.getZkStateReader(), false, true, DEFAULT_TIMEOUT);
 
     int idx = 0;
diff --git 
a/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformerDistrib.java
 
b/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformerDistrib.java
index e4cb7ae836f..565c73dceec 100644
--- 
a/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformerDistrib.java
+++ 
b/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformerDistrib.java
@@ -43,7 +43,7 @@ import 
org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
@@ -129,9 +129,9 @@ public class TestSubQueryTransformerDistrib extends 
SolrCloudTestCase {
     CloudSolrClient client = cluster.getSolrClient();
 
     ZkStateReader zkStateReader = ZkStateReader.from(client);
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(people, zkStateReader, 
true, true, 30);
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(people, 
zkStateReader, true, true, 30);
 
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(depts, zkStateReader, 
false, true, 30);
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(depts, 
zkStateReader, false, true, 30);
   }
 
   @SuppressWarnings("serial")
diff --git 
a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetJoinDomain.java
 
b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetJoinDomain.java
index 594726be18e..0644631e7cb 100644
--- 
a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetJoinDomain.java
+++ 
b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetJoinDomain.java
@@ -35,7 +35,7 @@ import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.cloud.TestCloudPivotFacet;
 import org.apache.solr.common.SolrException;
@@ -1063,7 +1063,7 @@ public class TestCloudJSONFacetJoinDomain extends 
SolrCloudTestCase {
 
   public static void waitForRecoveriesToFinish(CloudSolrClient client) throws 
Exception {
     assertNotNull(client.getDefaultCollection());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         client.getDefaultCollection(), ZkStateReader.from(client), true, true, 
330);
   }
 }
diff --git 
a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKG.java 
b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKG.java
index 06ada43f108..f1046806863 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKG.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKG.java
@@ -38,7 +38,7 @@ import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -908,7 +908,7 @@ public class TestCloudJSONFacetSKG extends 
SolrCloudTestCase {
 
   public static void waitForRecoveriesToFinish(CloudSolrClient client) throws 
Exception {
     assertNotNull(client.getDefaultCollection());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         client.getDefaultCollection(), ZkStateReader.from(client), true, true, 
330);
   }
 
diff --git 
a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java
 
b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java
index c612b1a9277..2ce2bd10563 100644
--- 
a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java
+++ 
b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java
@@ -40,7 +40,7 @@ import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -1316,7 +1316,7 @@ public class TestCloudJSONFacetSKGEquiv extends 
SolrCloudTestCase {
 
   public static void waitForRecoveriesToFinish(CloudSolrClient client) throws 
Exception {
     assertNotNull(client.getDefaultCollection());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         client.getDefaultCollection(), ZkStateReader.from(client), true, true, 
330);
   }
 
diff --git 
a/solr/core/src/test/org/apache/solr/search/join/TestCloudNestedDocsSort.java 
b/solr/core/src/test/org/apache/solr/search/join/TestCloudNestedDocsSort.java
index 2c0cea7e18b..0098aafc35d 100644
--- 
a/solr/core/src/test/org/apache/solr/search/join/TestCloudNestedDocsSort.java
+++ 
b/solr/core/src/test/org/apache/solr/search/join/TestCloudNestedDocsSort.java
@@ -29,7 +29,7 @@ import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrInputDocument;
@@ -76,7 +76,7 @@ public class TestCloudNestedDocsSort extends 
SolrCloudTestCase {
     client = 
cluster.basicSolrClientBuilder().withDefaultCollection("collection1").build();
 
     ZkStateReader zkStateReader = ZkStateReader.from(client);
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         "collection1", zkStateReader, true, true, 30);
     {
       int id = 42;
diff --git 
a/solr/core/src/test/org/apache/solr/servlet/HttpSolrCallCloudTest.java 
b/solr/core/src/test/org/apache/solr/servlet/HttpSolrCallCloudTest.java
index 447ce487506..c3db96528dd 100644
--- a/solr/core/src/test/org/apache/solr/servlet/HttpSolrCallCloudTest.java
+++ b/solr/core/src/test/org/apache/solr/servlet/HttpSolrCallCloudTest.java
@@ -29,7 +29,7 @@ import java.util.HashSet;
 import java.util.Set;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.embedded.JettySolrRunner;
@@ -53,7 +53,7 @@ public class HttpSolrCallCloudTest extends SolrCloudTestCase {
 
     CollectionAdminRequest.createCollection(COLLECTION, "config", NUM_SHARD, 
REPLICA_FACTOR)
         .process(cluster.getSolrClient());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         COLLECTION, cluster.getZkStateReader(), false, true, 30);
   }
 
diff --git 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/graph/GraphExpressionTest.java
 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/graph/GraphExpressionTest.java
index 90a47751395..15b5d31e669 100644
--- 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/graph/GraphExpressionTest.java
+++ 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/graph/GraphExpressionTest.java
@@ -52,7 +52,7 @@ import 
org.apache.solr.client.solrj.io.stream.metrics.SumMetric;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.NamedList;
@@ -89,7 +89,7 @@ public class GraphExpressionTest extends SolrCloudTestCase {
 
     CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1)
         .process(cluster.getSolrClient());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         COLLECTION, cluster.getZkStateReader(), false, true, TIMEOUT);
   }
 
diff --git 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
index 1a182667a2e..7f719871a2c 100644
--- 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
+++ 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
@@ -34,7 +34,7 @@ import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.Aliases;
@@ -80,7 +80,7 @@ public class JdbcTest extends SolrCloudTestCase {
 
     cluster.waitForActiveCollection(collection, 2, 2);
 
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         collection, cluster.getZkStateReader(), false, true, DEFAULT_TIMEOUT);
     if (useAlias) {
       CollectionAdminRequest.createAlias(COLLECTIONORALIAS, collection)
diff --git 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/JDBCStreamTest.java
 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/JDBCStreamTest.java
index b8e200da234..2dd63e664ba 100644
--- 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/JDBCStreamTest.java
+++ 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/JDBCStreamTest.java
@@ -40,7 +40,7 @@ import 
org.apache.solr.client.solrj.io.stream.metrics.MeanMetric;
 import org.apache.solr.client.solrj.io.stream.metrics.MinMetric;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -80,7 +80,7 @@ public class JDBCStreamTest extends SolrCloudTestCase {
     }
     CollectionAdminRequest.createCollection(collection, "conf", 2, 1)
         .process(cluster.getSolrClient());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         collection, cluster.getZkStateReader(), false, true, TIMEOUT);
     if (useAlias) {
       CollectionAdminRequest.createAlias(COLLECTIONORALIAS, collection)
diff --git 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
index 9b598c42755..2ad9eb9dbce 100644
--- 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
+++ 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
@@ -31,7 +31,7 @@ import org.apache.solr.client.solrj.io.SolrClientCache;
 import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
@@ -75,7 +75,7 @@ public class MathExpressionTest extends SolrCloudTestCase {
 
     CollectionAdminRequest.createCollection(collection, "conf", 2, 1)
         .process(cluster.getSolrClient());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         collection, cluster.getZkStateReader(), false, true, TIMEOUT);
     if (useAlias) {
       CollectionAdminRequest.createAlias(COLLECTIONORALIAS, collection)
diff --git 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/SelectWithEvaluatorsTest.java
 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/SelectWithEvaluatorsTest.java
index 2abfa0fad3d..15785b4101a 100644
--- 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/SelectWithEvaluatorsTest.java
+++ 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/SelectWithEvaluatorsTest.java
@@ -29,7 +29,7 @@ import 
org.apache.solr.client.solrj.io.eval.IfThenElseEvaluator;
 import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -70,7 +70,7 @@ public class SelectWithEvaluatorsTest extends 
SolrCloudTestCase {
     }
     CollectionAdminRequest.createCollection(collection, "conf", 2, 1)
         .process(cluster.getSolrClient());
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         collection, cluster.getZkStateReader(), false, true, TIMEOUT);
     if (useAlias) {
       CollectionAdminRequest.createAlias(COLLECTIONORALIAS, collection)
diff --git 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/StreamDecoratorTest.java
 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/StreamDecoratorTest.java
index 64d0f9bfc1b..58f6d910ada 100644
--- 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/StreamDecoratorTest.java
+++ 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/StreamDecoratorTest.java
@@ -58,7 +58,7 @@ import 
org.apache.solr.client.solrj.io.stream.metrics.SumMetric;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.cloud.ClusterState;
@@ -109,7 +109,7 @@ public class StreamDecoratorTest extends SolrCloudTestCase {
 
     cluster.waitForActiveCollection(collection, 2, 2);
 
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         collection, cluster.getZkStateReader(), false, true, TIMEOUT);
     if (useAlias) {
       CollectionAdminRequest.createAlias(COLLECTIONORALIAS, collection)
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java
index 22d581bd4b7..d09f2ea9ba0 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java
@@ -55,7 +55,7 @@ import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.client.solrj.response.RequestStatusState;
 import org.apache.solr.client.solrj.response.SolrPingResponse;
 import org.apache.solr.client.solrj.response.UpdateResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
@@ -1063,7 +1063,7 @@ public class CloudHttp2SolrClientTest extends 
SolrCloudTestCase {
               // change
               .process(cluster.getSolrClient())
               .getStatus());
-      AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+      AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
           COL, cluster.getZkStateReader(), true, true, 330);
       // ...and delete our original leader.
       assertEquals(
@@ -1074,7 +1074,7 @@ public class CloudHttp2SolrClientTest extends 
SolrCloudTestCase {
               // change
               .process(cluster.getSolrClient())
               .getStatus());
-      AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+      AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
           COL, cluster.getZkStateReader(), true, true, 330);
 
       // stale_client's collection state cache should now only point at a 
leader that no longer
diff --git 
a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java
 
b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java
deleted file mode 100644
index ef1760592c7..00000000000
--- 
a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java
+++ /dev/null
@@ -1,402 +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.cloud;
-
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import java.lang.invoke.MethodHandles;
-import java.nio.file.Path;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.commons.io.file.PathUtils;
-import org.apache.solr.BaseDistributedSearchTestCase;
-import org.apache.solr.cli.ConfigSetUploadTool;
-import org.apache.solr.cli.DefaultToolRuntime;
-import org.apache.solr.cli.SolrCLI;
-import org.apache.solr.cli.ToolRuntime;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-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.common.cloud.Slice;
-import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.cloud.ZkStateReader;
-import org.apache.solr.core.Diagnostics;
-import org.apache.solr.core.MockDirectoryFactory;
-import org.apache.solr.embedded.JettySolrRunner;
-import org.apache.zookeeper.KeeperException;
-import org.junit.BeforeClass;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class AbstractDistribZkTestBase extends 
BaseDistributedSearchTestCase {
-
-  private static final String REMOVE_VERSION_FIELD = "remove.version.field";
-  private static final String ENABLE_UPDATE_LOG = 
"solr.index.updatelog.enabled";
-  private static final String ZK_HOST = "zkHost";
-  private static final String ZOOKEEPER_FORCE_SYNC = "zookeeper.forceSync";
-  protected static final String DEFAULT_COLLECTION = "collection1";
-  protected volatile ZkTestServer zkServer;
-  private final AtomicInteger homeCount = new AtomicInteger();
-
-  private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
-  @BeforeClass
-  public static void beforeThisClass() throws Exception {
-    // Only For Manual Testing: this will force an fs based dir factory
-    // useFactory(null);
-  }
-
-  @Override
-  public void distribSetUp() throws Exception {
-    super.distribSetUp();
-
-    Path zkDir = testDir.resolve("zookeeper/server1/data");
-    zkServer = new ZkTestServer(zkDir);
-    zkServer.run();
-
-    System.setProperty(ZK_HOST, zkServer.getZkAddress());
-    System.setProperty(ENABLE_UPDATE_LOG, "true");
-    System.setProperty(REMOVE_VERSION_FIELD, "true");
-    System.setProperty(ZOOKEEPER_FORCE_SYNC, "false");
-    System.setProperty(
-        
MockDirectoryFactory.SOLR_TESTS_ALLOW_READING_FILES_STILL_OPEN_FOR_WRITE, 
"true");
-
-    String schema = getCloudSchemaFile();
-    if (schema == null) schema = "schema.xml";
-    zkServer.buildZooKeeper(getCloudSolrConfig(), schema);
-
-    // set some system properties for use by tests
-    System.setProperty("solr.test.sys.prop1", "propone");
-    System.setProperty("solr.test.sys.prop2", "proptwo");
-  }
-
-  protected String getCloudSolrConfig() {
-    return "solrconfig-tlog.xml";
-  }
-
-  protected String getCloudSchemaFile() {
-    return getSchemaFile();
-  }
-
-  @Override
-  protected void createServers(int numShards) throws Exception {
-    // give everyone there own solrhome
-    Path controlHome = getSolrHome().getParent().resolve("control" + 
homeCount.incrementAndGet());
-    PathUtils.copyDirectory(getSolrHome(), controlHome);
-    setupJettySolrHome(controlHome);
-
-    controlJetty = createJetty(controlHome, null); // let the shardId default 
to shard1
-    controlJetty.start();
-    controlClient = createNewSolrClient(controlJetty.getLocalPort());
-
-    assertTrue(
-        CollectionAdminRequest.createCollection("control_collection", 1, 1)
-            .setCreateNodeSet(controlJetty.getNodeName())
-            .process(controlClient)
-            .isSuccess());
-
-    ZkStateReader zkStateReader =
-        jettys.get(0).getCoreContainer().getZkController().getZkStateReader();
-
-    waitForRecoveriesToFinish("control_collection", zkStateReader, false, 
true, 15);
-
-    StringBuilder sb = new StringBuilder();
-    for (int i = 1; i <= numShards; i++) {
-      if (sb.length() > 0) sb.append(',');
-      // give everyone there own solrhome
-      Path jettyHome = getSolrHome().getParent().resolve("jetty" + 
homeCount.incrementAndGet());
-      setupJettySolrHome(jettyHome);
-      JettySolrRunner j = createJetty(jettyHome, null, "shard" + (i + 2));
-      j.start();
-      jettys.add(j);
-      clients.add(createNewSolrClient(j.getLocalPort()));
-      sb.append(buildUrl(j.getLocalPort()));
-    }
-
-    shards = sb.toString();
-  }
-
-  protected void waitForRecoveriesToFinish(
-      String collection, ZkStateReader zkStateReader, boolean verbose) throws 
Exception {
-    waitForRecoveriesToFinish(collection, zkStateReader, verbose, true);
-  }
-
-  protected void waitForRecoveriesToFinish(
-      String collection, ZkStateReader zkStateReader, boolean verbose, boolean 
failOnTimeout)
-      throws Exception {
-    waitForRecoveriesToFinish(collection, zkStateReader, verbose, 
failOnTimeout, 330, SECONDS);
-  }
-
-  public static void waitForRecoveriesToFinish(
-      String collection,
-      ZkStateReader zkStateReader,
-      boolean verbose,
-      boolean failOnTimeout,
-      long timeoutSeconds)
-      throws Exception {
-    waitForRecoveriesToFinish(
-        collection, zkStateReader, verbose, failOnTimeout, timeoutSeconds, 
SECONDS);
-  }
-
-  public static void waitForRecoveriesToFinish(
-      String collection,
-      ZkStateReader zkStateReader,
-      boolean verbose,
-      boolean failOnTimeout,
-      long timeout,
-      TimeUnit unit)
-      throws Exception {
-    log.info(
-        "Wait for recoveries to finish - collection:{} failOnTimeout:{} 
timeout:{}{}",
-        collection,
-        failOnTimeout,
-        timeout,
-        unit);
-    try {
-      zkStateReader.waitForState(
-          collection,
-          timeout,
-          unit,
-          (liveNodes, docCollection) -> {
-            if (docCollection == null) return false;
-            boolean sawLiveRecovering = false;
-
-            Map<String, Slice> slices = docCollection.getSlicesMap();
-            assertNotNull("Could not find collection:" + collection, slices);
-            for (Map.Entry<String, Slice> entry : slices.entrySet()) {
-              Slice slice = entry.getValue();
-              if (slice.getState()
-                  == Slice.State
-                      .CONSTRUCTION) { // similar to replica recovering; 
pretend its the same
-                // thing
-                if (verbose) System.out.println("Found a slice in construction 
state; will wait.");
-                sawLiveRecovering = true;
-              }
-              Map<String, Replica> shards = slice.getReplicasMap();
-              for (Map.Entry<String, Replica> shard : shards.entrySet()) {
-                if (verbose)
-                  System.out.println(
-                      "replica:"
-                          + shard.getValue().getName()
-                          + " rstate:"
-                          + shard.getValue().getStr(ZkStateReader.STATE_PROP)
-                          + " live:"
-                          + 
liveNodes.contains(shard.getValue().getNodeName()));
-                final Replica.State state = shard.getValue().getState();
-                if ((state == Replica.State.RECOVERING
-                        || state == Replica.State.DOWN
-                        || state == Replica.State.RECOVERY_FAILED)
-                    && 
liveNodes.contains(shard.getValue().getStr(ZkStateReader.NODE_NAME_PROP))) {
-                  return false;
-                }
-              }
-            }
-            if (!sawLiveRecovering) {
-              if (verbose) System.out.println("no one is recoverying");
-              return true;
-            } else {
-              return false;
-            }
-          });
-    } catch (TimeoutException | InterruptedException e) {
-      Diagnostics.logThreadDumps("Gave up waiting for recovery to finish.  
THREAD DUMP:");
-      zkStateReader.getZkClient().printLayoutToStream(System.out);
-      fail("There are still nodes recovering - waited for " + timeout + unit);
-    }
-
-    log.info("Recoveries finished - collection:{}", collection);
-  }
-
-  public static void waitForCollectionToDisappear(
-      String collection, ZkStateReader zkStateReader, boolean failOnTimeout, 
int timeoutSeconds)
-      throws Exception {
-    log.info(
-        "Wait for collection to disappear - collection: {} failOnTimeout:{} 
timeout (sec):{}",
-        collection,
-        failOnTimeout,
-        timeoutSeconds);
-
-    zkStateReader.waitForState(
-        collection, timeoutSeconds, TimeUnit.SECONDS, (docCollection) -> 
docCollection == null);
-    log.info("Collection has disappeared - collection:{}", collection);
-  }
-
-  static void waitForNewLeader(CloudSolrClient cloudClient, String shardName, 
Replica oldLeader)
-      throws Exception {
-    log.info("Will wait for a node to become leader for 15 secs");
-    ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
-
-    long startNs = System.nanoTime();
-    try {
-      zkStateReader.waitForState(
-          "collection1",
-          15,
-          TimeUnit.SECONDS,
-          (docCollection) -> {
-            if (docCollection == null) return false;
-
-            Slice slice = docCollection.getSlice(shardName);
-            if (slice != null
-                && slice.getLeader() != null
-                && !slice.getLeader().equals(oldLeader)
-                && slice.getLeader().getState() == Replica.State.ACTIVE) {
-              if (log.isInfoEnabled()) {
-                log.info(
-                    "Old leader {}, new leader {}. New leader got elected in 
{} ms",
-                    oldLeader,
-                    slice.getLeader(),
-                    TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - 
startNs));
-              }
-              return true;
-            }
-            return false;
-          });
-    } catch (TimeoutException e) {
-      // If we failed to get a new leader, print some diagnotics before the 
test fails
-      Diagnostics.logThreadDumps("Could not find new leader in specified 
timeout");
-      zkStateReader.getZkClient().printLayoutToStream(System.out);
-      fail("Could not find new leader even after waiting for 15s");
-    }
-  }
-
-  public static void verifyReplicaStatus(
-      ZkStateReader reader,
-      String collection,
-      String shard,
-      String coreNodeName,
-      Replica.State expectedState)
-      throws InterruptedException, TimeoutException {
-    log.info("verifyReplicaStatus ({}) shard={} coreNodeName={}", collection, 
shard, coreNodeName);
-    reader.waitForState(
-        collection,
-        15000,
-        TimeUnit.MILLISECONDS,
-        (collectionState) ->
-            collectionState != null
-                && collectionState.getSlice(shard) != null
-                && 
collectionState.getSlice(shard).getReplicasMap().get(coreNodeName) != null
-                && 
collectionState.getSlice(shard).getReplicasMap().get(coreNodeName).getState()
-                    == expectedState);
-  }
-
-  protected static void assertAllActive(String collection, ZkStateReader 
zkStateReader)
-      throws KeeperException, InterruptedException {
-
-    zkStateReader.forceUpdateCollection(collection);
-    ClusterState clusterState = zkStateReader.getClusterState();
-    final DocCollection docCollection = 
clusterState.getCollectionOrNull(collection);
-    if (docCollection == null || docCollection.getSlices() == null) {
-      throw new IllegalArgumentException("Cannot find collection:" + 
collection);
-    }
-
-    Map<String, Slice> slices = docCollection.getSlicesMap();
-    for (Map.Entry<String, Slice> entry : slices.entrySet()) {
-      Slice slice = entry.getValue();
-      if (slice.getState() != Slice.State.ACTIVE) {
-        fail(
-            "Not all shards are ACTIVE - found a shard "
-                + slice.getName()
-                + " that is: "
-                + slice.getState());
-      }
-      Map<String, Replica> shards = slice.getReplicasMap();
-      for (Map.Entry<String, Replica> shard : shards.entrySet()) {
-        Replica replica = shard.getValue();
-        if (replica.getState() != Replica.State.ACTIVE) {
-          fail(
-              "Not all replicas are ACTIVE - found a replica "
-                  + replica.getName()
-                  + " that is: "
-                  + replica.getState());
-        }
-      }
-    }
-  }
-
-  @Override
-  public void distribTearDown() throws Exception {
-    resetExceptionIgnores();
-
-    try {
-      zkServer.shutdown();
-    } catch (Exception e) {
-      throw new RuntimeException("Exception shutting down Zk Test Server.", e);
-    } finally {
-      try {
-        super.distribTearDown();
-      } finally {
-        System.clearProperty(ZK_HOST);
-        System.clearProperty("collection");
-        System.clearProperty(ENABLE_UPDATE_LOG);
-        System.clearProperty(REMOVE_VERSION_FIELD);
-        System.clearProperty("solr.directoryFactory");
-        System.clearProperty("solr.test.sys.prop1");
-        System.clearProperty("solr.test.sys.prop2");
-        System.clearProperty(ZOOKEEPER_FORCE_SYNC);
-        System.clearProperty(
-            
MockDirectoryFactory.SOLR_TESTS_ALLOW_READING_FILES_STILL_OPEN_FOR_WRITE);
-      }
-    }
-  }
-
-  protected void printLayout() throws Exception {
-    SolrZkClient zkClient =
-        new SolrZkClient.Builder()
-            .withUrl(zkServer.getZkHost())
-            .withTimeout(AbstractZkTestCase.TIMEOUT, TimeUnit.MILLISECONDS)
-            .build();
-    zkClient.printLayoutToStream(System.out);
-    zkClient.close();
-  }
-
-  protected void restartZk(int pauseMillis) throws Exception {
-    log.info("Restarting ZK with a pause of {}ms in between", pauseMillis);
-    zkServer.shutdown();
-    // disconnect enough to test stalling, if things stall, then 
clientSoTimeout will be hit
-    Thread.sleep(pauseMillis);
-    zkServer = new ZkTestServer(zkServer.getZkDir(), zkServer.getPort());
-    zkServer.run(false);
-  }
-
-  // Copy a configset up from some path on the local  machine to ZK.
-  // Example usage:
-  //
-  // copyConfigUp(TEST_PATH().resolve("configsets"), "cloud-minimal", 
"configset-name", zk_address);
-
-  public static void copyConfigUp(
-      Path configSetDir, String srcConfigSet, String dstConfigName, String 
zkAddr)
-      throws Exception {
-
-    Path fullConfDir = configSetDir.resolve(srcConfigSet);
-    String[] args =
-        new String[] {
-          "--conf-name", dstConfigName,
-          "--conf-dir", fullConfDir.toAbsolutePath().toString(),
-          "-z", zkAddr
-        };
-
-    ToolRuntime runtime = new DefaultToolRuntime();
-    ConfigSetUploadTool tool = new ConfigSetUploadTool(runtime);
-
-    int res = tool.runTool(SolrCLI.processCommandLineArgs(tool, args));
-    assertEquals("Tool should have returned 0 for success, returned: " + res, 
res, 0);
-  }
-}
diff --git 
a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
 
b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
index cbac9ba4c69..d468dce102a 100644
--- 
a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
+++ 
b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.cloud;
 
+import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.solr.common.cloud.ZkStateReader.HTTPS;
 import static org.apache.solr.common.cloud.ZkStateReader.URL_SCHEME;
 
@@ -46,6 +47,11 @@ import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
+import org.apache.solr.BaseDistributedSearchTestCase;
+import org.apache.solr.cli.ConfigSetUploadTool;
+import org.apache.solr.cli.DefaultToolRuntime;
+import org.apache.solr.cli.SolrCLI;
+import org.apache.solr.cli.ToolRuntime;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
@@ -75,6 +81,7 @@ import org.apache.solr.common.cloud.ClusterStateUtil;
 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.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CollectionParams;
@@ -90,6 +97,7 @@ import org.apache.solr.common.util.TimeSource;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.Diagnostics;
+import org.apache.solr.core.MockDirectoryFactory;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.embedded.JettyConfig;
 import org.apache.solr.embedded.JettySolrRunner;
@@ -114,9 +122,17 @@ import org.slf4j.LoggerFactory;
  * TODO: we should still test this works as a custom update chain as well as 
what we test now - the
  * default update chain
  */
-public abstract class AbstractFullDistribZkTestBase extends 
AbstractDistribZkTestBase {
+public abstract class AbstractFullDistribZkTestBase extends 
BaseDistributedSearchTestCase {
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
+  private static final String REMOVE_VERSION_FIELD = "remove.version.field";
+  private static final String ENABLE_UPDATE_LOG = 
"solr.index.updatelog.enabled";
+  private static final String ZK_HOST = "zkHost";
+  private static final String ZOOKEEPER_FORCE_SYNC = "zookeeper.forceSync";
+  protected static final String DEFAULT_COLLECTION = "collection1";
+  protected volatile ZkTestServer zkServer;
+  private final AtomicInteger homeCount = new AtomicInteger();
+
   @BeforeClass
   public static void beforeFullSolrCloudTest() {}
 
@@ -242,6 +258,27 @@ public abstract class AbstractFullDistribZkTestBase 
extends AbstractDistribZkTes
   @Override
   public void distribSetUp() throws Exception {
     super.distribSetUp();
+
+    // Setup from AbstractFullDistribZkTestBase
+    Path zkDir = testDir.resolve("zookeeper/server1/data");
+    zkServer = new ZkTestServer(zkDir);
+    zkServer.run();
+
+    System.setProperty(ZK_HOST, zkServer.getZkAddress());
+    System.setProperty(ENABLE_UPDATE_LOG, "true");
+    System.setProperty(REMOVE_VERSION_FIELD, "true");
+    System.setProperty(ZOOKEEPER_FORCE_SYNC, "false");
+    System.setProperty(
+        
MockDirectoryFactory.SOLR_TESTS_ALLOW_READING_FILES_STILL_OPEN_FOR_WRITE, 
"true");
+
+    String schema = getCloudSchemaFile();
+    if (schema == null) schema = "schema.xml";
+    zkServer.buildZooKeeper(getCloudSolrConfig(), schema);
+
+    // set some system properties for use by tests
+    System.setProperty("solr.test.sys.prop1", "propone");
+    System.setProperty("solr.test.sys.prop2", "proptwo");
+
     // ignoreException(".*");
 
     cloudInit = false;
@@ -285,6 +322,14 @@ public abstract class AbstractFullDistribZkTestBase 
extends AbstractDistribZkTes
     }
   }
 
+  protected String getCloudSolrConfig() {
+    return "solrconfig-tlog.xml";
+  }
+
+  protected String getCloudSchemaFile() {
+    return getSchemaFile();
+  }
+
   @BeforeClass
   public static void beforeClass() {
     System.setProperty("solrcloud.update.delay", "0");
@@ -1152,12 +1197,12 @@ public abstract class AbstractFullDistribZkTestBase 
extends AbstractDistribZkTes
 
   protected void waitForRecoveriesToFinish(boolean verbose) throws Exception {
     ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
-    super.waitForRecoveriesToFinish(DEFAULT_COLLECTION, zkStateReader, 
verbose);
+    waitForRecoveriesToFinish(DEFAULT_COLLECTION, zkStateReader, verbose);
   }
 
   protected void waitForRecoveriesToFinish(String collection, boolean verbose) 
throws Exception {
     ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
-    super.waitForRecoveriesToFinish(collection, zkStateReader, verbose);
+    waitForRecoveriesToFinish(collection, zkStateReader, verbose);
   }
 
   protected void waitForRecoveriesToFinish(boolean verbose, long 
timeoutSeconds) throws Exception {
@@ -1165,6 +1210,203 @@ public abstract class AbstractFullDistribZkTestBase 
extends AbstractDistribZkTes
     waitForRecoveriesToFinish(DEFAULT_COLLECTION, zkStateReader, verbose, 
true, timeoutSeconds);
   }
 
+  protected void waitForRecoveriesToFinish(
+      String collection, ZkStateReader zkStateReader, boolean verbose) throws 
Exception {
+    waitForRecoveriesToFinish(collection, zkStateReader, verbose, true);
+  }
+
+  protected void waitForRecoveriesToFinish(
+      String collection, ZkStateReader zkStateReader, boolean verbose, boolean 
failOnTimeout)
+      throws Exception {
+    waitForRecoveriesToFinish(collection, zkStateReader, verbose, 
failOnTimeout, 330, SECONDS);
+  }
+
+  public static void waitForRecoveriesToFinish(
+      String collection,
+      ZkStateReader zkStateReader,
+      boolean verbose,
+      boolean failOnTimeout,
+      long timeoutSeconds)
+      throws Exception {
+    waitForRecoveriesToFinish(
+        collection, zkStateReader, verbose, failOnTimeout, timeoutSeconds, 
SECONDS);
+  }
+
+  public static void waitForRecoveriesToFinish(
+      String collection,
+      ZkStateReader zkStateReader,
+      boolean verbose,
+      boolean failOnTimeout,
+      long timeout,
+      TimeUnit unit)
+      throws Exception {
+    log.info(
+        "Wait for recoveries to finish - collection:{} failOnTimeout:{} 
timeout:{}{}",
+        collection,
+        failOnTimeout,
+        timeout,
+        unit);
+    try {
+      zkStateReader.waitForState(
+          collection,
+          timeout,
+          unit,
+          (liveNodes, docCollection) -> {
+            if (docCollection == null) return false;
+            boolean sawLiveRecovering = false;
+
+            Map<String, Slice> slices = docCollection.getSlicesMap();
+            assertNotNull("Could not find collection:" + collection, slices);
+            for (Map.Entry<String, Slice> entry : slices.entrySet()) {
+              Slice slice = entry.getValue();
+              if (slice.getState()
+                  == Slice.State
+                      .CONSTRUCTION) { // similar to replica recovering; 
pretend its the same
+                // thing
+                if (verbose) System.out.println("Found a slice in construction 
state; will wait.");
+                sawLiveRecovering = true;
+              }
+              Map<String, Replica> shards = slice.getReplicasMap();
+              for (Map.Entry<String, Replica> shard : shards.entrySet()) {
+                if (verbose)
+                  System.out.println(
+                      "replica:"
+                          + shard.getValue().getName()
+                          + " rstate:"
+                          + shard.getValue().getStr(ZkStateReader.STATE_PROP)
+                          + " live:"
+                          + 
liveNodes.contains(shard.getValue().getNodeName()));
+                final Replica.State state = shard.getValue().getState();
+                if ((state == Replica.State.RECOVERING
+                        || state == Replica.State.DOWN
+                        || state == Replica.State.RECOVERY_FAILED)
+                    && 
liveNodes.contains(shard.getValue().getStr(ZkStateReader.NODE_NAME_PROP))) {
+                  return false;
+                }
+              }
+            }
+            if (!sawLiveRecovering) {
+              if (verbose) System.out.println("no one is recoverying");
+              return true;
+            } else {
+              return false;
+            }
+          });
+    } catch (TimeoutException | InterruptedException e) {
+      Diagnostics.logThreadDumps("Gave up waiting for recovery to finish.  
THREAD DUMP:");
+      zkStateReader.getZkClient().printLayoutToStream(System.out);
+      fail("There are still nodes recovering - waited for " + timeout + unit);
+    }
+
+    log.info("Recoveries finished - collection:{}", collection);
+  }
+
+  public static void waitForCollectionToDisappear(
+      String collection, ZkStateReader zkStateReader, boolean failOnTimeout, 
int timeoutSeconds)
+      throws Exception {
+    log.info(
+        "Wait for collection to disappear - collection: {} failOnTimeout:{} 
timeout (sec):{}",
+        collection,
+        failOnTimeout,
+        timeoutSeconds);
+
+    zkStateReader.waitForState(
+        collection, timeoutSeconds, TimeUnit.SECONDS, (docCollection) -> 
docCollection == null);
+    log.info("Collection has disappeared - collection:{}", collection);
+  }
+
+  static void waitForNewLeader(CloudSolrClient cloudClient, String shardName, 
Replica oldLeader)
+      throws Exception {
+    log.info("Will wait for a node to become leader for 15 secs");
+    ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
+
+    long startNs = System.nanoTime();
+    try {
+      zkStateReader.waitForState(
+          "collection1",
+          15,
+          TimeUnit.SECONDS,
+          (docCollection) -> {
+            if (docCollection == null) return false;
+
+            Slice slice = docCollection.getSlice(shardName);
+            if (slice != null
+                && slice.getLeader() != null
+                && !slice.getLeader().equals(oldLeader)
+                && slice.getLeader().getState() == Replica.State.ACTIVE) {
+              if (log.isInfoEnabled()) {
+                log.info(
+                    "Old leader {}, new leader {}. New leader got elected in 
{} ms",
+                    oldLeader,
+                    slice.getLeader(),
+                    TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - 
startNs));
+              }
+              return true;
+            }
+            return false;
+          });
+    } catch (TimeoutException e) {
+      // If we failed to get a new leader, print some diagnotics before the 
test fails
+      Diagnostics.logThreadDumps("Could not find new leader in specified 
timeout");
+      zkStateReader.getZkClient().printLayoutToStream(System.out);
+      fail("Could not find new leader even after waiting for 15s");
+    }
+  }
+
+  public static void verifyReplicaStatus(
+      ZkStateReader reader,
+      String collection,
+      String shard,
+      String coreNodeName,
+      Replica.State expectedState)
+      throws InterruptedException, TimeoutException {
+    log.info("verifyReplicaStatus ({}) shard={} coreNodeName={}", collection, 
shard, coreNodeName);
+    reader.waitForState(
+        collection,
+        15000,
+        TimeUnit.MILLISECONDS,
+        (collectionState) ->
+            collectionState != null
+                && collectionState.getSlice(shard) != null
+                && 
collectionState.getSlice(shard).getReplicasMap().get(coreNodeName) != null
+                && 
collectionState.getSlice(shard).getReplicasMap().get(coreNodeName).getState()
+                    == expectedState);
+  }
+
+  protected static void assertAllActive(String collection, ZkStateReader 
zkStateReader)
+      throws KeeperException, InterruptedException {
+
+    zkStateReader.forceUpdateCollection(collection);
+    ClusterState clusterState = zkStateReader.getClusterState();
+    final DocCollection docCollection = 
clusterState.getCollectionOrNull(collection);
+    if (docCollection == null || docCollection.getSlices() == null) {
+      throw new IllegalArgumentException("Cannot find collection:" + 
collection);
+    }
+
+    Map<String, Slice> slices = docCollection.getSlicesMap();
+    for (Map.Entry<String, Slice> entry : slices.entrySet()) {
+      Slice slice = entry.getValue();
+      if (slice.getState() != Slice.State.ACTIVE) {
+        fail(
+            "Not all shards are ACTIVE - found a shard "
+                + slice.getName()
+                + " that is: "
+                + slice.getState());
+      }
+      Map<String, Replica> shards = slice.getReplicasMap();
+      for (Map.Entry<String, Replica> shard : shards.entrySet()) {
+        Replica replica = shard.getValue();
+        if (replica.getState() != Replica.State.ACTIVE) {
+          fail(
+              "Not all replicas are ACTIVE - found a replica "
+                  + replica.getName()
+                  + " that is: "
+                  + replica.getState());
+        }
+      }
+    }
+  }
+
   protected void checkQueries() throws Exception {
 
     handle.put("_version_", SKIPVAL);
@@ -1949,19 +2191,82 @@ public abstract class AbstractFullDistribZkTestBase 
extends AbstractDistribZkTes
   public void distribTearDown() throws Exception {
     try {
       if (VERBOSE || printLayoutOnTearDown) {
-        super.printLayout();
+        printLayout();
       }
 
       closeRestTestHarnesses(); // TODO: close here or later?
 
     } finally {
-      super.distribTearDown();
+      resetExceptionIgnores();
 
-      System.clearProperty("zkHost");
-      System.clearProperty("numShards");
+      try {
+        zkServer.shutdown();
+      } catch (Exception e) {
+        throw new RuntimeException("Exception shutting down Zk Test Server.", 
e);
+      } finally {
+        try {
+          super.distribTearDown();
+        } finally {
+          System.clearProperty(ZK_HOST);
+          System.clearProperty("collection");
+          System.clearProperty(ENABLE_UPDATE_LOG);
+          System.clearProperty(REMOVE_VERSION_FIELD);
+          System.clearProperty("solr.directoryFactory");
+          System.clearProperty("solr.test.sys.prop1");
+          System.clearProperty("solr.test.sys.prop2");
+          System.clearProperty(ZOOKEEPER_FORCE_SYNC);
+          System.clearProperty(
+              
MockDirectoryFactory.SOLR_TESTS_ALLOW_READING_FILES_STILL_OPEN_FOR_WRITE);
+          System.clearProperty("zkHost");
+          System.clearProperty("numShards");
+        }
+      }
     }
   }
 
+  protected void printLayout() throws Exception {
+    SolrZkClient zkClient =
+        new SolrZkClient.Builder()
+            .withUrl(zkServer.getZkHost())
+            .withTimeout(AbstractZkTestCase.TIMEOUT, TimeUnit.MILLISECONDS)
+            .build();
+    zkClient.printLayoutToStream(System.out);
+    zkClient.close();
+  }
+
+  protected void restartZk(int pauseMillis) throws Exception {
+    log.info("Restarting ZK with a pause of {}ms in between", pauseMillis);
+    zkServer.shutdown();
+    // disconnect enough to test stalling, if things stall, then 
clientSoTimeout will be hit
+    Thread.sleep(pauseMillis);
+    zkServer = new ZkTestServer(zkServer.getZkDir(), zkServer.getPort());
+    zkServer.run(false);
+  }
+
+  // Copy a configset up from some path on the local  machine to ZK.
+  // Example usage:
+  //
+  // copyConfigUp(TEST_PATH().resolve("configsets"), "cloud-minimal", 
"configset-name", zk_address);
+
+  public static void copyConfigUp(
+      Path configSetDir, String srcConfigSet, String dstConfigName, String 
zkAddr)
+      throws Exception {
+
+    Path fullConfDir = configSetDir.resolve(srcConfigSet);
+    String[] args =
+        new String[] {
+          "--conf-name", dstConfigName,
+          "--conf-dir", fullConfDir.toAbsolutePath().toString(),
+          "-z", zkAddr
+        };
+
+    ToolRuntime runtime = new DefaultToolRuntime();
+    ConfigSetUploadTool tool = new ConfigSetUploadTool(runtime);
+
+    int res = tool.runTool(SolrCLI.processCommandLineArgs(tool, args));
+    assertEquals("Tool should have returned 0 for success, returned: " + res, 
res, 0);
+  }
+
   @Override
   protected void destroyServers() throws Exception {
     ExecutorService customThreadPool =
diff --git 
a/solr/test-framework/src/java/org/apache/solr/cloud/MultiSolrCloudTestCase.java
 
b/solr/test-framework/src/java/org/apache/solr/cloud/MultiSolrCloudTestCase.java
index fbe1fba5ec8..a621c04fbbb 100644
--- 
a/solr/test-framework/src/java/org/apache/solr/cloud/MultiSolrCloudTestCase.java
+++ 
b/solr/test-framework/src/java/org/apache/solr/cloud/MultiSolrCloudTestCase.java
@@ -74,7 +74,7 @@ public abstract class MultiSolrCloudTestCase extends 
SolrTestCaseJ4 {
         CollectionAdminRequest.createCollection(collection, "conf", numShards, 
numReplicas)
             .processAndWait(cluster.getSolrClient(), 
SolrCloudTestCase.DEFAULT_TIMEOUT);
 
-        AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+        AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
             collection, cluster.getZkStateReader(), false, true, 
SolrCloudTestCase.DEFAULT_TIMEOUT);
       } catch (Exception e) {
         throw new RuntimeException(e);
diff --git 
a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCloudBackupRestoreTestCase.java
 
b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCloudBackupRestoreTestCase.java
index 87377bb02e5..8d516472ea8 100644
--- 
a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCloudBackupRestoreTestCase.java
+++ 
b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCloudBackupRestoreTestCase.java
@@ -37,7 +37,7 @@ import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest.ClusterProp;
 import org.apache.solr.client.solrj.response.RequestStatusState;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
@@ -405,7 +405,7 @@ public abstract class AbstractCloudBackupRestoreTestCase 
extends SolrCloudTestCa
       assertNotNull(asyncId);
       CollectionAdminRequest.waitForAsyncRequest(asyncId, client, 60);
     }
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         restoreCollectionName, ZkStateReader.from(client), 
log.isDebugEnabled(), true, 30);
 
     // Check the number of results are the same
diff --git 
a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java
 
b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java
index 9cf6c15e0aa..7a59d490beb 100644
--- 
a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java
+++ 
b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java
@@ -54,7 +54,7 @@ import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.client.solrj.response.RequestStatusState;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.Replica;
@@ -178,7 +178,7 @@ public abstract class AbstractIncrementalBackupTest extends 
SolrCloudTestCase {
       timeTaken = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - t);
       log.info("Restored from backup, took {}ms", timeTaken);
       t = System.nanoTime();
-      AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+      AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
           restoreCollectionName, ZkStateReader.from(solrClient), 
log.isDebugEnabled(), false, 3);
       timeTaken = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - t);
       log.info("Restored collection healthy, took {}ms", timeTaken);
@@ -409,7 +409,7 @@ public abstract class AbstractIncrementalBackupTest extends 
SolrCloudTestCase {
           .setRepositoryName(BACKUP_REPO_NAME)
           .processAndWait(solrClient, 500);
 
-      AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+      AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
           restoreCollectionName, ZkStateReader.from(solrClient), 
log.isDebugEnabled(), false, 3);
       assertEquals(
           numDocs,
@@ -553,7 +553,7 @@ public abstract class AbstractIncrementalBackupTest extends 
SolrCloudTestCase {
         .setRepositoryName(BACKUP_REPO_NAME)
         .process(solrClient);
 
-    AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+    AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
         restoreCollectionName, ZkStateReader.from(solrClient), 
log.isDebugEnabled(), true, 30);
 
     // check num docs are the same
diff --git 
a/solr/test-framework/src/test/org/apache/solr/client/solrj/apache/CloudSolrClientTest.java
 
b/solr/test-framework/src/test/org/apache/solr/client/solrj/apache/CloudSolrClientTest.java
index a989ba1ebe6..896b00ae6aa 100644
--- 
a/solr/test-framework/src/test/org/apache/solr/client/solrj/apache/CloudSolrClientTest.java
+++ 
b/solr/test-framework/src/test/org/apache/solr/client/solrj/apache/CloudSolrClientTest.java
@@ -54,7 +54,7 @@ import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.client.solrj.response.RequestStatusState;
 import org.apache.solr.client.solrj.response.SolrPingResponse;
 import org.apache.solr.client.solrj.response.UpdateResponse;
-import org.apache.solr.cloud.AbstractDistribZkTestBase;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
@@ -953,7 +953,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
               // change
               .process(cluster.getSolrClient())
               .getStatus());
-      AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+      AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
           COL, cluster.getZkStateReader(), true, true, 330);
       // ...and delete our original leader.
       assertEquals(
@@ -964,7 +964,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
               // change
               .process(cluster.getSolrClient())
               .getStatus());
-      AbstractDistribZkTestBase.waitForRecoveriesToFinish(
+      AbstractFullDistribZkTestBase.waitForRecoveriesToFinish(
           COL, cluster.getZkStateReader(), true, true, 330);
 
       // stale_client's collection state cache should now only point at a 
leader that no longer

Reply via email to