You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2018/09/04 16:16:39 UTC
lucene-solr:master: SOLR-12723: Reduce object creation in
HashBasedRouter.
Repository: lucene-solr
Updated Branches:
refs/heads/master d997e8b4a -> e0eb7bac0
SOLR-12723: Reduce object creation in HashBasedRouter.
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/e0eb7bac
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/e0eb7bac
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/e0eb7bac
Branch: refs/heads/master
Commit: e0eb7bac02a7e6d434bb159430c3fadfcfe3a564
Parents: d997e8b
Author: Andrzej Bialecki <ab...@apache.org>
Authored: Tue Sep 4 18:16:00 2018 +0200
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Tue Sep 4 18:16:00 2018 +0200
----------------------------------------------------------------------
solr/CHANGES.txt | 2 ++
.../stream/AnalyticsShardRequestManager.java | 2 +-
.../handler/admin/MetricsHistoryHandler.java | 8 ++---
.../apache/solr/schema/ManagedIndexSchema.java | 4 +--
.../search/join/ScoreJoinQParserPlugin.java | 2 +-
.../org/apache/solr/servlet/HttpSolrCall.java | 35 +++++++++++---------
.../processor/DistributedUpdateProcessor.java | 6 ++--
.../DocExpirationUpdateProcessorFactory.java | 9 +++--
.../TimeRoutedAliasUpdateProcessor.java | 7 ++--
.../solr/client/solrj/impl/CloudSolrClient.java | 8 ++---
.../solr/client/solrj/io/sql/StatementImpl.java | 2 +-
.../client/solrj/io/stream/CloudSolrStream.java | 10 +++---
.../io/stream/FeaturesSelectionStream.java | 2 +-
.../client/solrj/io/stream/TextLogitStream.java | 2 +-
.../client/solrj/io/stream/TopicStream.java | 6 ++--
.../client/solrj/io/stream/TupleStream.java | 2 +-
.../solr/common/cloud/ClusterStateUtil.java | 4 +--
.../solr/common/cloud/CompositeIdRouter.java | 2 +-
.../apache/solr/common/cloud/DocCollection.java | 9 +++++
.../solr/common/cloud/HashBasedRouter.java | 3 +-
20 files changed, 70 insertions(+), 55 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index d8ca50b..c6e89b1 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -337,6 +337,8 @@ Optimizations
maxConnectionsPerHost as 100k (20 previously). They are now consisent with the UpdateShardHandler defaults.
(Varun Thacker)
+* SOLR-12723: Reduce object creation in HashBasedRouter. (ab)
+
Other Changes
----------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/contrib/analytics/src/java/org/apache/solr/analytics/stream/AnalyticsShardRequestManager.java
----------------------------------------------------------------------
diff --git a/solr/contrib/analytics/src/java/org/apache/solr/analytics/stream/AnalyticsShardRequestManager.java b/solr/contrib/analytics/src/java/org/apache/solr/analytics/stream/AnalyticsShardRequestManager.java
index 7a53500..2ad6003 100644
--- a/solr/contrib/analytics/src/java/org/apache/solr/analytics/stream/AnalyticsShardRequestManager.java
+++ b/solr/contrib/analytics/src/java/org/apache/solr/analytics/stream/AnalyticsShardRequestManager.java
@@ -107,7 +107,7 @@ public class AnalyticsShardRequestManager {
ClusterState clusterState = zkStateReader.getClusterState();
Set<String> liveNodes = clusterState.getLiveNodes();
- Collection<Slice> slices = clusterState.getCollection(collection).getActiveSlices();
+ Slice[] slices = clusterState.getCollection(collection).getActiveSlicesArr();
for(Slice slice : slices) {
Collection<Replica> replicas = slice.getReplicas();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java
index 9a46d04..1c74dba 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHistoryHandler.java
@@ -528,16 +528,16 @@ public class MetricsHistoryHandler extends RequestHandlerBase implements Permiss
Map<String, Number> perReg = totals
.computeIfAbsent(Group.collection, g -> new HashMap<>())
.computeIfAbsent(registry, r -> new HashMap<>());
- Collection<Slice> slices = coll.getActiveSlices();
- perReg.put(NUM_SHARDS_KEY, slices.size());
+ Slice[] slices = coll.getActiveSlicesArr();
+ perReg.put(NUM_SHARDS_KEY, slices.length);
DoubleAdder numActiveReplicas = new DoubleAdder();
- slices.forEach(s -> {
+ for (Slice s : slices) {
s.forEach(r -> {
if (r.isActive(state.getLiveNodes())) {
numActiveReplicas.add(1.0);
}
});
- });
+ }
perReg.put(NUM_REPLICAS_KEY, numActiveReplicas);
});
} catch (IOException e) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
index 04b2606..0314ad9 100644
--- a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
+++ b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
@@ -289,8 +289,8 @@ public final class ManagedIndexSchema extends IndexSchema {
ClusterState clusterState = zkStateReader.getClusterState();
Set<String> liveNodes = clusterState.getLiveNodes();
final DocCollection docCollection = clusterState.getCollectionOrNull(collection);
- if (docCollection != null && docCollection.getActiveSlices() != null && docCollection.getActiveSlices().size() > 0) {
- final Collection<Slice> activeSlices = docCollection.getActiveSlices();
+ if (docCollection != null && docCollection.getActiveSlicesArr().length > 0) {
+ final Slice[] activeSlices = docCollection.getActiveSlicesArr();
for (Slice next : activeSlices) {
Map<String, Replica> replicasMap = next.getReplicasMap();
if (replicasMap != null) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java
index 946125f..55d58fc 100644
--- a/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java
@@ -302,7 +302,7 @@ public class ScoreJoinQParserPlugin extends QParserPlugin {
String fromReplica = null;
String nodeName = zkController.getNodeName();
- for (Slice slice : zkController.getClusterState().getCollection(fromIndex).getActiveSlices()) {
+ for (Slice slice : zkController.getClusterState().getCollection(fromIndex).getActiveSlicesArr()) {
if (fromReplica != null)
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
"SolrCloud join: multiple shards not yet supported " + fromIndex);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
index b297a44..4a3c34f 100644
--- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
+++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
@@ -862,9 +862,9 @@ public class HttpSolrCall {
Collection<Slice> slices, boolean activeSlices) {
if (activeSlices) {
for (Map.Entry<String, DocCollection> entry : clusterState.getCollectionsMap().entrySet()) {
- final Collection<Slice> activeCollectionSlices = entry.getValue().getActiveSlices();
- if (activeCollectionSlices != null) {
- slices.addAll(activeCollectionSlices);
+ final Slice[] activeCollectionSlices = entry.getValue().getActiveSlicesArr();
+ for (Slice s : activeCollectionSlices) {
+ slices.add(s);
}
}
} else {
@@ -880,45 +880,48 @@ public class HttpSolrCall {
private String getRemotCoreUrl(String collectionName, String origCorename) {
ClusterState clusterState = cores.getZkController().getClusterState();
final DocCollection docCollection = clusterState.getCollectionOrNull(collectionName);
- Collection<Slice> slices = (docCollection != null) ? docCollection.getActiveSlices() : null;
+ Slice[] slices = (docCollection != null) ? docCollection.getActiveSlicesArr() : null;
+ List<Slice> activeSlices = new ArrayList<>();
boolean byCoreName = false;
if (slices == null) {
- slices = new ArrayList<>();
+ activeSlices = new ArrayList<>();
// look by core name
byCoreName = true;
- getSlicesForCollections(clusterState, slices, true);
- if (slices.isEmpty()) {
- getSlicesForCollections(clusterState, slices, false);
+ getSlicesForCollections(clusterState, activeSlices, true);
+ if (activeSlices.isEmpty()) {
+ getSlicesForCollections(clusterState, activeSlices, false);
+ }
+ } else {
+ for (Slice s : slices) {
+ activeSlices.add(s);
}
}
- if (slices.isEmpty()) {
+ if (activeSlices.isEmpty()) {
return null;
}
collectionsList.add(collectionName);
String coreUrl = getCoreUrl(collectionName, origCorename, clusterState,
- slices, byCoreName, true);
+ activeSlices, byCoreName, true);
if (coreUrl == null) {
coreUrl = getCoreUrl(collectionName, origCorename, clusterState,
- slices, byCoreName, false);
+ activeSlices, byCoreName, false);
}
return coreUrl;
}
private String getCoreUrl(String collectionName,
- String origCorename, ClusterState clusterState, Collection<Slice> slices,
+ String origCorename, ClusterState clusterState, List<Slice> slices,
boolean byCoreName, boolean activeReplicas) {
String coreUrl;
Set<String> liveNodes = clusterState.getLiveNodes();
- List<Slice> randomizedSlices = new ArrayList<>(slices.size());
- randomizedSlices.addAll(slices);
- Collections.shuffle(randomizedSlices, random);
+ Collections.shuffle(slices, random);
- for (Slice slice : randomizedSlices) {
+ for (Slice slice : slices) {
List<Replica> randomizedReplicas = new ArrayList<>();
randomizedReplicas.addAll(slice.getReplicas());
Collections.shuffle(randomizedReplicas, random);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
index e1e7968..247f593 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
@@ -481,9 +481,9 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
for (Entry<String, RoutingRule> entry : routingRules.entrySet()) {
String targetCollectionName = entry.getValue().getTargetCollectionName();
final DocCollection docCollection = cstate.getCollectionOrNull(targetCollectionName);
- if (docCollection != null && docCollection.getActiveSlices() != null && !docCollection.getActiveSlices().isEmpty()) {
- final Collection<Slice> activeSlices = docCollection.getActiveSlices();
- Slice any = activeSlices.iterator().next();
+ if (docCollection != null && docCollection.getActiveSlicesArr().length > 0) {
+ final Slice[] activeSlices = docCollection.getActiveSlicesArr();
+ Slice any = activeSlices[0];
if (nodes == null) nodes = new ArrayList<>();
nodes.add(new StdNode(new ZkCoreNodeProps(any.getLeader())));
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java
index 1f2fe1e..6eeb083 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java
@@ -20,6 +20,7 @@ import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.text.ParseException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@@ -32,6 +33,7 @@ import org.apache.solr.cloud.CloudDescriptor;
import org.apache.solr.cloud.ZkController;
import org.apache.solr.common.SolrException;
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.common.util.ExecutorUtil;
@@ -470,12 +472,13 @@ public final class DocExpirationUpdateProcessorFactory
CloudDescriptor desc = core.getCoreDescriptor().getCloudDescriptor();
String col = desc.getCollectionName();
- List<Slice> slices = new ArrayList<Slice>(zk.getClusterState().getCollection(col).getActiveSlices());
- Collections.sort(slices, COMPARE_SLICES_BY_NAME);
- if (slices.isEmpty()) {
+ DocCollection docCollection = zk.getClusterState().getCollection(col);
+ if (docCollection.getActiveSlicesArr().length == 0) {
log.error("Collection {} has no active Slices?", col);
return false;
}
+ List<Slice> slices = new ArrayList<>(Arrays.asList(docCollection.getActiveSlicesArr()));
+ Collections.sort(slices, COMPARE_SLICES_BY_NAME);
Replica firstSliceLeader = slices.get(0).getLeader();
if (null == firstSliceLeader) {
log.warn("Slice in charge of periodic deletes for {} does not currently have a leader",
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/core/src/java/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessor.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessor.java
index cd4ed00..d9d1da1 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessor.java
@@ -20,7 +20,6 @@ package org.apache.solr.update.processor;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.time.Instant;
-import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
@@ -386,11 +385,11 @@ public class TimeRoutedAliasUpdateProcessor extends UpdateRequestProcessor {
}
private SolrCmdDistributor.Node lookupShardLeaderOfCollection(String collection) {
- final Collection<Slice> activeSlices = zkController.getClusterState().getCollection(collection).getActiveSlices();
- if (activeSlices.isEmpty()) {
+ final Slice[] activeSlices = zkController.getClusterState().getCollection(collection).getActiveSlicesArr();
+ if (activeSlices.length == 0) {
throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, "Cannot route to collection " + collection);
}
- final Slice slice = activeSlices.iterator().next();
+ final Slice slice = activeSlices[0];
return getLeaderNode(collection, slice);
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
index 6fc216e..006d6bd 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
@@ -611,10 +611,8 @@ public class CloudSolrClient extends SolrClient {
private Map<String,List<String>> buildUrlMap(DocCollection col) {
Map<String, List<String>> urlMap = new HashMap<>();
- Collection<Slice> slices = col.getActiveSlices();
- Iterator<Slice> sliceIterator = slices.iterator();
- while (sliceIterator.hasNext()) {
- Slice slice = sliceIterator.next();
+ Slice[] slices = col.getActiveSlicesArr();
+ for (Slice slice : slices) {
String name = slice.getName();
List<String> urls = new ArrayList<>();
Replica leader = slice.getLeader();
@@ -1262,7 +1260,7 @@ public class CloudSolrClient extends SolrClient {
NamedList routes = ((CloudSolrClient.RouteResponse)resp).getRouteResponses();
DocCollection coll = getDocCollection(collection, null);
Map<String,String> leaders = new HashMap<String,String>();
- for (Slice slice : coll.getActiveSlices()) {
+ for (Slice slice : coll.getActiveSlicesArr()) {
Replica leader = slice.getLeader();
if (leader != null) {
ZkCoreNodeProps zkProps = new ZkCoreNodeProps(leader);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
index a2c06d4..5a94237 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/StatementImpl.java
@@ -78,7 +78,7 @@ class StatementImpl implements Statement {
protected SolrStream constructStream(String sql) throws IOException {
try {
ZkStateReader zkStateReader = this.connection.getClient().getZkStateReader();
- Collection<Slice> slices = CloudSolrStream.getSlices(this.connection.getCollection(), zkStateReader, true);
+ Slice[] slices = CloudSolrStream.getSlices(this.connection.getCollection(), zkStateReader, true);
List<Replica> shuffler = new ArrayList<>();
for(Slice slice : slices) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/CloudSolrStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/CloudSolrStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/CloudSolrStream.java
index 32cf15e..ddd9774 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/CloudSolrStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/CloudSolrStream.java
@@ -18,7 +18,7 @@ package org.apache.solr.client.solrj.io.stream;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collection;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -325,7 +325,7 @@ public class CloudSolrStream extends TupleStream implements Expressible {
}
}
- public static Collection<Slice> getSlices(String collectionName, ZkStateReader zkStateReader, boolean checkAlias) throws IOException {
+ public static Slice[] getSlices(String collectionName, ZkStateReader zkStateReader, boolean checkAlias) throws IOException {
ClusterState clusterState = zkStateReader.getClusterState();
Map<String, DocCollection> collectionsMap = clusterState.getCollectionsMap();
@@ -341,16 +341,16 @@ public class CloudSolrStream extends TupleStream implements Expressible {
List<Slice> slices = collections.stream()
.map(collectionsMap::get)
.filter(Objects::nonNull)
- .flatMap(docCol -> docCol.getActiveSlices().stream())
+ .flatMap(docCol -> Arrays.stream(docCol.getActiveSlicesArr()))
.collect(Collectors.toList());
if (!slices.isEmpty()) {
- return slices;
+ return slices.toArray(new Slice[slices.size()]);
}
// Check collection case insensitive
for(String collectionMapKey : collectionsMap.keySet()) {
if(collectionMapKey.equalsIgnoreCase(collectionName)) {
- return collectionsMap.get(collectionMapKey).getActiveSlices();
+ return collectionsMap.get(collectionMapKey).getActiveSlicesArr();
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FeaturesSelectionStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FeaturesSelectionStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FeaturesSelectionStream.java
index b6ad276..3212dc6 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FeaturesSelectionStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FeaturesSelectionStream.java
@@ -259,7 +259,7 @@ public class FeaturesSelectionStream extends TupleStream implements Expressible{
try {
ZkStateReader zkStateReader = cloudSolrClient.getZkStateReader();
- Collection<Slice> slices = CloudSolrStream.getSlices(this.collection, zkStateReader, false);
+ Slice[] slices = CloudSolrStream.getSlices(this.collection, zkStateReader, false);
ClusterState clusterState = zkStateReader.getClusterState();
Set<String> liveNodes = clusterState.getLiveNodes();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TextLogitStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TextLogitStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TextLogitStream.java
index f56431c..dd9be6a 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TextLogitStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TextLogitStream.java
@@ -341,7 +341,7 @@ public class TextLogitStream extends TupleStream implements Expressible {
try {
ZkStateReader zkStateReader = cloudSolrClient.getZkStateReader();
- Collection<Slice> slices = CloudSolrStream.getSlices(this.collection, zkStateReader, false);
+ Slice[] slices = CloudSolrStream.getSlices(this.collection, zkStateReader, false);
ClusterState clusterState = zkStateReader.getClusterState();
Set<String> liveNodes = clusterState.getLiveNodes();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TopicStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TopicStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TopicStream.java
index e076186..9af4cbf 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TopicStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TopicStream.java
@@ -395,7 +395,7 @@ public class TopicStream extends CloudSolrStream implements Expressible {
this.checkpoints = new HashMap<>();
ZkStateReader zkStateReader = cloudSolrClient.getZkStateReader();
- Collection<Slice> slices = CloudSolrStream.getSlices(this.collection, zkStateReader, false);
+ Slice[] slices = CloudSolrStream.getSlices(this.collection, zkStateReader, false);
ClusterState clusterState = zkStateReader.getClusterState();
Set<String> liveNodes = clusterState.getLiveNodes();
@@ -474,7 +474,7 @@ public class TopicStream extends CloudSolrStream implements Expressible {
private void getPersistedCheckpoints() throws IOException {
ZkStateReader zkStateReader = cloudSolrClient.getZkStateReader();
- Collection<Slice> slices = CloudSolrStream.getSlices(checkpointCollection, zkStateReader, false);
+ Slice[] slices = CloudSolrStream.getSlices(checkpointCollection, zkStateReader, false);
ClusterState clusterState = zkStateReader.getClusterState();
Set<String> liveNodes = clusterState.getLiveNodes();
@@ -506,7 +506,7 @@ public class TopicStream extends CloudSolrStream implements Expressible {
protected void constructStreams() throws IOException {
try {
ZkStateReader zkStateReader = cloudSolrClient.getZkStateReader();
- Collection<Slice> slices = CloudSolrStream.getSlices(this.collection, zkStateReader, false);
+ Slice[] slices = CloudSolrStream.getSlices(this.collection, zkStateReader, false);
ModifiableSolrParams mParams = new ModifiableSolrParams(params);
mParams.set(DISTRIB, "false"); // We are the aggregator.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TupleStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TupleStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TupleStream.java
index 288608f..94dd920 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TupleStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/TupleStream.java
@@ -133,7 +133,7 @@ public abstract class TupleStream implements Closeable, Serializable, MapWriter
CloudSolrClient cloudSolrClient = streamContext.getSolrClientCache().getCloudSolrClient(zkHost);
ZkStateReader zkStateReader = cloudSolrClient.getZkStateReader();
ClusterState clusterState = zkStateReader.getClusterState();
- Collection<Slice> slices = CloudSolrStream.getSlices(collection, zkStateReader, true);
+ Slice[] slices = CloudSolrStream.getSlices(collection, zkStateReader, true);
Set<String> liveNodes = clusterState.getLiveNodes();
for(Slice slice : slices) {
Collection<Replica> replicas = slice.getReplicas();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java
index 0910868..5e61bc1 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java
@@ -217,8 +217,8 @@ public class ClusterStateUtil {
}
public static int getLiveAndActiveReplicaCount(ZkStateReader zkStateReader, String collection) {
- Collection<Slice> slices;
- slices = zkStateReader.getClusterState().getCollection(collection).getActiveSlices();
+ Slice[] slices;
+ slices = zkStateReader.getClusterState().getCollection(collection).getActiveSlicesArr();
int liveAndActive = 0;
for (Slice slice : slices) {
for (Replica replica : slice.getReplicas()) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java b/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
index a1cd02c..30778b8 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
@@ -90,7 +90,7 @@ public class CompositeIdRouter extends HashBasedRouter {
Range completeRange = new KeyParser(id).getRange();
List<Slice> targetSlices = new ArrayList<>(1);
- for (Slice slice : collection.getActiveSlices()) {
+ for (Slice slice : collection.getActiveSlicesArr()) {
Range range = slice.getRange();
if (range != null && range.overlaps(completeRange)) {
targetSlices.add(slice);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
----------------------------------------------------------------------
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 411fe56..ab250a6 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
@@ -58,6 +58,7 @@ public class DocCollection extends ZkNodeProps implements Iterable<Slice> {
private final String name;
private final Map<String, Slice> slices;
private final Map<String, Slice> activeSlices;
+ private final Slice[] activeSlicesArr;
private final Map<String, List<Replica>> nodeNameReplicas;
private final Map<String, List<Replica>> nodeNameLeaderReplicas;
private final DocRouter router;
@@ -112,6 +113,7 @@ public class DocCollection extends ZkNodeProps implements Iterable<Slice> {
addNodeNameReplica(replica);
}
}
+ this.activeSlicesArr = activeSlices.values().toArray(new Slice[activeSlices.size()]);
this.router = router;
this.znode = znode == null? ZkStateReader.CLUSTER_STATE : znode;
assert name != null && slices != null;
@@ -198,6 +200,13 @@ public class DocCollection extends ZkNodeProps implements Iterable<Slice> {
}
/**
+ * Return array of active slices for this collection (performance optimization).
+ */
+ public Slice[] getActiveSlicesArr() {
+ return activeSlicesArr;
+ }
+
+ /**
* Get the map of all slices (sliceName->Slice) for this collection.
*/
public Map<String, Slice> getSlicesMap() {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e0eb7bac/solr/solrj/src/java/org/apache/solr/common/cloud/HashBasedRouter.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/HashBasedRouter.java b/solr/solrj/src/java/org/apache/solr/common/cloud/HashBasedRouter.java
index 5e19d38..07f2d35 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/HashBasedRouter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/HashBasedRouter.java
@@ -59,7 +59,8 @@ public abstract class HashBasedRouter extends DocRouter {
}
protected Slice hashToSlice(int hash, DocCollection collection) {
- for (Slice slice : collection.getActiveSlices()) {
+ final Slice[] slices = collection.getActiveSlicesArr();
+ for (Slice slice : slices) {
Range range = slice.getRange();
if (range != null && range.includes(hash)) return slice;
}