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

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


The following commit(s) were added to refs/heads/main by this push:
     new bb45627b2ad SOLR-17931: Deal with deprecated methods on DocCollection 
(#3862)
bb45627b2ad is described below

commit bb45627b2ad6ac46d2feb7ce6c6b60000502ed2f
Author: Eric Pugh <[email protected]>
AuthorDate: Mon Nov 17 08:01:21 2025 -0500

    SOLR-17931: Deal with deprecated methods on DocCollection (#3862)
    
    Move test only methods  to SolrCloudTestCase
---
 .../test/org/apache/solr/cloud/AddReplicaTest.java | 18 +++++------
 .../org/apache/solr/cloud/CleanupOldIndexTest.java |  3 +-
 .../cloud/CloudExitableDirectoryReaderTest.java    |  3 +-
 .../solr/cloud/CollectionStateZnodeTest.java       |  2 +-
 .../solr/cloud/DeleteInactiveReplicaTest.java      |  3 +-
 .../DistribDocExpirationUpdateProcessorTest.java   |  2 +-
 .../solr/cloud/DistributedVersionInfoTest.java     |  3 +-
 .../solr/cloud/FullSolrCloudDistribCmdsTest.java   | 10 +++---
 .../cloud/TestLeaderElectionWithEmptyReplica.java  |  3 +-
 .../org/apache/solr/cloud/TestPullReplica.java     | 33 ++++++++++---------
 .../solr/cloud/TestPullReplicaErrorHandling.java   |  6 ++--
 .../org/apache/solr/cloud/TestTlogReplica.java     | 18 +++++------
 .../collections/CollectionTooManyReplicasTest.java |  2 +-
 .../DistributedQueryComponentOptimizationTest.java |  3 +-
 .../schema/ManagedSchemaRoundRobinCloudTest.java   |  3 +-
 .../apache/solr/schema/SchemaApiFailureTest.java   |  3 +-
 .../apache/solr/search/TestCoordinatorRole.java    |  4 +--
 .../solrj/io/stream/CloudAuthStreamTest.java       |  3 +-
 .../apache/solr/common/cloud/DocCollection.java    | 37 ----------------------
 .../cloud/TestCloudCollectionsListeners.java       |  2 +-
 .../common/cloud/TestCollectionStateWatchers.java  | 20 ++++++++----
 .../common/cloud/TestDocCollectionWatcher.java     | 10 +++---
 .../org/apache/solr/cloud/SolrCloudTestCase.java   | 35 ++++++++++++++++++++
 ...bstractCollectionsAPIDistributedZkTestBase.java |  4 +--
 .../client/solrj/apache/ConnectionReuseTest.java   |  3 +-
 25 files changed, 114 insertions(+), 119 deletions(-)

diff --git a/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java 
b/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java
index fa2bdf84695..7590311a01f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java
@@ -74,17 +74,17 @@ public class AddReplicaTest extends SolrCloudTestCase {
     DocCollection docCollection = 
cloudClient.getClusterState().getCollectionOrNull(collection);
     assertNotNull(docCollection);
     assertEquals(4, docCollection.getReplicas().size());
-    assertEquals(2, 
docCollection.getReplicas(EnumSet.of(Replica.Type.NRT)).size());
-    assertEquals(1, 
docCollection.getReplicas(EnumSet.of(Replica.Type.TLOG)).size());
-    assertEquals(1, 
docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)).size());
+    assertEquals(2, getReplicas(docCollection, 
EnumSet.of(Replica.Type.NRT)).size());
+    assertEquals(1, getReplicas(docCollection, 
EnumSet.of(Replica.Type.TLOG)).size());
+    assertEquals(1, getReplicas(docCollection, 
EnumSet.of(Replica.Type.PULL)).size());
 
     docCollection = 
cloudClient.getClusterState().getCollectionOrNull(collection);
     assertNotNull(docCollection);
     // sanity check that everything is as before
     assertEquals(4, docCollection.getReplicas().size());
-    assertEquals(2, 
docCollection.getReplicas(EnumSet.of(Replica.Type.NRT)).size());
-    assertEquals(1, 
docCollection.getReplicas(EnumSet.of(Replica.Type.TLOG)).size());
-    assertEquals(1, 
docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)).size());
+    assertEquals(2, getReplicas(docCollection, 
EnumSet.of(Replica.Type.NRT)).size());
+    assertEquals(1, getReplicas(docCollection, 
EnumSet.of(Replica.Type.TLOG)).size());
+    assertEquals(1, getReplicas(docCollection, 
EnumSet.of(Replica.Type.PULL)).size());
 
     // adding any number of replicas is supported if an explicit create node 
set is specified
     // so test that as well
