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)

Reply via email to