You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by is...@apache.org on 2022/01/03 08:08:35 UTC
[solr] 14/28: supportedroles and overseer:disallowed supported
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 ff26ae58f413155470c85e6a87d31d6d1dddad0a
Author: Noble Paul <no...@gmail.com>
AuthorDate: Sat Dec 11 11:20:54 2021 +1100
supportedroles and overseer:disallowed supported
---
.../java/org/apache/solr/cloud/ZkController.java | 14 +++++++----
.../src/java/org/apache/solr/core/NodeRoles.java | 8 ++++++-
.../java/org/apache/solr/handler/ClusterAPI.java | 27 +++++++++++-----------
.../test/org/apache/solr/cloud/NodeRolesTest.java | 8 ++++++-
4 files changed, 37 insertions(+), 20 deletions(-)
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 5e71098..33ea43d 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -352,7 +352,9 @@ public class ZkController implements Closeable {
overseerElector.setup(context);
- overseerElector.joinElection(context, true);
+ if(cc.nodeRoles.isOverseerAllowed()) {
+ overseerElector.joinElection(context, true);
+ }
}
cc.cancelCoreRecoveries();
@@ -683,7 +685,9 @@ public class ZkController implements Closeable {
} finally {
// just in case the OverseerElectionContext managed to start another Overseer
- IOUtils.closeQuietly(overseer);
+ if(overseer != null) {
+ IOUtils.closeQuietly(overseer);
+ }
ExecutorUtil.shutdownAndAwaitTermination(customThreadPool);
}
@@ -909,14 +913,16 @@ public class ZkController implements Closeable {
registerLiveNodesListener();
// start the overseer first as following code may need it's processing
- if (!zkRunOnly) {
+ if (!zkRunOnly && cc.nodeRoles.isOverseerAllowed()) {
overseerElector = new LeaderElector(zkClient);
this.overseer = new Overseer((HttpShardHandler) cc.getShardHandlerFactory().getShardHandler(), cc.getUpdateShardHandler(),
CommonParams.CORES_HANDLER_PATH, zkStateReader, this, cloudConfig);
ElectionContext context = new OverseerElectionContext(zkClient,
overseer, getNodeName());
overseerElector.setup(context);
- overseerElector.joinElection(context, false);
+ if(cc.nodeRoles.isOverseerAllowed()) {
+ overseerElector.joinElection(context, false);
+ }
}
Stat stat = zkClient.exists(ZkStateReader.LIVE_NODES_ZKNODE, null, true);
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 b72e5ec..4bb04e0 100644
--- a/solr/core/src/java/org/apache/solr/core/NodeRoles.java
+++ b/solr/core/src/java/org/apache/solr/core/NodeRoles.java
@@ -35,6 +35,7 @@ public class NodeRoles implements MapWriter {
public static final String ALLOWED = "allowed";
public static final String DISALLOWED = "disallowed";
public static final String PREFERRED = "preferred";
+ public static final Set<String> OVERSEER_MODES = Set.of(ALLOWED, PREFERRED, DISALLOWED);
public static final String DEFAULT_ROLES_STRING = "data:on,overseer:allowed";
@@ -77,12 +78,17 @@ public class NodeRoles implements MapWriter {
nodeRoles.forEach((role, s) -> ew.putNoEx(role.roleName, s));
}
+ public boolean isOverseerAllowed() {
+ String roleMode = nodeRoles.get(Role.OVERSEER);
+ return ALLOWED.equals(roleMode) || PREFERRED.equals(roleMode);
+ }
+
public enum Role {
DATA("data"),
OVERSEER("overseer") {
@Override
public Set<String> supportedModes() {
- return Set.of(ALLOWED, PREFERRED, DISALLOWED);
+ return OVERSEER_MODES;
}
@Override
public String defaultIfAbsent() {
diff --git a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
index 796ac49..446cd9b 100644
--- a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
@@ -84,41 +84,32 @@ public class ClusterAPI {
@EndPoint(method = GET,
path = "/cluster/node-roles",
permission = COLL_READ_PERM)
- @SuppressWarnings("unchecked")
// nocommit: it must also output all data nodes that didn't start with -Dsolr.node.roles
public void roles(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
Map<String, Object> result = new LinkedHashMap<>();
- rsp.add("node-roles", readRecursive(ZkStateReader.NODE_ROLES, collectionsHandler.getCoreContainer().getZkController().getSolrCloudManager().getDistribStateManager(), 3));
+ rsp.add("node-roles", readRecursive(ZkStateReader.NODE_ROLES,
+ collectionsHandler.getCoreContainer().getZkController().getSolrCloudManager().getDistribStateManager(), 3));
}
Object readRecursive(String path, DistribStateManager zk, int depth) {
if (depth == 0) return null;
Map<String, Object> result = null;
- boolean hasSubValues = false;
try {
List<String> children = zk.listData(path);
if (children != null && !children.isEmpty()) {
result = new HashMap<>();
} else {
- return depth >=1 ? Collections.emptyList(): null;
+ return depth >= 1 ? Collections.emptyList() : null;
}
for (String child : children) {
Object c = readRecursive(path + "/" + child, zk, depth - 1);
- if (c != null) {
- hasSubValues = true;
- }
+
result.put(child, c);
}
-
} catch (Exception e) {
- }
-
-
-
- if (result == null) {
- return null;
+ throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
}
if (depth == 1) {
return result.keySet();
@@ -138,6 +129,14 @@ public class ClusterAPI {
collectionsHandler.getCoreContainer().getZkController().getSolrCloudManager().getDistribStateManager(), 2));
}
@EndPoint(method = GET,
+ path = "/cluster/node-roles/supported",
+ permission = COLL_READ_PERM)
+ public void supportedRoles(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
+ rsp.add("supported-roles",
+ collectionsHandler.getCoreContainer().getZkController().getSolrCloudManager().getDistribStateManager().listData(ZkStateReader.NODE_ROLES));
+ }
+
+ @EndPoint(method = GET,
path = "/cluster/node-roles/{role}/{role-val}",
permission = COLL_READ_PERM)
public void nodesWithRoleVal(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
diff --git a/solr/core/src/test/org/apache/solr/cloud/NodeRolesTest.java b/solr/core/src/test/org/apache/solr/cloud/NodeRolesTest.java
index a2e3651..cda83ad 100644
--- a/solr/core/src/test/org/apache/solr/cloud/NodeRolesTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/NodeRolesTest.java
@@ -21,6 +21,7 @@ import java.lang.invoke.MethodHandles;
import java.util.Collection;
import java.util.Collections;
+import java.util.List;
import org.apache.solr.client.solrj.embedded.JettySolrRunner;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.client.solrj.request.V2Request;
@@ -50,9 +51,14 @@ public class NodeRolesTest extends SolrCloudTestCase {
public void testRoleIntegration() throws Exception {
JettySolrRunner j0 = cluster.getJettySolrRunner(0);
JettySolrRunner j1 = null, j2 = null;
+ V2Response rsp = new V2Request.Builder("/cluster/node-roles/supported").GET().build().process(cluster.getSolrClient());
+ List<String> l = (List<String>) rsp._get("supported-roles", Collections.emptyList());
+ assertTrue(l.contains("data"));
+ assertTrue(l.contains("overseer"));
+
j1 = startNodeWithRoles("overseer:preferred,data:off");
- V2Response rsp = new V2Request.Builder("/cluster/node-roles").GET().build().process(cluster.getSolrClient());
+ rsp = new V2Request.Builder("/cluster/node-roles").GET().build().process(cluster.getSolrClient());
assertEquals(j1.getNodeName(), rsp._getStr("node-roles/overseer/preferred[0]", null));
assertEquals(j1.getNodeName(), rsp._getStr("node-roles/data/off[0]", null));
OverseerRolesTest.waitForNewOverseer(20, j1.getNodeName(), false);