@@ -107,9 +107,9 @@ public class AddReplicaTest extends SolrCloudTestCase {
     assertNotNull(docCollection);
     // sanity check that everything is as before
     assertEquals(9, docCollection.getReplicas().size());
-    assertEquals(5, 
docCollection.getReplicas(EnumSet.of(Replica.Type.NRT)).size());
-    assertEquals(2, 
docCollection.getReplicas(EnumSet.of(Replica.Type.TLOG)).size());
-    assertEquals(2, 
docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)).size());
+    assertEquals(5, getReplicas(docCollection, 
EnumSet.of(Replica.Type.NRT)).size());
+    assertEquals(2, getReplicas(docCollection, 
EnumSet.of(Replica.Type.TLOG)).size());
+    assertEquals(2, getReplicas(docCollection, 
EnumSet.of(Replica.Type.PULL)).size());
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/cloud/CleanupOldIndexTest.java 
b/solr/core/src/test/org/apache/solr/cloud/CleanupOldIndexTest.java
index 0a4e0d3c1c9..cc393c1ffab 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CleanupOldIndexTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CleanupOldIndexTest.java
@@ -23,7 +23,6 @@ import java.util.Date;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.embedded.JettySolrRunner;
@@ -117,7 +116,7 @@ public class CleanupOldIndexTest extends SolrCloudTestCase {
             COLLECTION,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, 1, 2));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, 1, 2));
 
     assertFalse(Files.isDirectory(oldIndexDir1));
     assertFalse(Files.isDirectory(oldIndexDir2));
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java
 
b/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java
index 041ab757eb8..e4436b62532 100644
--- 
a/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java
+++ 
b/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java
@@ -33,7 +33,6 @@ import org.apache.solr.client.solrj.SolrClient;
 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.common.cloud.DocCollection;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.embedded.JettySolrRunner;
@@ -93,7 +92,7 @@ public class CloudExitableDirectoryReaderTest extends 
SolrCloudTestCase {
             COLLECTION,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, 2, 1));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, 2, 1));
 
     fiveHundredsByNode = new LinkedHashMap<>();
     long httpOk = 0;
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/CollectionStateZnodeTest.java 
b/solr/core/src/test/org/apache/solr/cloud/CollectionStateZnodeTest.java
index 454af307c97..ad31c1317cb 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CollectionStateZnodeTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CollectionStateZnodeTest.java
@@ -48,7 +48,7 @@ public class CollectionStateZnodeTest extends 
SolrCloudTestCase {
     waitForState(
         "Collection not created",
         collectionName,
-        (n, c) -> DocCollection.isFullyActive(n, c, 2, 2));
+        (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 
2, 2));
     assertTrue(
         "Collection path does not exist",
         zkClient().exists(DocCollection.getCollectionPath(collectionName), 
true));
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java 
b/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java
index 93ced0eeca1..e84e9e436dc 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java
@@ -65,7 +65,8 @@ public class DeleteInactiveReplicaTest extends 
SolrCloudTestCase {
         "Expected a cluster of 2 shards and 2 replicas",
         collectionName,
         (n, c) -> {
-          return DocCollection.isFullyActive(n, c, numShards, 
replicationFactor);
+          return SolrCloudTestCase.replicasForCollectionAreFullyActive(
+              n, c, numShards, replicationFactor);
         });
 
     DocCollection collectionState = getCollectionState(collectionName);
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
 
b/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
index b0a6419b233..9b506e2c8ed 100644
--- 
a/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
+++ 
b/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
@@ -100,7 +100,7 @@ public class DistribDocExpirationUpdateProcessorTest 
extends SolrCloudTestCase {
     waitForState(
         "Waiting for collection creation",
         COLLECTION,
-        (n, c) -> DocCollection.isFullyActive(n, c, 2, 2));
+        (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 
2, 2));
   }
 
   @Test
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java 
b/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
index b5c902467a4..28c63f91df2 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
@@ -45,7 +45,6 @@ import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -82,7 +81,7 @@ public class DistributedVersionInfoTest extends 
SolrCloudTestCase {
         COLLECTION,
         DEFAULT_TIMEOUT,
         TimeUnit.SECONDS,
-        (n, c) -> DocCollection.isFullyActive(n, c, 1, 3));
+        (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 
1, 3));
 
     final Replica leader = stateReader.getLeaderRetry(COLLECTION, shardId);
 
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java 
b/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
index 74dfe014c23..5f075644d35 100644
--- a/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
@@ -89,7 +89,7 @@ public class FullSolrCloudDistribCmdsTest extends 
SolrCloudTestCase {
             name,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, 2, 2));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, 2, 2));
     return name;
   }
 
@@ -167,7 +167,7 @@ public class FullSolrCloudDistribCmdsTest extends 
SolrCloudTestCase {
             testCollectionName,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c1) -> DocCollection.isFullyActive(n, c1, 2, 2));
+            (n, c1) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c1, 2, 2));
 
     final DocCollection docCol = 
cloudClient.getClusterState().getCollection(testCollectionName);
     try (SolrClient shard1 = 
getHttpSolrClient(docCol.getSlice("shard1").getLeader());
@@ -288,7 +288,7 @@ public class FullSolrCloudDistribCmdsTest extends 
SolrCloudTestCase {
             testCollectionName,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c1) -> DocCollection.isFullyActive(n, c1, 2, 2));
+            (n, c1) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c1, 2, 2));
 
     // Add a few documents with diff routes
     cloudClient.add(testCollectionName, sdoc("id", "1", "routefield_s", 
"europe"));
@@ -322,7 +322,7 @@ public class FullSolrCloudDistribCmdsTest extends 
SolrCloudTestCase {
             testCollectionName,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c1) -> DocCollection.isFullyActive(n, c1, 2, 2));
+            (n, c1) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c1, 2, 2));
 
     final DocCollection docCol = 
