diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 0076975aec7..0d4a99abfea 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -225,7 +225,8 @@ led to the suppression of exceptions. (Andrey Bozhko) * SOLR-17534: Introduce ClusterState.getCollectionNames, a convenience method (David Smiley) -* SOLR-17535: Introduce ClusterState.collectionStream to replace getCollectionStates and getCollectionsMap (David Smiley) +* SOLR-17535: Introduce ClusterState.collectionStream to replace getCollectionStates, getCollectionsMap, + and forEachCollection, which are now deprecated. (David Smiley) * SOLR-17545: Upgrade to Gradle 8.10 (Houston Putman) diff --git a/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java b/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java index 05a243f38ee..b2c5f0c99cd 100644 --- a/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java +++ b/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java @@ -40,7 +40,6 @@ import org.apache.solr.cluster.events.ClusterEvent; import org.apache.solr.cluster.events.ClusterEventListener; import org.apache.solr.cluster.events.NodesDownEvent; -import org.apache.solr.common.cloud.ClusterState; import org.apache.solr.common.cloud.ReplicaCount; import org.apache.solr.common.cloud.ReplicaPosition; import org.apache.solr.common.util.SolrNamedThreadFactory; @@ -168,38 +167,44 @@ private void runRepair() { // collection / positions Map> newPositions = new HashMap<>(); try { - ClusterState clusterState = solrCloudManager.getClusterState(); - clusterState.forEachCollection( - coll -> { - // shard / number of replicas per type - Map lostReplicas = new HashMap<>(); - coll.forEachReplica( - (shard, replica) -> { - if (reallyLostNodes.contains(replica.getNodeName())) { - lostReplicas - .computeIfAbsent(shard, s -> ReplicaCount.empty()) - .increment(replica.type); - } - }); - Assign.AssignStrategy assignStrategy = Assign.createAssignStrategy(cc); - lostReplicas.forEach( - (shard, types) -> { - Assign.AssignRequest assignRequest = - new Assign.AssignRequestBuilder() - .forCollection(coll.getName()) - .forShard(Collections.singletonList(shard)) - .assignReplicas(types) - .build(); - try { - List positions = - assignStrategy.assign(solrCloudManager, assignRequest); - newPositions.put(coll.getName(), positions); - } catch (Exception e) { - log.warn( - "Exception computing positions for {}/{}: {}", coll.getName(), shard, e); - } - }); - }); + // shard / number of replicas per type + solrCloudManager + .getClusterState() + .collectionStream() + .forEach( + coll -> { + // shard / number of replicas per type + Map lostReplicas = new HashMap<>(); + coll.forEachReplica( + (shard, replica) -> { + if (reallyLostNodes.contains(replica.getNodeName())) { + lostReplicas + .computeIfAbsent(shard, s -> ReplicaCount.empty()) + .increment(replica.type); + } + }); + Assign.AssignStrategy assignStrategy = Assign.createAssignStrategy(cc); + lostReplicas.forEach( + (shard, types) -> { + Assign.AssignRequest assignRequest = + new Assign.AssignRequestBuilder() + .forCollection(coll.getName()) + .forShard(Collections.singletonList(shard)) + .assignReplicas(types) + .build(); + try { + List positions = + assignStrategy.assign(solrCloudManager, assignRequest); + newPositions.put(coll.getName(), positions); + } catch (Exception e) { + log.warn( + "Exception computing positions for {}/{}: {}", + coll.getName(), + shard, + e); + } + }); + }); } catch (IOException e) { log.warn("Exception getting cluster state", e); return; diff --git a/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java b/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java index 200e7b68974..0b79aa1c336 100644 --- a/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java @@ -367,7 +367,8 @@ public void testFailure() throws Exception { // verify that the target and checkpoint collections don't exist cloudManager .getClusterState() - .forEachCollection( + .collectionStream() + .forEach( coll -> { assertFalse( coll.getName() + " still exists", diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java index 186788c8914..eb2e377c3ad 100644 --- a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java +++ b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java @@ -78,18 +78,21 @@ protected void readReplicaDetails() throws IOException { if (clusterState == null) { // zkStateReader still initializing return; } - clusterState.forEachCollection( - coll -> - coll.forEachReplica( - (shard, replica) -> { - Map>> nodeData = - nodeVsCollectionVsShardVsReplicaInfo.computeIfAbsent( - replica.getNodeName(), k -> new HashMap<>()); - Map> collData = - nodeData.computeIfAbsent(coll.getName(), k -> new HashMap<>()); - List replicas = collData.computeIfAbsent(shard, k -> new ArrayList<>()); - replicas.add((Replica) replica.clone()); - })); + clusterState + .collectionStream() + .forEach( + coll -> + coll.forEachReplica( + (shard, replica) -> { + Map>> nodeData = + nodeVsCollectionVsShardVsReplicaInfo.computeIfAbsent( + replica.getNodeName(), k -> new HashMap<>()); + Map> collData = + nodeData.computeIfAbsent(coll.getName(), k -> new HashMap<>()); + List replicas = + collData.computeIfAbsent(shard, k -> new ArrayList<>()); + replicas.add((Replica) replica.clone()); + })); } @Override diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/common/LazySolrCluster.java b/solr/solrj-zookeeper/src/java/org/apache/solr/common/LazySolrCluster.java index 811a0b4e2e8..9b09d063ab2 100644 --- a/solr/solrj-zookeeper/src/java/org/apache/solr/common/LazySolrCluster.java +++ b/solr/solrj-zookeeper/src/java/org/apache/solr/common/LazySolrCluster.java @@ -170,8 +170,8 @@ public SolrCollection get(String key) { public void forEachEntry(BiConsumer fun) { zkStateReader .getClusterState() - .forEachCollection( - coll -> fun.accept(coll.getName(), _collection(coll.getName(), coll))); + .collectionStream() + .forEach(coll -> fun.accept(coll.getName(), _collection(coll.getName(), coll))); } @Override diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java index ce607ac8637..6219625dbd5 100644 --- a/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java +++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java @@ -425,7 +425,10 @@ public Stream collectionStream() { /** * Calls {@code consumer} with a resolved {@link DocCollection}s for all collections. Use this * sparingly in case there are many collections. + * + * @deprecated see {@link #collectionStream()} */ + @Deprecated public void forEachCollection(Consumer consumer) { collectionStream().forEach(consumer); }