You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2014/01/16 13:50:21 UTC

svn commit: r1558776 - in /lucene/dev/branches/branch_4x/solr: ./ core/ core/src/java/org/apache/solr/cloud/ core/src/java/org/apache/solr/handler/admin/ core/src/test/org/apache/solr/cloud/ solrj/ solrj/src/java/org/apache/solr/common/cloud/ solrj/src...

Author: noble
Date: Thu Jan 16 12:50:21 2014
New Revision: 1558776

URL: http://svn.apache.org/r1558776
Log:
SOLR-5476 Overseer Role for nodes

Added:
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
      - copied, changed from r1558760, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
Modified:
    lucene/dev/branches/branch_4x/solr/   (props changed)
    lucene/dev/branches/branch_4x/solr/CHANGES.txt
    lucene/dev/branches/branch_4x/solr/core/   (props changed)
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/ZkController.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
    lucene/dev/branches/branch_4x/solr/solrj/   (props changed)
    lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
    lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java
    lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java

Modified: lucene/dev/branches/branch_4x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/CHANGES.txt?rev=1558776&r1=1558775&r2=1558776&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/solr/CHANGES.txt Thu Jan 16 12:50:21 2014
@@ -118,6 +118,8 @@ New Features
 * SOLR-5631: Add support for Lucene's FreeTextSuggester.
   (Areek Zillur via Robert Muir)
 
+* SOLR-5476: Overseer Role for nodes (Noble Paul)
+
 Bug Fixes
 ----------------------
 

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java?rev=1558776&r1=1558775&r2=1558776&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java Thu Jan 16 12:50:21 2014
@@ -432,10 +432,10 @@ final class OverseerElectionContext exte
   
   private final SolrZkClient zkClient;
   private Overseer overseer;