cloudClient.getClusterState().getCollection(testCollectionName);
     try (SolrClient shard1 = 
getHttpSolrClient(docCol.getSlice("shard1").getLeader());
@@ -464,7 +464,7 @@ public class FullSolrCloudDistribCmdsTest extends 
SolrCloudTestCase {
                 collectionName,
                 DEFAULT_TIMEOUT,
                 TimeUnit.SECONDS,
-                (n, c) -> DocCollection.isFullyActive(n, c, 2, 1));
+                (n, c) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 2, 1));
 
         { // HACK: Check the leaderProps for the shard hosted on the node 
we're going to kill...
           List<Replica> replicas =
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionWithEmptyReplica.java
 
b/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionWithEmptyReplica.java
index 991750adcc1..d9cf6fc7128 100644
--- 
a/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionWithEmptyReplica.java
+++ 
b/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionWithEmptyReplica.java
@@ -29,7 +29,6 @@ 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.common.SolrInputDocument;
-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.embedded.JettySolrRunner;
@@ -96,7 +95,7 @@ public class TestLeaderElectionWithEmptyReplica extends 
SolrCloudTestCase {
             COLLECTION_NAME,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, 1, 2));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, 1, 2));
 
     // now query each replica and check for consistency
     assertConsistentReplicas(
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestPullReplica.java 
b/solr/core/src/test/org/apache/solr/cloud/TestPullReplica.java
index d7cf33aad8a..ba349ad9663 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestPullReplica.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestPullReplica.java
@@ -185,11 +185,11 @@ public class TestPullReplica extends SolrCloudTestCase {
         assertEquals(
             "Expecting 6 pull replicas, 3 per shard",
             6,
-            docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)).size());
+            getReplicas(docCollection, EnumSet.of(Replica.Type.PULL)).size());
         assertEquals(
             "Expecting 2 writer replicas, one per shard",
             2,
-            docCollection.getReplicas(EnumSet.of(Replica.Type.NRT)).size());
+            getReplicas(docCollection, EnumSet.of(Replica.Type.NRT)).size());
         for (Slice s : docCollection.getSlices()) {
           // read-only replicas can never become leaders
           assertNotSame(s.getLeader().getType(), Replica.Type.PULL);
@@ -560,7 +560,7 @@ public class TestPullReplica extends SolrCloudTestCase {
       assertEquals(1, leaderClient.query(new 
SolrQuery("*:*")).getResults().getNumFound());
     }
 
-    waitForNumDocsInAllReplicas(1, 
docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)));
+    waitForNumDocsInAllReplicas(1, getReplicas(docCollection, 
EnumSet.of(Replica.Type.PULL)));
 
     // Delete leader replica from shard1
     ignoreException("No registered leader was found"); // These are expected
@@ -611,7 +611,7 @@ public class TestPullReplica extends SolrCloudTestCase {
 
     // Also fails if I send the update to the pull replica explicitly
     try (SolrClient pullReplicaClient =
-        
getHttpSolrClient(docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)).get(0)))
 {
+        getHttpSolrClient(getReplicas(docCollection, 
EnumSet.of(Replica.Type.PULL)).get(0))) {
       expectThrows(
           SolrException.class,
           () ->
@@ -625,7 +625,7 @@ public class TestPullReplica extends SolrCloudTestCase {
     }
 
     // Queries should still work
-    waitForNumDocsInAllReplicas(1, 
docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)));
+    waitForNumDocsInAllReplicas(1, getReplicas(docCollection, 
EnumSet.of(Replica.Type.PULL)));
     // Add nrt replica back. Since there is no nrt now, new nrt will have no 
docs. There will be
     // data loss, since it will become the leader and pull replicas will 
replicate from it.
     // Maybe we want to change this. Replicate from pull replicas is not a 
good idea, since they are
@@ -652,7 +652,7 @@ public class TestPullReplica extends SolrCloudTestCase {
     // different?
     if (removeReplica) {
       // Pull replicas will replicate the empty index if a new replica was 
added and becomes leader
-      waitForNumDocsInAllReplicas(0, 
docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)));
+      waitForNumDocsInAllReplicas(0, getReplicas(docCollection, 
EnumSet.of(Replica.Type.PULL)));
     }
 
     // add docs agin
