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 072f65909e7fc1e9bde4500af537b1e54ff7c2aa Author: Ishan Chattopadhyaya <[email protected]> AuthorDate: Fri Dec 10 13:28:45 2021 +0530 Adding defaultIfAbsent, minor formatting fixes --- .../java/org/apache/solr/cloud/ZkController.java | 4 +- .../java/org/apache/solr/core/CoreContainer.java | 2 +- .../src/java/org/apache/solr/core/NodeRoles.java | 89 +++++++++++++--------- .../test/org/apache/solr/cloud/NodeRolesTest.java | 9 +-- 4 files changed, 56 insertions(+), 48 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 e7b15bf..5e71098 100644 --- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java +++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java @@ -852,7 +852,7 @@ public class ZkController implements Closeable { cmdExecutor.ensureExists(ZkStateReader.NODE_ROLES, zkClient); for (NodeRoles.Role role : NodeRoles.Role.values()) { cmdExecutor.ensureExists(ZkStateReader.NODE_ROLES + "/" + role.roleName, zkClient); - for (String v : role.supportedVals()) { + for (String v : role.supportedModes()) { cmdExecutor.ensureExists(ZkStateReader.NODE_ROLES + "/" + role.roleName + "/"+v, zkClient); } } @@ -1091,7 +1091,7 @@ public class ZkController implements Closeable { ops.add(Op.create(nodePath, null, zkClient.getZkACLProvider().getACLsToAdd(nodePath), CreateMode.EPHEMERAL)); // Create the roles node as well - cc.nodeRoles.ROLES.forEach((role, val) -> ops.add(Op.create(ZkStateReader.NODE_ROLES + "/" + role.roleName+ "/"+val +"/"+ nodeName, + cc.nodeRoles.getRoles().forEach((role, val) -> ops.add(Op.create(ZkStateReader.NODE_ROLES + "/" + role.roleName+ "/"+val +"/"+ nodeName, null, zkClient.getZkACLProvider().getACLsToAdd(nodePath), CreateMode.EPHEMERAL))); zkClient.multi(ops, true); diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java b/solr/core/src/java/org/apache/solr/core/CoreContainer.java index f7e9a1f..72a0df3 100644 --- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java +++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java @@ -947,7 +947,7 @@ public class CoreContainer { }); clusterSingletons.setReady(); - if (NodeRoles.PREFERRED.equals(nodeRoles.getRoleVal(NodeRoles.Role.OVERSEER))) { + if (NodeRoles.PREFERRED.equals(nodeRoles.getRoleMode(NodeRoles.Role.OVERSEER))) { try { log.info("This node is started as a preferred overseer"); zkSys.getZkController().setPreferredOverseer(); 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 fb3f011..b72e5ec 100644 --- a/solr/core/src/java/org/apache/solr/core/NodeRoles.java +++ b/solr/core/src/java/org/apache/solr/core/NodeRoles.java @@ -30,46 +30,65 @@ public class NodeRoles implements MapWriter { public static final String NODE_ROLES_PROP = "solr.node.roles"; - public Map<Role, String> ROLES ; + public static final String ON = "on"; + public static final String OFF = "off"; + public static final String ALLOWED = "allowed"; + public static final String DISALLOWED = "disallowed"; + public static final String PREFERRED = "preferred"; - public NodeRoles(String role) { - ROLES = new EnumMap<>(Role.class); - if (StringUtils.isEmpty(role)) { - role = DEFAULT_ROLE; + public static final String DEFAULT_ROLES_STRING = "data:on,overseer:allowed"; + + // Map of roles to mode that are applicable for this node. + private Map<Role, String> nodeRoles; + + public NodeRoles(String rolesString) { + Map<Role, String> roles = new EnumMap<>(Role.class); + if (StringUtils.isEmpty(rolesString)) { + rolesString = DEFAULT_ROLES_STRING; } - List<String> rolesList = StrUtils.splitSmart(role, ','); - for (String s : rolesList) { - List<String> roleVal = StrUtils.splitSmart(s,':'); - Role r = Role.getRole(roleVal.get(0)); - if(r.supportedVals().contains(roleVal.get(1))) { - ROLES.put(r, roleVal.get(1)); + List<String> rolesList = StrUtils.splitSmart(rolesString, ','); + for (String s: rolesList) { + List<String> roleMode = StrUtils.splitSmart(s,':'); + Role r = Role.getRole(roleMode.get(0)); + if (r.supportedModes().contains(roleMode.get(1))) { + roles.put(r, roleMode.get(1)); } else { - throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "UNKNOWN role value :"+roleVal.get(0)); + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown role mode: " + roleMode.get(0)); } } - ROLES = Collections.unmodifiableMap(ROLES); + for(Role r: Role.values()) { + if (!roles.containsKey(r)) { + roles.put(r, r.defaultIfAbsent()); + } + } + nodeRoles = Collections.unmodifiableMap(roles); } - public String getRoleVal(Role role) { - return ROLES.get(role); + public Map<Role, String> getRoles() { + return nodeRoles; } - + public String getRoleMode(Role role) { + return nodeRoles.get(role); + } @Override public void writeMap(EntryWriter ew) { - ROLES.forEach((role, s) -> ew.putNoEx(role.roleName, s)); + nodeRoles.forEach((role, s) -> ew.putNoEx(role.roleName, s)); } public enum Role { - DATA("data") , + DATA("data"), OVERSEER("overseer") { @Override - public Set<String> supportedVals() { - return OVERSEER_VALS; + public Set<String> supportedModes() { + return Set.of(ALLOWED, PREFERRED, DISALLOWED); + } + @Override + public String defaultIfAbsent() { + return DISALLOWED; } - }, - COORDINATOR("coordinator"); + }; public final String roleName; @@ -78,16 +97,21 @@ public class NodeRoles implements MapWriter { } public static Role getRole(String value) { - // Given a user string "overseer", convert to OVERSEER and return the enum value - for (Role role : Role.values()) { - if(value.equals(role.roleName)) return role; + for (Role role: Role.values()) { + if (value.equals(role.roleName)) return role; } - throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown role : "+value); + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown role: " + value); } - public Set<String> supportedVals() { - return ON_OFF; + public Set<String> supportedModes() { + return Set.of(ON, OFF); + } + /** + * Default mode for a role in nodes where this role is not specified. + */ + public String defaultIfAbsent() { + return OFF; } @Override @@ -95,13 +119,4 @@ public class NodeRoles implements MapWriter { return super.toString().toLowerCase(); } } - - public static final String ON = "on"; - public static final String OFF = "off"; - public static final Set<String> ON_OFF = Set.of(ON,OFF); - public static final String ALLOWED = "allowed"; - public static final String DISALLOWED = "disallowed"; - public static final String PREFERRED = "preferred"; - public static final Set<String> OVERSEER_VALS = Set.of(ALLOWED, DISALLOWED, PREFERRED); - public static final String DEFAULT_ROLE = "data:on,overseer:allowed"; } 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 18a16fe..a2e3651 100644 --- a/solr/core/src/test/org/apache/solr/cloud/NodeRolesTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/NodeRolesTest.java @@ -48,7 +48,6 @@ public class NodeRolesTest extends SolrCloudTestCase { @SuppressWarnings("unchecked") public void testRoleIntegration() throws Exception { - JettySolrRunner j0 = cluster.getJettySolrRunner(0); JettySolrRunner j1 = null, j2 = null; j1 = startNodeWithRoles("overseer:preferred,data:off"); @@ -58,19 +57,15 @@ public class NodeRolesTest extends SolrCloudTestCase { assertEquals(j1.getNodeName(), rsp._getStr("node-roles/data/off[0]", null)); OverseerRolesTest.waitForNewOverseer(20, j1.getNodeName(), false); - //start another node that is overseer but has data + // start another node that is overseer but has data j2 = startNodeWithRoles("overseer:preferred,data:on"); rsp = new V2Request.Builder("/cluster/node-roles").GET().build().process(cluster.getSolrClient()); - assertTrue( ((Collection)rsp._get("node-roles/overseer/preferred", Collections.emptyList())).contains(j2.getNodeName())); assertTrue( ((Collection)rsp._get("node-roles/data/on", Collections.emptyList())).contains(j2.getNodeName())); - - rsp = new V2Request.Builder("/cluster/node-roles/overseer").GET().build().process(cluster.getSolrClient()); - assertTrue( ((Collection)rsp._get("overseer/preferred", Collections.emptyList())).contains(j2.getNodeName())); assertTrue( ((Collection)rsp._get("overseer/preferred", Collections.emptyList())).contains(j1.getNodeName())); @@ -78,8 +73,6 @@ public class NodeRolesTest extends SolrCloudTestCase { assertTrue( ((Collection)rsp._get("overseer/preferred", Collections.emptyList())).contains(j2.getNodeName())); assertTrue( ((Collection)rsp._get("overseer/preferred", Collections.emptyList())).contains(j1.getNodeName())); - - String COLLECTION_NAME = "TEST_ROLES"; CollectionAdminRequest .createCollection(COLLECTION_NAME, "conf", 3, 1)
