You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ds...@apache.org on 2023/07/18 04:12:05 UTC

[solr] branch main updated: Refactor: remove PerReplicaStatesFetcher (#1724)

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

dsmiley 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 d772f112032 Refactor: remove PerReplicaStatesFetcher (#1724)
d772f112032 is described below

commit d772f112032c4a8648c97d688b792ccb6459a10e
Author: David Smiley <ds...@apache.org>
AuthorDate: Tue Jul 18 00:12:00 2023 -0400

    Refactor: remove PerReplicaStatesFetcher (#1724)
    
    The methods go to PerReplicaStatesOps
---
 .../solr/cloud/DistributedClusterStateUpdater.java |  3 +-
 .../solr/cloud/ShardLeaderElectionContextBase.java |  3 +-
 .../java/org/apache/solr/cloud/ZkController.java   |  7 ++-
 .../cloud/api/collections/CreateCollectionCmd.java |  8 ++-
 .../solr/cloud/overseer/CollectionMutator.java     |  3 +-
 .../apache/solr/cloud/overseer/NodeMutator.java    |  3 +-
 .../apache/solr/cloud/overseer/ZkStateWriter.java  | 10 ++--
 .../solr/cloud/overseer/ZkStateReaderTest.java     | 27 +++++-----
 .../solr/cloud/overseer/ZkStateWriterTest.java     |  6 +--
 .../solrj/impl/ZkClientClusterStateProvider.java   |  4 +-
 .../client/solrj/impl/ZkDistribStateManager.java   |  4 +-
 .../solr/common/cloud/PerReplicaStatesFetcher.java | 62 ----------------------
 .../solr/common/cloud/PerReplicaStatesOps.java     | 36 ++++++++++++-
 .../solr/common/cloud/TestPerReplicaStates.java    | 12 ++---
 .../client/solrj/impl/CloudSolrClientTest.java     |  9 ++--
 .../cloud/PerReplicaStatesIntegrationTest.java     | 22 ++++----
 16 files changed, 90 insertions(+), 129 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/DistributedClusterStateUpdater.java b/solr/core/src/java/org/apache/solr/cloud/DistributedClusterStateUpdater.java
index 935f32e5940..bc565ad97e8 100644
--- a/solr/core/src/java/org/apache/solr/cloud/DistributedClusterStateUpdater.java
+++ b/solr/core/src/java/org/apache/solr/cloud/DistributedClusterStateUpdater.java
@@ -52,7 +52,6 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.PerReplicaStates;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
 import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -506,7 +505,7 @@ public class DistributedClusterStateUpdater {
             // Fetch the per replica states updates done previously or skip fetching if we already
             // have them
             fetchedPerReplicaStates =
-                PerReplicaStatesFetcher.fetch(
+                PerReplicaStatesOps.fetch(
                     docCollection.getZNode(), zkStateReader.getZkClient(), fetchedPerReplicaStates);
             // Transpose the per replica states into the cluster state
             updatedState =
diff --git a/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContextBase.java b/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContextBase.java
index 3b17234b570..c6ac7421d95 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContextBase.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContextBase.java
@@ -24,7 +24,6 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.PerReplicaStates;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
 import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -236,7 +235,7 @@ class ShardLeaderElectionContextBase extends ElectionContext {
       }
       if (coll != null && coll.isPerReplicaState()) {
         PerReplicaStates prs =
-            PerReplicaStatesFetcher.fetch(coll.getZNode(), zkClient, coll.getPerReplicaStates());
+            PerReplicaStatesOps.fetch(coll.getZNode(), zkClient, coll.getPerReplicaStates());
         PerReplicaStatesOps.flipLeader(
                 zkStateReader
                     .getClusterState()
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index 3245bf1de3e..4ef67664773 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -83,7 +83,6 @@ import org.apache.solr.common.cloud.LiveNodesListener;
 import org.apache.solr.common.cloud.NodesSysPropsCacher;
 import org.apache.solr.common.cloud.OnReconnect;
 import org.apache.solr.common.cloud.PerReplicaStates;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
 import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Replica.Type;
@@ -1801,7 +1800,7 @@ public class ZkController implements Closeable {
       // as overseer does not and should not handle those entries
       if (coll != null && coll.isPerReplicaState() && coreNodeName != null) {
         PerReplicaStates perReplicaStates =
-            PerReplicaStatesFetcher.fetch(coll.getZNode(), zkClient, coll.getPerReplicaStates());
+            PerReplicaStatesOps.fetch(coll.getZNode(), zkClient, coll.getPerReplicaStates());
         PerReplicaStatesOps.flipState(coreNodeName, state, perReplicaStates)
             .persist(coll.getZNode(), zkClient);
       }
@@ -1886,7 +1885,7 @@ public class ZkController implements Closeable {
               docCollection.getName());
         }
         PerReplicaStates perReplicaStates =
-            PerReplicaStatesFetcher.fetch(
+            PerReplicaStatesOps.fetch(
                 docCollection.getZNode(), zkClient, docCollection.getPerReplicaStates());
         PerReplicaStatesOps.deleteReplica(coreNodeName, perReplicaStates)
             .persist(docCollection.getZNode(), zkClient);
@@ -2961,7 +2960,7 @@ public class ZkController implements Closeable {
                 });
             PerReplicaStatesOps.downReplicas(
                     replicasToDown,
-                    PerReplicaStatesFetcher.fetch(
+                    PerReplicaStatesOps.fetch(
                         coll.getZNode(), zkClient, coll.getPerReplicaStates()))
                 .persist(coll.getZNode(), zkClient);
           }
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
index 99aa221519a..9accbf4dc69 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
@@ -69,7 +69,7 @@ import org.apache.solr.common.cloud.DocCollection.CollectionStateProps;
 import org.apache.solr.common.cloud.DocRouter;
 import org.apache.solr.common.cloud.ImplicitDocRouter;
 import org.apache.solr.common.cloud.PerReplicaStates;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
+import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.ReplicaPosition;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -425,14 +425,12 @@ public class CreateCollectionCmd implements CollApiCmds.CollectionApiCommand {
                 TimeUnit.SECONDS,
                 ccc.getSolrCloudManager().getTimeSource()); // could be a big cluster
         PerReplicaStates prs =
-            PerReplicaStatesFetcher.fetch(
-                collectionPath, ccc.getZkStateReader().getZkClient(), null);
+            PerReplicaStatesOps.fetch(collectionPath, ccc.getZkStateReader().getZkClient(), null);
         while (!timeout.hasTimedOut()) {
           if (prs.allActive()) break;
           Thread.sleep(100);
           prs =
-              PerReplicaStatesFetcher.fetch(
-                  collectionPath, ccc.getZkStateReader().getZkClient(), null);
+              PerReplicaStatesOps.fetch(collectionPath, ccc.getZkStateReader().getZkClient(), null);
         }
         if (prs.allActive()) {
           // we have successfully found all replicas to be ACTIVE
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java b/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
index 028beb37dfd..318dd595d31 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
@@ -34,7 +34,6 @@ import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.DocCollection.CollectionStateProps;
 import org.apache.solr.common.cloud.PerReplicaStates;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
 import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
@@ -128,7 +127,7 @@ public class CollectionMutator {
           log.error("trying to set perReplicaState to {} from {}", val, coll.isPerReplicaState());
           continue;
         }
-        PerReplicaStates prs = PerReplicaStatesFetcher.fetch(coll.getZNode(), zkClient, null);
+        PerReplicaStates prs = PerReplicaStatesOps.fetch(coll.getZNode(), zkClient, null);
         replicaOps =
             enable ? PerReplicaStatesOps.enable(coll, prs) : PerReplicaStatesOps.disable(prs);
         if (!enable) {
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/NodeMutator.java b/solr/core/src/java/org/apache/solr/cloud/overseer/NodeMutator.java
index 4c78f0d6718..8afcd805233 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/NodeMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/NodeMutator.java
@@ -28,7 +28,6 @@ import org.apache.solr.client.solrj.cloud.SolrCloudManager;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.PerReplicaStates;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
 import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
@@ -123,7 +122,7 @@ public class NodeMutator {
         PerReplicaStates prs =
             client == null
                 ? docCollection.getPerReplicaStates()
-                : PerReplicaStatesFetcher.fetch(
+                : PerReplicaStatesOps.fetch(
                     docCollection.getZNode(), client, docCollection.getPerReplicaStates());
 
         return Optional.of(
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java b/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
index e38e58b3798..234fbdbd31d 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
@@ -30,7 +30,7 @@ import org.apache.solr.cloud.Overseer;
 import org.apache.solr.cloud.Stats;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
+import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.util.Compressor;
 import org.apache.solr.common.util.Utils;
@@ -273,7 +273,7 @@ public class ZkStateWriter {
                 clusterState.copyWith(
                     name,
                     cmd.collection.setPerReplicaStates(
-                        PerReplicaStatesFetcher.fetch(
+                        PerReplicaStatesOps.fetch(
                             cmd.collection.getZNode(), reader.getZkClient(), null)));
           }
 
@@ -302,7 +302,7 @@ public class ZkStateWriter {
                       c.getProperties(),
                       c.getRouter(),
                       stat.getVersion(),
-                      PerReplicaStatesFetcher.getZkClientPrsSupplier(reader.getZkClient(), path));
+                      PerReplicaStatesOps.getZkClientPrsSupplier(reader.getZkClient(), path));
               clusterState = clusterState.copyWith(name, newCollection);
             } else {
               log.debug("going to create_collection {}", path);
@@ -314,7 +314,7 @@ public class ZkStateWriter {
                       c.getProperties(),
                       c.getRouter(),
                       0,
-                      PerReplicaStatesFetcher.getZkClientPrsSupplier(reader.getZkClient(), path));
+                      PerReplicaStatesOps.getZkClientPrsSupplier(reader.getZkClient(), path));
               clusterState = clusterState.copyWith(name, newCollection);
             }
           }
@@ -326,7 +326,7 @@ public class ZkStateWriter {
                   clusterState.copyWith(
                       name,
                       currentCollState.setPerReplicaStates(
-                          PerReplicaStatesFetcher.fetch(
+                          PerReplicaStatesOps.fetch(
                               currentCollState.getZNode(), reader.getZkClient(), null)));
             }
           }
diff --git a/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateReaderTest.java b/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateReaderTest.java
index 52671ed003b..6e1f4221943 100644
--- a/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateReaderTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateReaderTest.java
@@ -41,7 +41,6 @@ import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.DocCollectionWatcher;
 import org.apache.solr.common.cloud.DocRouter;
 import org.apache.solr.common.cloud.PerReplicaStates;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
 import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -144,7 +143,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
                 Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
                 DocRouter.DEFAULT,
                 0,
-                PerReplicaStatesFetcher.getZkClientPrsSupplier(
+                PerReplicaStatesOps.getZkClientPrsSupplier(
                     fixture.zkClient, DocCollection.getCollectionPath("c1"))));
 
     writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(c1), null);
@@ -171,7 +170,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
             DocRouter.DEFAULT,
             0,
-            PerReplicaStatesFetcher.getZkClientPrsSupplier(
+            PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     ZkWriteCommand wc = new ZkWriteCommand("c1", state);
     writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
@@ -190,7 +189,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             props,
             DocRouter.DEFAULT,
             0,
-            PerReplicaStatesFetcher.getZkClientPrsSupplier(
+            PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     wc = new ZkWriteCommand("c1", state);
     writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
@@ -231,7 +230,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
             DocRouter.DEFAULT,
             0,
-            PerReplicaStatesFetcher.getZkClientPrsSupplier(
+            PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     ZkWriteCommand wc = new ZkWriteCommand("c1", state);
     writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
@@ -269,7 +268,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
                 "true"),
             DocRouter.DEFAULT,
             0,
-            PerReplicaStatesFetcher.getZkClientPrsSupplier(
+            PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     ZkWriteCommand wc = new ZkWriteCommand("c1", state);
     writer.enqueueUpdate(clusterState, Collections.singletonList(wc), null);
@@ -292,7 +291,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
 
     DocCollection collection = ref.get();
     PerReplicaStates prs =
-        PerReplicaStatesFetcher.fetch(
+        PerReplicaStatesOps.fetch(
             collection.getZNode(), fixture.zkClient, collection.getPerReplicaStates());
     PerReplicaStatesOps.addReplica("r1", Replica.State.DOWN, false, prs)
         .persist(collection.getZNode(), fixture.zkClient);
@@ -351,7 +350,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
     // re-add PRS
     collection = ref.get();
     prs =
-        PerReplicaStatesFetcher.fetch(
+        PerReplicaStatesOps.fetch(
             collection.getZNode(), fixture.zkClient, collection.getPerReplicaStates());
     PerReplicaStatesOps.addReplica("r1", Replica.State.DOWN, false, prs)
         .persist(collection.getZNode(), fixture.zkClient);
@@ -389,7 +388,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
             DocRouter.DEFAULT,
             0,
-            PerReplicaStatesFetcher.getZkClientPrsSupplier(
+            PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     ZkWriteCommand wc = new ZkWriteCommand("c1", state);
     writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
@@ -411,7 +410,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
             DocRouter.DEFAULT,
             ref.get().getZNodeVersion(),
-            PerReplicaStatesFetcher.getZkClientPrsSupplier(
+            PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     wc = new ZkWriteCommand("c1", state);
     writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
@@ -434,7 +433,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
             DocRouter.DEFAULT,
             0,
-            PerReplicaStatesFetcher.getZkClientPrsSupplier(
+            PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c2")));
     ZkWriteCommand wc2 = new ZkWriteCommand("c2", state);
 
@@ -550,7 +549,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
             DocRouter.DEFAULT,
             0,
-            PerReplicaStatesFetcher.getZkClientPrsSupplier(
+            PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     ZkWriteCommand wc1 = new ZkWriteCommand("c1", state1);
     DocCollection state2 =
@@ -560,7 +559,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
             DocRouter.DEFAULT,
             0,
-            PerReplicaStatesFetcher.getZkClientPrsSupplier(
+            PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
 
     // do not listen to c2
@@ -615,7 +614,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
                             ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
                         DocRouter.DEFAULT,
                         currentVersion,
-                        PerReplicaStatesFetcher.getZkClientPrsSupplier(
+                        PerReplicaStatesOps.getZkClientPrsSupplier(
                             fixture.zkClient, DocCollection.getCollectionPath("c1")));
                 ZkWriteCommand wc = new ZkWriteCommand("c1", state);
                 writer.enqueueUpdate(clusterState, Collections.singletonList(wc), null);
diff --git a/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java b/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java
index d99097d8573..1a2c940e8dd 100644
--- a/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java
@@ -33,7 +33,7 @@ import org.apache.solr.cloud.ZkTestServer;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.DocRouter;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
+import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -184,7 +184,7 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
                     prsProps,
                     DocRouter.DEFAULT,
                     0,
-                    PerReplicaStatesFetcher.getZkClientPrsSupplier(
+                    PerReplicaStatesOps.getZkClientPrsSupplier(
                         zkClient, DocCollection.getCollectionPath("c1"))));
         ZkStateWriter writer =
             new ZkStateWriter(reader, new Stats(), -1, STATE_COMPRESSION_PROVIDER);
@@ -270,7 +270,7 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
                     prsProps,
                     DocRouter.DEFAULT,
                     0,
-                    PerReplicaStatesFetcher.getZkClientPrsSupplier(
+                    PerReplicaStatesOps.getZkClientPrsSupplier(
                         zkClient, DocCollection.getCollectionPath("prs1"))));
         ZkStateWriter writer =
             new ZkStateWriter(reader, new Stats(), -1, STATE_COMPRESSION_PROVIDER);
diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java
index d6005da2a3f..ff805fced17 100644
--- a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java
+++ b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java
@@ -28,7 +28,7 @@ import org.apache.solr.common.AlreadyClosedException;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
+import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -118,7 +118,7 @@ public class ZkClientClusterStateProvider implements ClusterStateProvider {
         version,
         stateMap,
         liveNodes,
-        PerReplicaStatesFetcher.getZkClientPrsSupplier(
+        PerReplicaStatesOps.getZkClientPrsSupplier(
             zkClient, DocCollection.getCollectionPath(coll)));
   }
 
diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkDistribStateManager.java b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkDistribStateManager.java
index 4e050d22572..e5a987c38d9 100644
--- a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkDistribStateManager.java
+++ b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkDistribStateManager.java
@@ -29,7 +29,7 @@ import org.apache.solr.client.solrj.cloud.NotEmptyException;
 import org.apache.solr.client.solrj.cloud.VersionedData;
 import org.apache.solr.common.AlreadyClosedException;
 import org.apache.solr.common.cloud.PerReplicaStates;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
+import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.util.Utils;
 import org.apache.zookeeper.CreateMode;
@@ -216,6 +216,6 @@ public class ZkDistribStateManager implements DistribStateManager {
   @Override
   public PerReplicaStates getReplicaStates(String path)
       throws KeeperException, InterruptedException {
-    return PerReplicaStatesFetcher.fetch(path, zkClient, null);
+    return PerReplicaStatesOps.fetch(path, zkClient, null);
   }
 }
diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesFetcher.java b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesFetcher.java
deleted file mode 100644
index 1de41b93b93..00000000000
--- a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesFetcher.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.solr.common.cloud;
-
-import java.lang.invoke.MethodHandles;
-import java.util.Collections;
-import java.util.List;
-import org.apache.solr.common.SolrException;
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.data.Stat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PerReplicaStatesFetcher {
-  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-  /**
-   * Fetch the latest {@link PerReplicaStates} . It fetches data after checking the {@link
-   * Stat#getCversion()} of state.json. If this is not modified, the same object is returned
-   */
-  public static PerReplicaStates fetch(
-      String path, SolrZkClient zkClient, PerReplicaStates current) {
-    try {
-      if (current != null) {
-        Stat stat = zkClient.exists(current.path, null, true);
-        if (stat == null) return new PerReplicaStates(path, 0, Collections.emptyList());
-        if (current.cversion == stat.getCversion()) return current; // not modifiedZkStateReaderTest
-      }
-      Stat stat = new Stat();
-      List<String> children = zkClient.getChildren(path, null, stat, true);
-      return new PerReplicaStates(path, stat.getCversion(), Collections.unmodifiableList(children));
-    } catch (KeeperException e) {
-      throw new SolrException(
-          SolrException.ErrorCode.SERVER_ERROR, "Error fetching per-replica states", e);
-    } catch (InterruptedException e) {
-      SolrZkClient.checkInterrupted(e);
-      throw new SolrException(
-          SolrException.ErrorCode.SERVER_ERROR,
-          "Thread interrupted when loading per-replica states from " + path,
-          e);
-    }
-  }
-
-  public static DocCollection.PrsSupplier getZkClientPrsSupplier(
-      SolrZkClient zkClient, String collectionPath) {
-    return () -> PerReplicaStatesFetcher.fetch(collectionPath, zkClient, null);
-  }
-}
diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesOps.java b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesOps.java
index e85646d7207..475b852e75c 100644
--- a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesOps.java
+++ b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesOps.java
@@ -26,9 +26,11 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.function.Function;
+import org.apache.solr.common.SolrException;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.Op;
+import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,6 +49,38 @@ public class PerReplicaStatesOps {
     this.fun = fun;
   }
 
+  /**
+   * Fetch the latest {@link PerReplicaStates} . It fetches data after checking the {@link
+   * Stat#getCversion()} of state.json. If this is not modified, the same object is returned
+   */
+  public static PerReplicaStates fetch(
+      String path, SolrZkClient zkClient, PerReplicaStates current) {
+    try {
+      if (current != null) {
+        Stat stat = zkClient.exists(current.path, null, true);
+        if (stat == null) return new PerReplicaStates(path, 0, Collections.emptyList());
+        if (current.cversion == stat.getCversion()) return current; // not modifiedZkStateReaderTest
+      }
+      Stat stat = new Stat();
+      List<String> children = zkClient.getChildren(path, null, stat, true);
+      return new PerReplicaStates(path, stat.getCversion(), Collections.unmodifiableList(children));
+    } catch (KeeperException e) {
+      throw new SolrException(
+          SolrException.ErrorCode.SERVER_ERROR, "Error fetching per-replica states", e);
+    } catch (InterruptedException e) {
+      SolrZkClient.checkInterrupted(e);
+      throw new SolrException(
+          SolrException.ErrorCode.SERVER_ERROR,
+          "Thread interrupted when loading per-replica states from " + path,
+          e);
+    }
+  }
+
+  public static DocCollection.PrsSupplier getZkClientPrsSupplier(
+      SolrZkClient zkClient, String collectionPath) {
+    return () -> fetch(collectionPath, zkClient, null);
+  }
+
   /** Persist a set of operations to Zookeeper */
   private void persist(
       List<PerReplicaStates.Operation> operations, String znode, SolrZkClient zkClient)
@@ -97,7 +131,7 @@ public class PerReplicaStatesOps {
         if (log.isInfoEnabled()) {
           log.info("Stale state for {}, attempt: {}. retrying...", znode, i);
         }
-        operations = refresh(PerReplicaStatesFetcher.fetch(znode, zkClient, null));
+        operations = refresh(fetch(znode, zkClient, null));
       }
     }
   }
diff --git a/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/TestPerReplicaStates.java b/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/TestPerReplicaStates.java
index 99edf56cd69..ab650bdc608 100644
--- a/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/TestPerReplicaStates.java
+++ b/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/TestPerReplicaStates.java
@@ -95,7 +95,7 @@ public class TestPerReplicaStates extends SolrCloudTestCase {
     }
 
     ZkStateReader zkStateReader = cluster.getZkStateReader();
-    PerReplicaStates rs = PerReplicaStatesFetcher.fetch(root, zkStateReader.getZkClient(), null);
+    PerReplicaStates rs = PerReplicaStatesOps.fetch(root, zkStateReader.getZkClient(), null);
     assertEquals(3, rs.states.size());
     assertTrue(rs.cversion >= 5);
 
@@ -103,7 +103,7 @@ public class TestPerReplicaStates extends SolrCloudTestCase {
     assertEquals(1, ops.get().size());
     assertEquals(PerReplicaStates.Operation.Type.ADD, ops.ops.get(0).typ);
     ops.persist(root, cluster.getZkClient());
-    rs = PerReplicaStatesFetcher.fetch(root, zkStateReader.getZkClient(), null);
+    rs = PerReplicaStatesOps.fetch(root, zkStateReader.getZkClient(), null);
     assertEquals(4, rs.states.size());
     assertTrue(rs.cversion >= 6);
     assertEquals(6, cluster.getZkClient().getChildren(root, null, true).size());
@@ -115,7 +115,7 @@ public class TestPerReplicaStates extends SolrCloudTestCase {
     assertEquals(PerReplicaStates.Operation.Type.DELETE, ops.ops.get(2).typ);
     assertEquals(PerReplicaStates.Operation.Type.DELETE, ops.ops.get(3).typ);
     ops.persist(root, cluster.getZkClient());
-    rs = PerReplicaStatesFetcher.fetch(root, zkStateReader.getZkClient(), null);
+    rs = PerReplicaStatesOps.fetch(root, zkStateReader.getZkClient(), null);
     assertEquals(4, rs.states.size());
     assertEquals(3, rs.states.get("R1").version);
 
@@ -123,7 +123,7 @@ public class TestPerReplicaStates extends SolrCloudTestCase {
     assertEquals(1, ops.ops.size());
     ops.persist(root, cluster.getZkClient());
 
-    rs = PerReplicaStatesFetcher.fetch(root, zkStateReader.getZkClient(), null);
+    rs = PerReplicaStatesOps.fetch(root, zkStateReader.getZkClient(), null);
     assertEquals(3, rs.states.size());
 
     ops = PerReplicaStatesOps.flipLeader(Set.of("R4", "R3", "R1"), "R4", rs);
@@ -131,11 +131,11 @@ public class TestPerReplicaStates extends SolrCloudTestCase {
     assertEquals(PerReplicaStates.Operation.Type.ADD, ops.ops.get(0).typ);
     assertEquals(PerReplicaStates.Operation.Type.DELETE, ops.ops.get(1).typ);
     ops.persist(root, cluster.getZkClient());
-    rs = PerReplicaStatesFetcher.fetch(root, zkStateReader.getZkClient(), null);
+    rs = PerReplicaStatesOps.fetch(root, zkStateReader.getZkClient(), null);
     ops = PerReplicaStatesOps.flipLeader(Set.of("R4", "R3", "R1"), "R3", rs);
     assertEquals(4, ops.ops.size());
     ops.persist(root, cluster.getZkClient());
-    rs = PerReplicaStatesFetcher.fetch(root, zkStateReader.getZkClient(), null);
+    rs = PerReplicaStatesOps.fetch(root, zkStateReader.getZkClient(), null);
     assertTrue(rs.get("R3").isLeader);
   }
 }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
index d29d6b23153..cd19861577f 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
@@ -59,7 +59,7 @@ import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.DocRouter;
 import org.apache.solr.common.cloud.PerReplicaStates;
-import org.apache.solr.common.cloud.PerReplicaStatesFetcher;
+import org.apache.solr.common.cloud.PerReplicaStatesOps;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -1184,8 +1184,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
 
     DocCollection c = cluster.getZkStateReader().getCollection(testCollection);
     c.forEachReplica((s, replica) -> assertNotNull(replica.getReplicaState()));
-    PerReplicaStates prs =
-        PerReplicaStatesFetcher.fetch(collectionPath, cluster.getZkClient(), null);
+    PerReplicaStates prs = PerReplicaStatesOps.fetch(collectionPath, cluster.getZkClient(), null);
     assertEquals(4, prs.states.size());
 
     JettySolrRunner jsr = null;
@@ -1195,7 +1194,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
       // Now let's do an add replica
       CollectionAdminRequest.addReplicaToShard(testCollection, "shard1")
           .process(cluster.getSolrClient());
-      prs = PerReplicaStatesFetcher.fetch(collectionPath, cluster.getZkClient(), null);
+      prs = PerReplicaStatesOps.fetch(collectionPath, cluster.getZkClient(), null);
       assertEquals(5, prs.states.size());
 
       // create a collection with PRS and v2 API
@@ -1211,7 +1210,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
       cluster.waitForActiveCollection(testCollection, 2, 4);
       c = cluster.getZkStateReader().getCollection(testCollection);
       c.forEachReplica((s, replica) -> assertNotNull(replica.getReplicaState()));
-      prs = PerReplicaStatesFetcher.fetch(collectionPath, cluster.getZkClient(), null);
+      prs = PerReplicaStatesOps.fetch(collectionPath, cluster.getZkClient(), null);
       assertEquals(4, prs.states.size());
     } finally {
       if (jsr != null) {
diff --git a/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java b/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java
index 2edfe3b7d54..e75100f1a50 100644
--- a/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java
+++ b/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java
@@ -78,7 +78,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
       DocCollection c = cluster.getZkStateReader().getCollection(testCollection);
       c.forEachReplica((s, replica) -> assertNotNull(replica.getReplicaState()));
       PerReplicaStates prs =
-          PerReplicaStatesFetcher.fetch(
+          PerReplicaStatesOps.fetch(
               DocCollection.getCollectionPath(testCollection), cluster.getZkClient(), null);
       assertEquals(4, prs.states.size());
       JettySolrRunner jsr = cluster.startJettySolrRunner();
@@ -87,7 +87,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
           .process(cluster.getSolrClient());
       cluster.waitForActiveCollection(testCollection, 2, 5);
       prs =
-          PerReplicaStatesFetcher.fetch(
+          PerReplicaStatesOps.fetch(
               DocCollection.getCollectionPath(testCollection), cluster.getZkClient(), null);
       assertEquals(5, prs.states.size());
 
@@ -97,7 +97,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
           .process(cluster.getSolrClient());
       cluster.waitForActiveCollection(testCollection, 2, 4);
       prs =
-          PerReplicaStatesFetcher.fetch(
+          PerReplicaStatesOps.fetch(
               DocCollection.getCollectionPath(testCollection), cluster.getZkClient(), null);
       assertEquals(4, prs.states.size());
 
@@ -112,7 +112,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
       c = cluster.getZkStateReader().getCollection(testCollection);
       c.forEachReplica((s, replica) -> assertNotNull(replica.getReplicaState()));
       prs =
-          PerReplicaStatesFetcher.fetch(
+          PerReplicaStatesOps.fetch(
               DocCollection.getCollectionPath(testCollection), cluster.getZkClient(), null);
       assertEquals(4, prs.states.size());
     } finally {
@@ -144,8 +144,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
       c.forEachReplica((s, replica) -> assertNotNull(replica.getReplicaState()));
       String collectionPath = DocCollection.getCollectionPath(testCollection);
       PerReplicaStates prs =
-          PerReplicaStatesFetcher.fetch(
-              collectionPath, SolrCloudTestCase.cluster.getZkClient(), null);
+          PerReplicaStatesOps.fetch(collectionPath, SolrCloudTestCase.cluster.getZkClient(), null);
       assertEquals(1, prs.states.size());
 
       JettySolrRunner jsr = cluster.startJettySolrRunner();
@@ -156,8 +155,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
           .process(cluster.getSolrClient());
       cluster.waitForActiveCollection(testCollection, 1, 2);
       prs =
-          PerReplicaStatesFetcher.fetch(
-              collectionPath, SolrCloudTestCase.cluster.getZkClient(), null);
+          PerReplicaStatesOps.fetch(collectionPath, SolrCloudTestCase.cluster.getZkClient(), null);
       assertEquals(2, prs.states.size());
       c = cluster.getZkStateReader().getCollection(testCollection);
       prs.states.forEachEntry((s, state) -> assertEquals(Replica.State.ACTIVE, state.state));
@@ -183,7 +181,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
           log.info("after down node, state.json v: {}", c.getZNodeVersion());
         }
         prs =
-            PerReplicaStatesFetcher.fetch(
+            PerReplicaStatesOps.fetch(
                 collectionPath, SolrCloudTestCase.cluster.getZkClient(), null);
         PerReplicaStates.State st = prs.get(replicaName);
         assertNotEquals(Replica.State.ACTIVE, st.state);
@@ -214,7 +212,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
         jsr.start();
         cluster.waitForActiveCollection(testCollection, 1, 2);
         prs =
-            PerReplicaStatesFetcher.fetch(
+            PerReplicaStatesOps.fetch(
                 collectionPath, SolrCloudTestCase.cluster.getZkClient(), null);
         prs.states.forEachEntry((s, state) -> assertEquals(Replica.State.ACTIVE, state.state));
       }
@@ -247,7 +245,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
 
       PerReplicaStates prs1 =
           original =
-              PerReplicaStatesFetcher.fetch(
+              PerReplicaStatesOps.fetch(
                   DocCollection.getCollectionPath(COLL), cluster.getZkClient(), null);
       log.info("prs1 : {}", prs1);
 
@@ -274,7 +272,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
               (liveNodes, collectionState) -> {
                 AtomicBoolean anyFail = new AtomicBoolean(false);
                 PerReplicaStates prs2 =
-                    PerReplicaStatesFetcher.fetch(
+                    PerReplicaStatesOps.fetch(
                         DocCollection.getCollectionPath(COLL), cluster.getZkClient(), null);
                 prs2.states.forEachEntry(
                     (r, newState) -> {