@@ -663,8 +663,8 @@ public class TestPullReplica extends SolrCloudTestCase {
       assertEquals(1, leaderClient.query(new 
SolrQuery("*:*")).getResults().getNumFound());
     }
     waitForNumDocsInAllReplicas(
-        1, docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)), "id:2", 
null, null);
-    waitForNumDocsInAllReplicas(1, 
docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)));
+        1, getReplicas(docCollection, EnumSet.of(Replica.Type.PULL)), "id:2", 
null, null);
+    waitForNumDocsInAllReplicas(1, getReplicas(docCollection, 
EnumSet.of(Replica.Type.PULL)));
   }
 
   public void testKillPullReplica() throws Exception {
@@ -729,12 +729,11 @@ public class TestPullReplica extends SolrCloudTestCase {
     waitForState("Collection init never finished?", collectionName, 
activeReplicaCount(0, 1, 2));
 
     assertEquals(
-        2, 
getCollectionState(collectionName).getReplicas(EnumSet.of(Replica.Type.PULL)).size());
+        2, getReplicas(getCollectionState(collectionName), 
EnumSet.of(Replica.Type.PULL)).size());
 
     // set our 'skip' property on one of the PULL replicas, and keep track of 
this replica
     final String pullThatSkipsRecovery =
-        getCollectionState(collectionName)
-            .getReplicas(EnumSet.of(Replica.Type.PULL))
+        getReplicas(getCollectionState(collectionName), 
EnumSet.of(Replica.Type.PULL))
             .get(0)
             .getName();
     CollectionAdminRequest.addReplicaProperty(
@@ -767,7 +766,7 @@ public class TestPullReplica extends SolrCloudTestCase {
         activeReplicaCount(0, 0, 2));
     waitForNumDocsInAllReplicas(
         numDocsAdded,
-        
getCollectionState(collectionName).getReplicas(EnumSet.of(Replica.Type.PULL)));
+        getReplicas(getCollectionState(collectionName), 
EnumSet.of(Replica.Type.PULL)));
 
     // Add yetanother PULL replica while the leader is down.
     // This new replica will immediately stall going into recoveery, since the 
leader is down.
@@ -780,7 +779,7 @@ public class TestPullReplica extends SolrCloudTestCase {
         (liveNodes, colState) -> {
           int active = 0;
           int down = 0;
-          for (Replica r : 
colState.getReplicas(EnumSet.of(Replica.Type.PULL))) {
+          for (Replica r : getReplicas(colState, 
EnumSet.of(Replica.Type.PULL))) {
             if (r.getState().equals(Replica.State.ACTIVE)) {
               active++;
             } else if (r.getState().equals(Replica.State.DOWN)) {
@@ -793,7 +792,7 @@ public class TestPullReplica extends SolrCloudTestCase {
     // But even if when set our 'skip' property on this new PULL replica, it's 
*next* (re)start
     // should still block waiting for RECOVERY since it won't have an active 
index.
     final String pullThatWantsToSkipRecoveryButMustRecoverOnce =
-        
getCollectionState(collectionName).getReplicas(EnumSet.of(Replica.Type.PULL)).stream()
+        getReplicas(getCollectionState(collectionName), 
EnumSet.of(Replica.Type.PULL)).stream()
             .filter(r -> r.getState().equals(Replica.State.DOWN))
             .map(r -> r.getName())
             .findFirst()
@@ -929,19 +928,19 @@ public class TestPullReplica extends SolrCloudTestCase {
     assertEquals(
         "Unexpected number of writer replicas: " + docCollection,
         numNrtReplicas,
-        docCollection.getReplicas(EnumSet.of(Replica.Type.NRT)).stream()
+        getReplicas(docCollection, EnumSet.of(Replica.Type.NRT)).stream()
             .filter(r -> !activeOnly || r.getState() == Replica.State.ACTIVE)
             .count());
     assertEquals(
         "Unexpected number of pull replicas: " + docCollection,
         numPullReplicas,
-        docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)).stream()
+        getReplicas(docCollection, EnumSet.of(Replica.Type.PULL)).stream()
             .filter(r -> !activeOnly || r.getState() == Replica.State.ACTIVE)
             .count());
     assertEquals(
         "Unexpected number of active replicas: " + docCollection,
         numTlogReplicas,
-        docCollection.getReplicas(EnumSet.of(Replica.Type.TLOG)).stream()
+        getReplicas(docCollection, EnumSet.of(Replica.Type.TLOG)).stream()
             .filter(r -> !activeOnly || r.getState() == Replica.State.ACTIVE)
             .count());
     return docCollection;
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/TestPullReplicaErrorHandling.java 
b/solr/core/src/test/org/apache/solr/cloud/TestPullReplicaErrorHandling.java
index b9a2707f5b3..3dd8f01e614 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestPullReplicaErrorHandling.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestPullReplicaErrorHandling.java
@@ -305,19 +305,19 @@ public class TestPullReplicaErrorHandling extends 
SolrCloudTestCase {
     assertEquals(
         "Unexpected number of writer replicas: " + docCollection,
         numWriter,
-        docCollection.getReplicas(EnumSet.of(Replica.Type.NRT)).stream()
+        getReplicas(docCollection, EnumSet.of(Replica.Type.NRT)).stream()
             .filter(r -> !activeOnly || r.getState() == Replica.State.ACTIVE)
             .count());
     assertEquals(
         "Unexpected number of pull replicas: " + docCollection,
         numPassive,
-        docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)).stream()
+        getReplicas(docCollection, EnumSet.of(Replica.Type.PULL)).stream()
             .filter(r -> !activeOnly || r.getState() == Replica.State.ACTIVE)
             .count());
     assertEquals(
         "Unexpected number of active replicas: " + docCollection,
         numActive,
-        docCollection.getReplicas(EnumSet.of(Replica.Type.TLOG)).stream()
+        getReplicas(docCollection, EnumSet.of(Replica.Type.TLOG)).stream()
             .filter(r -> !activeOnly || r.getState() == Replica.State.ACTIVE)
             .count());
     return docCollection;
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java 
b/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java
index 46cd780b33f..43ae6866825 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java
@@ -211,15 +211,15 @@ public class TestTlogReplica extends SolrCloudTestCase {
       assertEquals(
           "Expecting 8 tlog replicas, 4 per shard",
           8,
-          docCollection.getReplicas(EnumSet.of(Replica.Type.TLOG)).size());
+          getReplicas(docCollection, EnumSet.of(Replica.Type.TLOG)).size());
       assertEquals(
           "Expecting no nrt replicas",
           0,
-          docCollection.getReplicas(EnumSet.of(Replica.Type.NRT)).size());
+          getReplicas(docCollection, EnumSet.of(Replica.Type.NRT)).size());
       assertEquals(
           "Expecting no pull replicas",
           0,
-          docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)).size());
+          getReplicas(docCollection, EnumSet.of(Replica.Type.PULL)).size());
       for (Slice s : docCollection.getSlices()) {
         assertSame(s.getLeader().getType(), Replica.Type.TLOG);
         List<String> shardElectionNodes =
@@ -475,7 +475,7 @@ public class TestTlogReplica extends SolrCloudTestCase {
     }
 
     waitForNumDocsInAllReplicas(
-        1, docCollection.getReplicas(EnumSet.of(Replica.Type.TLOG)), 
REPLICATION_TIMEOUT_SECS);
+        1, getReplicas(docCollection, EnumSet.of(Replica.Type.TLOG)), 
REPLICATION_TIMEOUT_SECS);
 
     // Delete leader replica from shard1
     JettySolrRunner leaderJetty = null;
@@ -503,7 +503,7 @@ public class TestTlogReplica extends SolrCloudTestCase {
 
     // Queries should still work
     waitForNumDocsInAllReplicas(
-        2, docCollection.getReplicas(EnumSet.of(Replica.Type.TLOG)), 
REPLICATION_TIMEOUT_SECS);
+        2, getReplicas(docCollection, EnumSet.of(Replica.Type.TLOG)), 
REPLICATION_TIMEOUT_SECS);
     // Start back the node
     if (removeReplica) {
       addReplicaWithRetries();
@@ -514,7 +514,7 @@ public class TestTlogReplica extends SolrCloudTestCase {
     waitForState("Expected collection to be 1x2", collectionName, 
clusterShape(1, 2));
     // added replica should replicate from the leader
     waitForNumDocsInAllReplicas(
-        2, docCollection.getReplicas(EnumSet.of(Replica.Type.TLOG)), 
REPLICATION_TIMEOUT_SECS);
+        2, getReplicas(docCollection, EnumSet.of(Replica.Type.TLOG)), 
REPLICATION_TIMEOUT_SECS);
   }
 
   private void addReplicaWithRetries() throws SolrServerException, IOException 
{
@@ -1069,19 +1069,19 @@ public class TestTlogReplica extends SolrCloudTestCase {
     assertEquals(
         "Unexpected number of nrt replicas: " + docCollection,
         numNrtReplicas,
-        docCollection.getReplicas(EnumSet.of(Replica.Type.NRT)).stream()
+        getReplicas(docCollection, EnumSet.of(Replica.Type.NRT)).stream()
             .filter(r -> !activeOnly || r.getState() == Replica.State.ACTIVE)
             .count());
     assertEquals(
         "Unexpected number of pull replicas: " + docCollection,
         numPullReplicas,
-        docCollection.getReplicas(EnumSet.of(Replica.Type.PULL)).stream()
+        getReplicas(docCollection, EnumSet.of(Replica.Type.PULL)).stream()
             .filter(r -> !activeOnly || r.getState() == Replica.State.ACTIVE)
             .count());
     assertEquals(
         "Unexpected number of tlog replicas: " + docCollection,
         numTlogReplicas,
-        docCollection.getReplicas(EnumSet.of(Replica.Type.TLOG)).stream()
+        getReplicas(docCollection, EnumSet.of(Replica.Type.TLOG)).stream()
             .filter(r -> !activeOnly || r.getState() == Replica.State.ACTIVE)
             .count());
     return docCollection;
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionTooManyReplicasTest.java
 
b/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionTooManyReplicasTest.java
index 79cf1c444f0..fae4f9ceaa4 100644
--- 
a/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionTooManyReplicasTest.java
+++ 
b/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionTooManyReplicasTest.java
@@ -187,7 +187,7 @@ public class CollectionTooManyReplicasTest extends 
SolrCloudTestCase {
         "Expected shards shardstart, 1, 2, each with two active replicas",
         collectionName,
         (n, c) -> {
-          return DocCollection.isFullyActive(n, c, 3, 2);
+          return SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 
3, 2);
         });
     Map<String, Slice> slices = 
getCollectionState(collectionName).getSlicesMap();
     assertEquals("There should be exaclty three slices", slices.size(), 3);
diff --git 
a/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryComponentOptimizationTest.java
 
b/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryComponentOptimizationTest.java
index 8df32f40837..c40d002632a 100644
--- 
a/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryComponentOptimizationTest.java
+++ 
b/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryComponentOptimizationTest.java
@@ -29,7 +29,6 @@ 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.SolrCloudTestCase;
-import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.util.SimpleOrderedMap;
@@ -68,7 +67,7 @@ public class DistributedQueryComponentOptimizationTest 
extends SolrCloudTestCase
             COLLECTION,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, sliceCount, 1));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, sliceCount, 1));
 
     new UpdateRequest()
         .add(
diff --git 
a/solr/core/src/test/org/apache/solr/schema/ManagedSchemaRoundRobinCloudTest.java
 
b/solr/core/src/test/org/apache/solr/schema/ManagedSchemaRoundRobinCloudTest.java
index b2509d8fff7..18a891fcc2c 100644
--- 
a/solr/core/src/test/org/apache/solr/schema/ManagedSchemaRoundRobinCloudTest.java
+++ 
b/solr/core/src/test/org/apache/solr/schema/ManagedSchemaRoundRobinCloudTest.java
@@ -27,7 +27,6 @@ import 
org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.schema.SchemaRequest;
 import org.apache.solr.client.solrj.response.schema.SchemaResponse;
 import org.apache.solr.cloud.SolrCloudTestCase;
-import org.apache.solr.common.cloud.DocCollection;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -51,7 +50,7 @@ public class ManagedSchemaRoundRobinCloudTest extends 
SolrCloudTestCase {
             COLLECTION,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, NUM_SHARDS, 1));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, NUM_SHARDS, 1));
   }
 
   @AfterClass
