This is an automated email from the ASF dual-hosted git repository. ishan pushed a commit to branch jira/SOLR15694 in repository https://gitbox.apache.org/repos/asf/solr.git
commit 984edbf8959a08392651c49aed302ffdec5338b3 Author: Noble Paul <[email protected]> AuthorDate: Wed Dec 22 23:19:52 2021 +1100 addressed review comments --- .../apache/solr/cloud/api/collections/Assign.java | 30 ++++++++-------------- .../src/java/org/apache/solr/cluster/Cluster.java | 1 + .../placement/impl/PlacementRequestImpl.java | 2 +- .../impl/SimpleClusterAbstractionsImpl.java | 15 ++++++++++- .../src/java/org/apache/solr/core/NodeRoles.java | 17 +++++------- .../placement/ClusterAbstractionsForTest.java | 5 ++++ 6 files changed, 39 insertions(+), 31 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java index 7dfcc33..6111b3c 100644 --- a/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java +++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java @@ -21,18 +21,7 @@ import static org.apache.solr.common.cloud.ZkStateReader.CORE_NAME_PROP; import java.io.IOException; import java.lang.invoke.MethodHandles; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.Random; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import org.apache.solr.client.solrj.cloud.DistribStateManager; @@ -246,22 +235,25 @@ public class Assign { Collections.shuffle(nodeList, random); } } else { - nodeList = new ArrayList<>(liveNodes); - filterNonDataNodes(zk, nodeList); + nodeList = new ArrayList<>(filterNonDataNodes(zk, liveNodes)); Collections.shuffle(nodeList, random); } return nodeList; } - public static void filterNonDataNodes(DistribStateManager zk, List<String> liveNodes) { + public static Collection<String> filterNonDataNodes(DistribStateManager zk, Collection<String> liveNodes) { try { List<String> noData = ClusterAPI.getNodesByRole(NodeRoles.Role.DATA, NodeRoles.Mode.OFF, zk); - if (!noData.isEmpty()) { - liveNodes.removeAll(noData); - } + if (noData.isEmpty()) { + return liveNodes; + } else { + liveNodes = new HashSet<>(liveNodes); + liveNodes.removeAll(noData); + return liveNodes; + } } catch (Exception e) { - throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Problem fetching roles from Zookeeper", e); + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error fetching roles from Zookeeper", e); } } diff --git a/solr/core/src/java/org/apache/solr/cluster/Cluster.java b/solr/core/src/java/org/apache/solr/cluster/Cluster.java index 3b7bdd4..4cd32a4 100644 --- a/solr/core/src/java/org/apache/solr/cluster/Cluster.java +++ b/solr/core/src/java/org/apache/solr/cluster/Cluster.java @@ -31,6 +31,7 @@ public interface Cluster { */ Set<Node> getLiveNodes(); + Set<Node> getLiveNodes(boolean filterNonDataNodes) ; /** * Returns info about the given collection if one exists. * diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/PlacementRequestImpl.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/PlacementRequestImpl.java index ff3f090..3814eb6 100644 --- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/PlacementRequestImpl.java +++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/PlacementRequestImpl.java @@ -86,7 +86,7 @@ public class PlacementRequestImpl implements PlacementRequest { throw new Assign.AssignmentException("Bad assign request: empty list of nodes for collection " + solrCollection.getName()); } } else { - nodes = cluster.getLiveNodes(); + nodes = cluster.getLiveNodes(true); if (nodes.isEmpty()) { throw new Assign.AssignmentException("Impossible assign request: no live nodes for collection " + solrCollection.getName()); } diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/SimpleClusterAbstractionsImpl.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/SimpleClusterAbstractionsImpl.java index 48f3f50..64c0b64 100644 --- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/SimpleClusterAbstractionsImpl.java +++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/SimpleClusterAbstractionsImpl.java @@ -23,6 +23,7 @@ import java.util.stream.Collectors; import com.google.common.collect.Maps; import org.apache.solr.client.solrj.cloud.SolrCloudManager; +import org.apache.solr.cloud.api.collections.Assign; import org.apache.solr.cluster.*; import org.apache.solr.common.cloud.ClusterState; import org.apache.solr.common.cloud.DocCollection; @@ -53,10 +54,16 @@ class SimpleClusterAbstractionsImpl { static class ClusterImpl implements Cluster { private final Set<Node> liveNodes; + private final Set<Node> liveNodesWithData; private final ClusterState clusterState; ClusterImpl(SolrCloudManager solrCloudManager) throws IOException { - liveNodes = NodeImpl.getNodes(solrCloudManager.getClusterStateProvider().getLiveNodes()); + Set<String> liveNodes = solrCloudManager.getClusterStateProvider().getLiveNodes(); + Collection<String> liveNodesWithData = Assign.filterNonDataNodes( solrCloudManager.getDistribStateManager(), liveNodes); + this.liveNodes = NodeImpl.getNodes(liveNodes); + this.liveNodesWithData = liveNodesWithData.size() == liveNodes.size() ? + this.liveNodes : + NodeImpl.getNodes(liveNodesWithData); clusterState = solrCloudManager.getClusterStateProvider().getClusterState(); } @@ -65,6 +72,12 @@ class SimpleClusterAbstractionsImpl { return liveNodes; } + public Set<Node> getLiveNodes(boolean filterNonDataNodes) { + return filterNonDataNodes ? + liveNodesWithData : + liveNodes; + } + @Override public SolrCollection getCollection(String collectionName) { return SolrCollectionImpl.createCollectionFacade(clusterState, collectionName); diff --git a/solr/core/src/java/org/apache/solr/core/NodeRoles.java b/solr/core/src/java/org/apache/solr/core/NodeRoles.java index 714d8b1..317f771 100644 --- a/solr/core/src/java/org/apache/solr/core/NodeRoles.java +++ b/solr/core/src/java/org/apache/solr/core/NodeRoles.java @@ -18,7 +18,6 @@ package org.apache.solr.core; import java.lang.invoke.MethodHandles; import java.util.*; -import org.apache.solr.common.MapWriter; import org.apache.solr.common.SolrException; import org.apache.solr.common.StringUtils; import org.apache.solr.common.cloud.ZkStateReader; @@ -61,7 +60,7 @@ public class NodeRoles { } for(Role r: Role.values()) { if (!roles.containsKey(r)) { - roles.put(r, r.defaultIfAbsent()); + roles.put(r, r.defaultMode()); } } nodeRoles = Collections.unmodifiableMap(roles); @@ -100,7 +99,7 @@ public class NodeRoles { return Set.of(Mode.ON, Mode.OFF); } @Override - public Mode defaultIfAbsent() { + public Mode defaultMode() { return Mode.OFF; } }, @@ -110,7 +109,7 @@ public class NodeRoles { return Set.of(Mode.ALLOWED, Mode.PREFERRED, Mode.DISALLOWED); } @Override - public Mode defaultIfAbsent() { + public Mode defaultMode() { return Mode.DISALLOWED; } }; @@ -122,12 +121,10 @@ public class NodeRoles { } public static Role getRole(String value) { - try { - Role role = Role.valueOf(value.toUpperCase(Locale.ROOT)); - return role; - } catch (IllegalArgumentException ex) { - throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown role: " + value); + for (Role role: Role.values()) { + if (value.equals(role.roleName)) return role; } + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown role: " + value); } public abstract Set<Mode> supportedModes(); @@ -135,7 +132,7 @@ public class NodeRoles { /** * Default mode for a role in nodes where this role is not specified. */ - public abstract Mode defaultIfAbsent(); + public abstract Mode defaultMode(); @Override public String toString() { diff --git a/solr/core/src/test/org/apache/solr/cluster/placement/ClusterAbstractionsForTest.java b/solr/core/src/test/org/apache/solr/cluster/placement/ClusterAbstractionsForTest.java index 1260a10..bb85bd3 100644 --- a/solr/core/src/test/org/apache/solr/cluster/placement/ClusterAbstractionsForTest.java +++ b/solr/core/src/test/org/apache/solr/cluster/placement/ClusterAbstractionsForTest.java @@ -43,6 +43,11 @@ class ClusterAbstractionsForTest { } @Override + public Set<Node> getLiveNodes(boolean filterNonDataNodes) { + return liveNodes; + } + + @Override public SolrCollection getCollection(String collectionName) { return collections.get(collectionName); }