-
+  public static final String PATH = "/overseer_elect";
 
   public OverseerElectionContext(SolrZkClient zkClient, Overseer overseer, final String zkNodeName) {
-    super(zkNodeName, "/overseer_elect", "/overseer_elect/leader", null, zkClient);
+    super(zkNodeName,PATH , PATH+"/leader", null, zkClient);
     this.overseer = overseer;
     this.zkClient = zkClient;
     try {
@@ -477,5 +477,5 @@ final class OverseerElectionContext exte
     // leader changed - close the overseer
     overseer.close();
   }
-  
+
 }

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java?rev=1558776&r1=1558775&r2=1558776&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java Thu Jan 16 12:50:21 2014
@@ -59,7 +59,8 @@ public  class LeaderElector {
   
   private final static Pattern LEADER_SEQ = Pattern.compile(".*?/?.*?-n_(\\d+)");
   private final static Pattern SESSION_ID = Pattern.compile(".*?/?(.*?-.*?)-n_\\d+");
-  
+  private final static Pattern  NODE_NAME = Pattern.compile(".*?/?(.*?-)(.*?)-n_\\d+");
+
   protected SolrZkClient zkClient;
   
   private ZkCmdExecutor zkCmdExecutor;
@@ -168,7 +169,7 @@ public  class LeaderElector {
    * 
    * @return sequence number
    */
-  private int getSeq(String nStringSequence) {
+  public static int getSeq(String nStringSequence) {
     int seq = 0;
     Matcher m = LEADER_SEQ.matcher(nStringSequence);
     if (m.matches()) {
@@ -191,6 +192,19 @@ public  class LeaderElector {
     }
     return id;
   }
+
+  public static String getNodeName(String nStringSequence){
+    String result;
+    Matcher m = NODE_NAME.matcher(nStringSequence);
+    if (m.matches()) {
+      result = m.group(2);
+    } else {
+      throw new IllegalStateException("Could not find regex match in:"
+          + nStringSequence);
+    }
+    return result;
+
+  }
   
   /**
    * Returns int list given list of form n_0000000001, n_0000000003, etc.
@@ -291,7 +305,7 @@ public  class LeaderElector {
   /**
    * Sort n string sequence list.
    */
-  private void sortSeqs(List<String> seqs) {
+  public static void sortSeqs(List<String> seqs) {
     Collections.sort(seqs, new Comparator<String>() {
       
       @Override
@@ -301,4 +315,8 @@ public  class LeaderElector {
       }
     });
   }
+  void retryElection() throws KeeperException, InterruptedException, IOException {
+    context.cancelElection();
+    joinElection(context, true);
+  }
 }

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java?rev=1558776&r1=1558775&r2=1558776&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java Thu Jan 16 12:50:21 2014
@@ -39,6 +39,7 @@ import org.apache.solr.common.cloud.Plai
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.RoutingRule;
 import org.apache.solr.common.cloud.Slice;
+import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -54,7 +55,9 @@ import org.apache.solr.handler.component
 import org.apache.solr.handler.component.ShardRequest;
 import org.apache.solr.handler.component.ShardResponse;
 import org.apache.solr.update.SolrIndexSplitter;
+import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -64,6 +67,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -73,6 +77,8 @@ import static org.apache.solr.cloud.Assi
 import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.REPLICA_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.SHARD_ID_PROP;
+import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDROLE;
+import static org.apache.solr.common.params.CollectionParams.CollectionAction.REMOVEROLE;
 
 
 public class OverseerCollectionProcessor implements Runnable, ClosableThread {
@@ -158,7 +164,14 @@ public class OverseerCollectionProcessor
          log.debug("am_i_leader unclear {}", isLeader);
          isLeader = amILeader();  // not a no, not a yes, try ask again
        }
-       while (!this.isClosed) {
+
+    try {
+      prioritizeOverseerNodes();
+    } catch (Exception e) {
+      log.error("Unable to prioritize overseer ", e);
+
+    }
+    while (!this.isClosed) {
          try {
            isLeader = amILeader();
            if (LeaderStatus.NO == isLeader) {
@@ -198,7 +211,96 @@ public class OverseerCollectionProcessor
   public void close() {
     isClosed = true;
   }
-  
+
+  private void prioritizeOverseerNodes() throws KeeperException, InterruptedException {
+    log.info("prioritizing overseer nodes");
+    SolrZkClient zk = zkStateReader.getZkClient();
+    if(!zk.exists(ZkStateReader.ROLES,true))return;
+    Map m = (Map) ZkStateReader.fromJSON(zk.getData(ZkStateReader.ROLES, null, new Stat(), true));
+
+    List overseerDesignates = (List) m.get("overseer");
+    if(overseerDesignates==null || overseerDesignates.isEmpty()) return;
+
+    log.debug("overseer designates {}", overseerDesignates);
+
+    List<String> children = zk.getChildren(OverseerElectionContext.PATH + LeaderElector.ELECTION_NODE, null, true);
+
+
+    if(children.size()<2) return;
+
+    LeaderElector.sortSeqs(children);
+    ArrayList<String> nodeNames = new ArrayList<String>(children.size());
+    for (String c : children) nodeNames.add(LeaderElector.getNodeName(c));
+    boolean overseerDesignateAvailable = false;
+    //ensure that the node right behind the leader , i.r at position 1 is a Overseer
+    String newOverseerDesignate = null;
+    log.debug("sorted nodes {}", nodeNames);
+    for (int i = 1; i < nodeNames.size(); i++) {
+      String s = nodeNames.get(i);
+      if (overseerDesignates.contains(s)) {
+        log.info(" found an overseer designate to be promoted to the front : {}, pushing others back", s);
+        overseerDesignateAvailable = true;
+        newOverseerDesignate = s;
+        for (int j = 1; j < i; j++) {
+          String nodeName = nodeNames.get(j);
+          log.debug("pushing back {} ", nodeName);
+          invokeRejoinOverseer(nodeName);
+        }
+        break;
+      }
+      if(overseerDesignateAvailable) break;
+    }
+
+    if(overseerDesignateAvailable){
+      //wait for a while to ensure the designate has indeed come in front
+      boolean prioritizationComplete = false;
+      long timeout = System.currentTimeMillis() + 5000;
+
+      for(;System.currentTimeMillis()< timeout ;){
+        children = zk.getChildren(OverseerElectionContext.PATH + LeaderElector.ELECTION_NODE, null, true);
+        LeaderElector.sortSeqs(children);
+
+        String frontRunner = LeaderElector.getNodeName(children.get(1));
+        log.debug("Frontrunner : {}", frontRunner);
+        if(newOverseerDesignate.equals(frontRunner)){
+          prioritizationComplete = true;
+          break;
+        }
+        Thread.sleep(50);
+      }
+
+      if(!prioritizationComplete) {
+        log.warn("Could not make the Overseer designate '{}' the frontrunner", newOverseerDesignate);
+      }
+
+    } else {
+      log.warn("No overseer designates are available");
+      return;
+    }
+
+
+
+    if(!overseerDesignates.contains( nodeNames.get(0)) && overseerDesignateAvailable){
+      //this means there are designated Overseer nodes and I am not one of them , kill myself
+      invokeRejoinOverseer(nodeNames.get(0));
+    }
+
+
+  }
+
+  private void invokeRejoinOverseer(String nodeName) {
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.set(CoreAdminParams.ACTION, CoreAdminAction.REJOINOVERSEERELECTION.toString());
+    params.set("qt", adminPath);
+    ShardRequest sreq = new ShardRequest();
+    sreq.purpose = 1;
+    String replica = nodeName.replaceFirst("_", "/");
+    sreq.shards = new String[]{replica};
+    sreq.actualShards = sreq.shards;
+    sreq.params = params;
+    shardHandler.submit(sreq, replica, sreq.params);
+  }
+
   protected LeaderStatus amILeader() {
     try {
       ZkNodeProps props = ZkNodeProps.load(zkStateReader.getZkClient().getData(
@@ -250,7 +352,11 @@ public class OverseerCollectionProcessor
         deleteReplica(zkStateReader.getClusterState(), message, results);
       } else if (MIGRATE.equals(operation)) {
         migrate(zkStateReader.getClusterState(), message, results);
-      } else {
+      } else if(REMOVEROLE.toString().toLowerCase().equals(operation) || ADDROLE.toString().toLowerCase().equals(operation) ){
+        processRoleCommand(message, operation);
+      }
+
+      else {
         throw new SolrException(ErrorCode.BAD_REQUEST, "Unknown operation:"
             + operation);
       }
@@ -267,6 +373,48 @@ public class OverseerCollectionProcessor
     
     return new OverseerSolrResponse(results);
   }
+  private void processRoleCommand(ZkNodeProps message, String operation) throws KeeperException, InterruptedException {
+    SolrZkClient zkClient = zkStateReader.getZkClient();
+    Map roles = null;
+    String node = message.getStr("node");
+
+    String roleName = message.getStr("role");
+    boolean nodeExists = false;
+    if(nodeExists = zkClient.exists(ZkStateReader.ROLES, true)){
+      roles = (Map) ZkStateReader.fromJSON(zkClient.getData(ZkStateReader.ROLES, null, new Stat(), true));
+    } else {
+      roles = new LinkedHashMap(1);
+    }
+
+    List nodeList= (List) roles.get(roleName);
+    if(nodeList == null) roles.put(roleName, nodeList = new ArrayList());
+    if(ADDROLE.toString().toLowerCase().equals(operation) ){
+      log.info("Overseer role added to {}", node);
+      if(!nodeList.contains(node)) nodeList.add(node);
+    } else if(REMOVEROLE.toString().toLowerCase().equals(operation)) {
+      log.info("Overseer role removed from {}", node);
+      nodeList.remove(node);
+    }
+
+    if(nodeExists){
+      zkClient.setData(ZkStateReader.ROLES, ZkStateReader.toJSON(roles),true);
+    } else {
+      zkClient.create(ZkStateReader.ROLES, ZkStateReader.toJSON(roles), CreateMode.PERSISTENT,true);
+    }
+    //if there are too many nodes this command may time out. And most likely dedicated
+    // overseers are created when there are too many nodes  . So , do this operation in a separate thread
+    new Thread(){
+      @Override
+      public void run() {
+        try {
+          prioritizeOverseerNodes();
+        } catch (Exception e) {
+          log.error("Error in prioritizing Overseer",e);
+        }
+
+      }
+    }.start();
+  }
 
   private void deleteReplica(ClusterState clusterState, ZkNodeProps message, NamedList results) throws KeeperException, InterruptedException {
     checkRequired(message, COLLECTION_PROP, SHARD_ID_PROP,REPLICA_PROP);

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/ZkController.java?rev=1558776&r1=1558775&r2=1558776&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/ZkController.java Thu Jan 16 12:50:21 2014
@@ -1602,4 +1602,14 @@ public final class ZkController {
     }
     return out;
   }
+
+  public void rejoinOverseerElection() {
+    try {
+      overseerElector.retryElection();
+    } catch (Exception e) {
+      throw new SolrException(ErrorCode.SERVER_ERROR, "Unable to rejoin election", e);
+    }
+
+  }
+
 }

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java?rev=1558776&r1=1558775&r2=1558776&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java Thu Jan 16 12:50:21 2014
@@ -17,6 +17,8 @@ package org.apache.solr.handler.admin;
  * limitations under the License.
  */
 
+import com.google.common.collect.ImmutableSet;
+import org.apache.commons.lang.StringUtils;
 import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.HttpSolrServer;
@@ -32,6 +34,7 @@ import org.apache.solr.common.cloud.Impl
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
+import org.apache.solr.common.params.CollectionParams;
 import org.apache.solr.common.params.CollectionParams.CollectionAction;
 import org.apache.solr.common.params.CoreAdminParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -51,6 +54,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 
 import static org.apache.solr.cloud.Overseer.QUEUE_OPERATION;
 import static org.apache.solr.cloud.OverseerCollectionProcessor.COLL_CONF;
@@ -65,6 +69,8 @@ import static org.apache.solr.cloud.Over
 import static org.apache.solr.common.cloud.ZkNodeProps.makeMap;
 import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.SHARD_ID_PROP;
+import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDROLE;
+import static org.apache.solr.common.params.CollectionParams.CollectionAction.REMOVEROLE;
 
 public class CollectionsHandler extends RequestHandlerBase {
   protected static Logger log = LoggerFactory.getLogger(CollectionsHandler.class);
@@ -173,6 +179,12 @@ public class CollectionsHandler extends 
       case MIGRATE: {
         this.handleMigrate(req, rsp);
         break;
+      } case ADDROLE:{
+        handleRole(ADDROLE, req, rsp);
+        break;
+      } case REMOVEROLE:{
+        handleRole(REMOVEROLE, req, rsp);
+        break;
       }
       default: {
           throw new RuntimeException("Unknown action: " + action);
@@ -181,7 +193,18 @@ public class CollectionsHandler extends 
 
     rsp.setHttpCaching(false);
   }
-  
+
+  static Set<String> KNOWN_ROLES = ImmutableSet.of("overseer");
+
+  private void handleRole(CollectionAction action, SolrQueryRequest req, SolrQueryResponse rsp) throws KeeperException, InterruptedException {
+    req.getParams().required().check("role", "node");
+    Map<String, Object> map = ZkNodeProps.makeMap(Overseer.QUEUE_OPERATION, action.toString().toLowerCase());
+    copyIfNotNull(req.getParams(), map,"role", "node");
+    ZkNodeProps m = new ZkNodeProps(map);
+    if(!KNOWN_ROLES.contains(m.getStr("role"))) throw new SolrException(ErrorCode.BAD_REQUEST,"Unknown role. Supported roles are ,"+ KNOWN_ROLES);
+    handleResponse(action.toString().toLowerCase(), m, rsp);
+  }
+
   public static long DEFAULT_ZK_TIMEOUT = 60*1000;
 
   private void handleResponse(String operation, ZkNodeProps m,

Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=1558776&r1=1558775&r2=1558776&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Thu Jan 16 12:50:21 2014
@@ -218,6 +218,13 @@ public class CoreAdminHandler extends Re
           this.handleRequestBufferUpdatesAction(req, rsp);
           break;
         }
+        case REJOINOVERSEERELECTION:{
+          ZkController zkController = coreContainer.getZkController();
+          if(zkController != null){
+            zkController.rejoinOverseerElection();
+          }
+          break;
+        }
         default: {
           this.handleCustomAction(req, rsp);
           break;

Copied: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java (from r1558760, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java)
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java?p2=lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java&p1=lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java&r1=1558760&r2=1558776&rev=1558776&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java Thu Jan 16 12:50:21 2014
@@ -94,7 +94,7 @@ public class OverseerRolesTest  extends 
     waitForRecoveriesToFinish(collectionName, false);
     Set<String> nodes = client.getZkStateReader().getClusterState().getLiveNodes();
 
-    ArrayList<String> l = new ArrayList<>(nodes);
+    ArrayList<String> l = new ArrayList<String>(nodes);
     log.info("All nodes {}", l);
     String currentLeader = getLeaderNode(client);
     log.info("Current leader {} ", currentLeader);

Modified: lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java?rev=1558776&r1=1558775&r2=1558776&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java (original)
+++ lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java Thu Jan 16 12:50:21 2014
@@ -68,7 +68,8 @@ public class ZkStateReader {
   public static final String LIVE_NODES_ZKNODE = "/live_nodes";
   public static final String ALIASES = "/aliases.json";
   public static final String CLUSTER_STATE = "/clusterstate.json";
-  
+  public static final String ROLES = "/roles.json";
+
   public static final String RECOVERING = "recovering";
   public static final String RECOVERY_FAILED = "recovery_failed";
   public static final String ACTIVE = "active";

Modified: lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java?rev=1558776&r1=1558775&r2=1558776&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java (original)
+++ lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java Thu Jan 16 12:50:21 2014
@@ -28,7 +28,7 @@ public interface CollectionParams 
 
 
   public enum CollectionAction {
-    CREATE, DELETE, RELOAD, SYNCSHARD, CREATEALIAS, DELETEALIAS, SPLITSHARD, DELETESHARD, CREATESHARD, DELETEREPLICA, MIGRATE;
+    CREATE, DELETE, RELOAD, SYNCSHARD, CREATEALIAS, DELETEALIAS, SPLITSHARD, DELETESHARD, CREATESHARD, DELETEREPLICA, MIGRATE, ADDROLE,REMOVEROLE ;
     
     public static CollectionAction get( String p )
     {

Modified: lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java?rev=1558776&r1=1558775&r2=1558776&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java (original)
+++ lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java Thu Jan 16 12:50:21 2014
@@ -127,7 +127,8 @@ public abstract class CoreAdminParams
     REQUESTBUFFERUPDATES,
     REQUESTAPPLYUPDATES,
     LOAD_ON_STARTUP,
-    TRANSIENT;
+    TRANSIENT,
+    REJOINOVERSEERELECTION;
     
     public static CoreAdminAction get( String p )
     {