diff --git 
a/solr/core/src/test/org/apache/solr/schema/SchemaApiFailureTest.java 
b/solr/core/src/test/org/apache/solr/schema/SchemaApiFailureTest.java
index c1e5a64e03b..f9267d27db2 100644
--- a/solr/core/src/test/org/apache/solr/schema/SchemaApiFailureTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/SchemaApiFailureTest.java
@@ -27,7 +27,6 @@ import 
org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.schema.SchemaRequest;
 import org.apache.solr.client.solrj.response.schema.SchemaResponse;
 import org.apache.solr.cloud.SolrCloudTestCase;
-import org.apache.solr.common.cloud.DocCollection;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -46,7 +45,7 @@ public class SchemaApiFailureTest extends SolrCloudTestCase {
             COLLECTION,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, 2, 1));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, 2, 1));
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/search/TestCoordinatorRole.java 
b/solr/core/src/test/org/apache/solr/search/TestCoordinatorRole.java
index bb316236012..65ff8220c6d 100644
--- a/solr/core/src/test/org/apache/solr/search/TestCoordinatorRole.java
+++ b/solr/core/src/test/org/apache/solr/search/TestCoordinatorRole.java
@@ -200,10 +200,10 @@ public class TestCoordinatorRole extends 
SolrCloudTestCase {
       cluster.waitForActiveCollection(COLL, 1, 2);
       DocCollection docColl =
           
cluster.getSolrClient().getClusterStateProvider().getClusterState().getCollection(COLL);
-      Replica nrtReplica = 
docColl.getReplicas(EnumSet.of(Replica.Type.NRT)).get(0);
+      Replica nrtReplica = getReplicas(docColl, 
EnumSet.of(Replica.Type.NRT)).get(0);
       assertNotNull(nrtReplica);
       String nrtCore = nrtReplica.getCoreName();
-      Replica pullReplica = 
docColl.getReplicas(EnumSet.of(Replica.Type.PULL)).get(0);
+      Replica pullReplica = getReplicas(docColl, 
EnumSet.of(Replica.Type.PULL)).get(0);
       assertNotNull(pullReplica);
       String pullCore = pullReplica.getCoreName();
 
diff --git 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/CloudAuthStreamTest.java
 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/CloudAuthStreamTest.java
index 4cc2a1b6e7b..225ca994ec3 100644
--- 
a/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/CloudAuthStreamTest.java
+++ 
b/solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/stream/CloudAuthStreamTest.java
@@ -35,7 +35,6 @@ import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.util.TimeSource;
 import org.apache.solr.common.util.Utils;
@@ -135,7 +134,7 @@ public class CloudAuthStreamTest extends SolrCloudTestCase {
               collection,
               DEFAULT_TIMEOUT,
               TimeUnit.SECONDS,
-              (n, c) -> DocCollection.isFullyActive(n, c, 2, 2));
+              (n, c) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 2, 2));
     }
 
     solrUrl = cluster.getRandomJetty(random()).getProxyBaseUrl().toString();
diff --git 
a/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java 
b/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
index 3e112b60264..407efd7875b 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
@@ -23,13 +23,11 @@ import java.lang.invoke.MethodHandles;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiConsumer;
 import java.util.function.Supplier;
@@ -397,32 +395,6 @@ public class DocCollection extends ZkNodeProps implements 
Iterable<Slice> {
     return slice.getLeader();
   }
 
-  /**
-   * Check that all replicas in a collection are live
-   *
-   * @see CollectionStatePredicate
-   */
-  @Deprecated // only for 2 tests
-  public static boolean isFullyActive(
-      Set<String> liveNodes,
-      DocCollection collectionState,
-      int expectedShards,
-      int expectedReplicas) {
-    Objects.requireNonNull(liveNodes);
-    if (collectionState == null) return false;
-    int activeShards = 0;
-    for (Slice slice : collectionState) {
-      int activeReplicas = 0;
-      for (Replica replica : slice) {
-        if (replica.isActive(liveNodes) == false) return false;
-        activeReplicas++;
-      }
-      if (activeReplicas != expectedReplicas) return false;
-      activeShards++;
-    }
-    return activeShards == expectedShards;
-  }
-
   @Override
   public Iterator<Slice> iterator() {
     return slices.values().iterator();
@@ -437,15 +409,6 @@ public class DocCollection extends ZkNodeProps implements 
Iterable<Slice> {
     return replicas;
   }
 
-  @Deprecated // just tests, so move out or make package-protected
-  public List<Replica> getReplicas(EnumSet<Replica.Type> s) {
-    List<Replica> replicas = new ArrayList<>();
-    for (Slice slice : this) {
-      replicas.addAll(slice.getReplicas(s));
-    }
-    return replicas;
-  }
-
   @Override
   public boolean equals(Object that) {
     if (!(that instanceof DocCollection other)) return false;
diff --git 
a/solr/solrj/src/test/org/apache/solr/common/cloud/TestCloudCollectionsListeners.java
 
b/solr/solrj/src/test/org/apache/solr/common/cloud/TestCloudCollectionsListeners.java
index 97014c458d6..d04a95d5da4 100644
--- 
a/solr/solrj/src/test/org/apache/solr/common/cloud/TestCloudCollectionsListeners.java
+++ 
b/solr/solrj/src/test/org/apache/solr/common/cloud/TestCloudCollectionsListeners.java
@@ -112,7 +112,7 @@ public class TestCloudCollectionsListeners extends 
SolrCloudTestCase {
             "testcollection1",
             MAX_WAIT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, 4, 1));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, 4, 1));
 
     assertFalse(
         "CloudCollectionsListener has new collection in old set of 
collections",
diff --git 
a/solr/solrj/src/test/org/apache/solr/common/cloud/TestCollectionStateWatchers.java
 
b/solr/solrj/src/test/org/apache/solr/common/cloud/TestCollectionStateWatchers.java
index 9e7960b8c01..d4e99dac696 100644
--- 
a/solr/solrj/src/test/org/apache/solr/common/cloud/TestCollectionStateWatchers.java
+++ 
b/solr/solrj/src/test/org/apache/solr/common/cloud/TestCollectionStateWatchers.java
@@ -131,7 +131,8 @@ public class TestCollectionStateWatchers extends 
SolrCloudTestCase {
             (long) MAX_WAIT_TIMEOUT,
             TimeUnit.SECONDS,
             (CollectionStatePredicate)
-                (n, c) -> DocCollection.isFullyActive(n, c, CLUSTER_SIZE, 1));
+                (n, c) ->
+                    SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, CLUSTER_SIZE, 1));
 
     final JettySolrRunner extraJetty = cluster.startJettySolrRunner();
     final JettySolrRunner jettyToShutdown =
@@ -230,7 +231,8 @@ public class TestCollectionStateWatchers extends 
SolrCloudTestCase {
             "waitforstate",
             (long) MAX_WAIT_TIMEOUT,
             TimeUnit.SECONDS,
-            (CollectionStatePredicate) (n1, c1) -> 
DocCollection.isFullyActive(n1, c1, 1, 1));
+            (CollectionStatePredicate)
+                (n1, c1) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n1, c1, 1, 1));
 
     // several goes, to check that we're not getting delayed state changes
     for (int i = 0; i < 10; i++) {
@@ -240,7 +242,8 @@ public class TestCollectionStateWatchers extends 
SolrCloudTestCase {
                 "waitforstate",
                 (long) 1,
                 TimeUnit.SECONDS,
-                (CollectionStatePredicate) (n, c) -> 
DocCollection.isFullyActive(n, c, 1, 1));
+                (CollectionStatePredicate)
+                    (n, c) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 1, 1));
       } catch (TimeoutException e) {
         fail("waitForState should return immediately if the predicate is 
already satisfied");
       }
@@ -256,7 +259,7 @@ public class TestCollectionStateWatchers extends 
SolrCloudTestCase {
             "delayed",
             MAX_WAIT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, 1, 1));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, 1, 1));
 
     CollectionAdminRequest.createCollection("delayed", "config", 1, 1)
         .processAndWait(cluster.getSolrClient(), MAX_WAIT_TIMEOUT);
@@ -296,7 +299,8 @@ public class TestCollectionStateWatchers extends 
SolrCloudTestCase {
             "falsepredicate",
             (long) MAX_WAIT_TIMEOUT,
             TimeUnit.SECONDS,
-            (CollectionStatePredicate) (n, c) -> 
DocCollection.isFullyActive(n, c, 4, 1));
+            (CollectionStatePredicate)
+                (n, c) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 4, 1));
 
     final CountDownLatch firstCall = new CountDownLatch(1);
 
@@ -313,7 +317,8 @@ public class TestCollectionStateWatchers extends 
SolrCloudTestCase {
             TimeUnit.SECONDS,
             (liveNodes, collectionState) -> {
               firstCall.countDown();
-              return DocCollection.isFullyActive(liveNodes, collectionState, 
4, 1);
+              return SolrCloudTestCase.replicasForCollectionAreFullyActive(
+                  liveNodes, collectionState, 4, 1);
             });
 
     // first, stop another node; the watch should not be fired after this!
@@ -345,7 +350,8 @@ public class TestCollectionStateWatchers extends 
SolrCloudTestCase {
                   "no-such-collection",
                   (long) 10,
                   TimeUnit.MILLISECONDS,
-                  (CollectionStatePredicate) (n, c) -> 
DocCollection.isFullyActive(n, c, 1, 1));
+                  (CollectionStatePredicate)
+                      (n, c) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 1, 1));
         });
 
     waitFor(
diff --git 
a/solr/solrj/src/test/org/apache/solr/common/cloud/TestDocCollectionWatcher.java
 
b/solr/solrj/src/test/org/apache/solr/common/cloud/TestDocCollectionWatcher.java
index 23839d13d97..cecdb5cab41 100644
--- 
a/solr/solrj/src/test/org/apache/solr/common/cloud/TestDocCollectionWatcher.java
+++ 
b/solr/solrj/src/test/org/apache/solr/common/cloud/TestDocCollectionWatcher.java
@@ -162,7 +162,7 @@ public class TestDocCollectionWatcher extends 
SolrCloudTestCase {
             "waitforstate",
             MAX_WAIT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n1, c1) -> DocCollection.isFullyActive(n1, c1, 1, 1));
+            (n1, c1) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n1, c1, 1, 1));
 
     // several goes, to check that we're not getting delayed state changes
     for (int i = 0; i < 10; i++) {
@@ -172,7 +172,7 @@ public class TestDocCollectionWatcher extends 
SolrCloudTestCase {
                 "waitforstate",
                 1,
                 TimeUnit.SECONDS,
-                (n, c) -> DocCollection.isFullyActive(n, c, 1, 1));
+                (n, c) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 1, 1));
       } catch (TimeoutException e) {
         fail("waitForState should return immediately if the predicate is 
already satisfied");
       }
@@ -223,7 +223,7 @@ public class TestDocCollectionWatcher extends 
SolrCloudTestCase {
             "falsepredicate",
             MAX_WAIT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n1, c1) -> DocCollection.isFullyActive(n1, c1, 1, 1));
+            (n1, c1) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n1, c1, 1, 1));
 
     // set watcher waiting for at least 3 replicas (will fail initially)
     final AtomicInteger runCount = new AtomicInteger(0);
@@ -251,7 +251,7 @@ public class TestDocCollectionWatcher extends 
SolrCloudTestCase {
             "falsepredicate",
             MAX_WAIT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, 1, 2));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, 1, 2));
 
     // confirm watcher has run at least once and has been retained...
     final int runCountSnapshot = runCount.get();
@@ -302,7 +302,7 @@ public class TestDocCollectionWatcher extends 
SolrCloudTestCase {
             "tobedeleted",
             MAX_WAIT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c1) -> DocCollection.isFullyActive(n, c1, 1, 1));
+            (n, c1) -> 
SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c1, 1, 1));
 
     Future<Boolean> future =
         waitInBackground("tobedeleted", MAX_WAIT_TIMEOUT, TimeUnit.SECONDS, 
Objects::isNull);
diff --git 
a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java 
b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
index c7d51040b4b..b2499fc7e2a 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
@@ -30,9 +30,11 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
@@ -146,6 +148,39 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 {
     }
   }
 
+  /**
+   * Check that all replicas in a collection are live
+   *
+   * @see CollectionStatePredicate
+   */
+  public static boolean replicasForCollectionAreFullyActive(
+      Set<String> liveNodes,
+      DocCollection collectionState,
+      int expectedShards,
+      int expectedReplicas) {
+    Objects.requireNonNull(liveNodes);
+    if (collectionState == null) return false;
+    int activeShards = 0;
+    for (Slice slice : collectionState) {
+      int activeReplicas = 0;
+      for (Replica replica : slice) {
+        if (replica.isActive(liveNodes) == false) return false;
+        activeReplicas++;
+      }
+      if (activeReplicas != expectedReplicas) return false;
+      activeShards++;
+    }
+    return activeShards == expectedShards;
+  }
+
+  public static List<Replica> getReplicas(DocCollection collectionState, 
EnumSet<Replica.Type> s) {
+    List<Replica> replicas = new ArrayList<>();
+    for (Slice slice : collectionState) {
+      replicas.addAll(slice.getReplicas(s));
+    }
+    return replicas;
+  }
+
   @Before
   public void checkClusterConfiguration() {}
 
diff --git 
a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCollectionsAPIDistributedZkTestBase.java
 
b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCollectionsAPIDistributedZkTestBase.java
index f1aa6c29625..98edf7f3e87 100644
--- 
a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCollectionsAPIDistributedZkTestBase.java
+++ 
b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCollectionsAPIDistributedZkTestBase.java
@@ -342,7 +342,7 @@ public abstract class 
AbstractCollectionsAPIDistributedZkTestBase extends SolrCl
     waitForState(
         "Collection creation after a bad delete failed",
         "acollectionafterbaddelete",
-        (n, c) -> DocCollection.isFullyActive(n, c, 1, 2));
+        (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, c, 
1, 2));
   }
 
   @Test
@@ -478,7 +478,7 @@ public abstract class 
AbstractCollectionsAPIDistributedZkTestBase extends SolrCl
           collectionName,
           (n, c) -> {
             CollectionAdminRequest.Create req = createRequests[j];
-            return DocCollection.isFullyActive(
+            return SolrCloudTestCase.replicasForCollectionAreFullyActive(
                 n, c, req.getNumShards(), req.getReplicationFactor());
           });
 
diff --git 
a/solr/test-framework/src/test/org/apache/solr/client/solrj/apache/ConnectionReuseTest.java
 
b/solr/test-framework/src/test/org/apache/solr/client/solrj/apache/ConnectionReuseTest.java
index a5bbf93a0b2..2a5a4241cc1 100644
--- 
a/solr/test-framework/src/test/org/apache/solr/client/solrj/apache/ConnectionReuseTest.java
+++ 
b/solr/test-framework/src/test/org/apache/solr/client/solrj/apache/ConnectionReuseTest.java
@@ -42,7 +42,6 @@ import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
-import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.update.AddUpdateCommand;
 import org.apache.solr.util.TestInjection;
 import org.junit.BeforeClass;
@@ -78,7 +77,7 @@ public class ConnectionReuseTest extends SolrCloudTestCase {
             COLLECTION,
             DEFAULT_TIMEOUT,
             TimeUnit.SECONDS,
-            (n, c) -> DocCollection.isFullyActive(n, c, 1, 1));
+            (n, c) -> SolrCloudTestCase.replicasForCollectionAreFullyActive(n, 
c, 1, 1));
   }
 
   private SolrClient buildClient(CloseableHttpClient httpClient, URL url) {


Reply via email to