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/20 13:58:33 UTC

svn commit: r1559680 - in /lucene/dev/branches/branch_4x/solr: ./ core/ core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java core/src/test/org/apache/solr/cloud/OverseerRolesTest.java

Author: noble
Date: Mon Jan 20 12:58:33 2014
New Revision: 1559680

URL: http://svn.apache.org/r1559680
Log:
SOLR-5476 tests passing

Modified:
    lucene/dev/branches/branch_4x/solr/   (props changed)
    lucene/dev/branches/branch_4x/solr/core/   (props changed)
    lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
    lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java

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=1559680&r1=1559679&r2=1559680&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 Mon Jan 20 12:58:33 2014
@@ -19,6 +19,7 @@ package org.apache.solr.cloud;
 
 import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.impl.CloudSolrServer;
 import org.apache.solr.client.solrj.impl.HttpSolrServer;
 import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
 import org.apache.solr.client.solrj.request.CoreAdminRequest;
@@ -67,6 +68,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
@@ -222,56 +224,66 @@ public class OverseerCollectionProcessor
     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);
+    log.info("overseer designates {}", overseerDesignates);
 
+    List<String> nodeNames = getSortedNodeNames(zk);
+    if(nodeNames.size()<2) return;
 
-    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;
+//
+    Set<String> nodesTobePushedBack =  new HashSet<String>();
     //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++) {
+    Set<String> availableDesignates = new HashSet<String>();
+
+    log.debug("sorted nodes {}", nodeNames);//TODO to be removed
+    for (int i = 0; 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);
+        availableDesignates.add(s);
+
+        for(int j=0;j<i;j++){
+          if(!overseerDesignates.contains(nodeNames.get(j))) {
+            nodesTobePushedBack.add(nodeNames.get(j));
+          }
         }
-        break;
+
       }
-      if(overseerDesignateAvailable) break;
+      if(availableDesignates.size()>1) break;
     }
 
-    if(overseerDesignateAvailable){
+    if(!availableDesignates.isEmpty()){
+      for (String s : nodesTobePushedBack) {
+        log.info("pushing back {} ", s);
+        invokeRejoinOverseer(s);
+      }
+
       //wait for a while to ensure the designate has indeed come in front
       boolean prioritizationComplete = false;
-      long timeout = System.currentTimeMillis() + 5000;
+      long timeout = System.currentTimeMillis() + 2500;
 
       for(;System.currentTimeMillis()< timeout ;){
-        children = zk.getChildren(OverseerElectionContext.PATH + LeaderElector.ELECTION_NODE, null, true);
-        LeaderElector.sortSeqs(children);
+        List<String> currentNodeNames = getSortedNodeNames(zk);
+
+        int totalLeaders = 0;
 
-        String frontRunner = LeaderElector.getNodeName(children.get(1));
-        log.debug("Frontrunner : {}", frontRunner);
-        if(newOverseerDesignate.equals(frontRunner)){
+        for(int i=0;i<availableDesignates.size();i++) {
+          if(overseerDesignates.contains(currentNodeNames.get(i))) totalLeaders++;
+        }
+        if(totalLeaders == availableDesignates.size()){
           prioritizationComplete = true;
           break;
         }
-        Thread.sleep(50);
+        try {
+          Thread.sleep(50);
+        } catch (InterruptedException e) {
+          log.warn("Thread interrupted",e);
+          break;
+
+        }
       }
 
       if(!prioritizationComplete) {
-        log.warn("Could not make the Overseer designate '{}' the frontrunner", newOverseerDesignate);
+        log.warn("available designates and current state {} {} ", availableDesignates, getSortedNodeNames(zk));
       }
 
     } else {
@@ -279,14 +291,18 @@ public class OverseerCollectionProcessor
       return;
     }
 
-
-
-    if(!overseerDesignates.contains( nodeNames.get(0)) && overseerDesignateAvailable){
+    if(!overseerDesignates.contains( getLeaderNode(zkStateReader.getZkClient())) && !availableDesignates.isEmpty()){
       //this means there are designated Overseer nodes and I am not one of them , kill myself
       invokeRejoinOverseer(nodeNames.get(0));
     }
 
-
+  }
+  public static List<String> getSortedNodeNames(SolrZkClient zk) throws KeeperException, InterruptedException {
+    List<String> children = zk.getChildren(OverseerElectionContext.PATH + LeaderElector.ELECTION_NODE, null, true);
+    LeaderElector.sortSeqs(children);
+    ArrayList<String> nodeNames = new ArrayList<String>(children.size());
+    for (String c : children) nodeNames.add(LeaderElector.getNodeName(c));
+    return nodeNames;
   }
 
   private void invokeRejoinOverseer(String nodeName) {
@@ -302,6 +318,13 @@ public class OverseerCollectionProcessor
     shardHandler.submit(sreq, replica, sreq.params);
   }
 
+  public static String getLeaderNode(SolrZkClient client) throws KeeperException, InterruptedException {
+    Map m = (Map) ZkStateReader.fromJSON(client.getData("/overseer_elect/leader", null, new Stat(), true));
+    String s = (String) m.get("id");
+    String nodeName = LeaderElector.getNodeName(s);
+    return nodeName;
+  }
+
   protected LeaderStatus amILeader() {
     try {
       ZkNodeProps props = ZkNodeProps.load(zkStateReader.getZkClient().getData(

Modified: lucene/dev/branches/branch_4x/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?rev=1559680&r1=1559679&r2=1559680&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/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 Mon Jan 20 12:58:33 2014
@@ -21,6 +21,7 @@ import org.apache.solr.client.solrj.Solr
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudSolrServer;
 import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.SolrParams;
@@ -46,7 +47,6 @@ import static org.apache.solr.cloud.Over
 import static org.apache.solr.common.cloud.ZkNodeProps.makeMap;
 import static org.apache.solr.common.params.CollectionParams.CollectionAction;
 
-@Ignore("tests need fix failing too often")
 public class OverseerRolesTest  extends AbstractFullDistribZkTestBase{
   private CloudSolrServer client;
 
@@ -99,7 +99,7 @@ public class OverseerRolesTest  extends 
 
     ArrayList<String> l = new ArrayList<String>(nodes);
     log.info("All nodes {}", l);
-    String currentLeader = getLeaderNode(client);
+    String currentLeader = OverseerCollectionProcessor. getLeaderNode(client.getZkStateReader().getZkClient());
     log.info("Current leader {} ", currentLeader);
     l.remove(currentLeader);
 
@@ -112,7 +112,7 @@ public class OverseerRolesTest  extends 
 
     boolean leaderchanged = false;
     for(;System.currentTimeMillis() < timeout;){
-      if(getLeaderNode(client).equals(overseerDesignate)){
+      if(OverseerCollectionProcessor.getLeaderNode(client.getZkStateReader().getZkClient()).equals(overseerDesignate)){
         log.info("overseer designate is the new overseer");
         leaderchanged =true;
         break;
@@ -137,20 +137,18 @@ public class OverseerRolesTest  extends 
     timeout = System.currentTimeMillis()+10000;
     leaderchanged = false;
     for(;System.currentTimeMillis() < timeout;){
-      log.info(" count {}", System.currentTimeMillis());
-      List<String> seqs = client.getZkStateReader().getZkClient().getChildren("/overseer_elect/election", null, true);
-      LeaderElector.sortSeqs(seqs);
+//      log.info(" count {}", System.currentTimeMillis());
 
-      log.info("seqs : {} ",seqs);
 //
-      if(LeaderElector.getNodeName(seqs.get(1)).equals(anotherOverseer)){
+      List<String> sortedNodeNames = OverseerCollectionProcessor.getSortedNodeNames(client.getZkStateReader().getZkClient());
+      if(sortedNodeNames.get(1) .equals(anotherOverseer) || sortedNodeNames.get(0).equals(anotherOverseer)){
         leaderchanged =true;
         break;
       }
       Thread.sleep(100);
     }
 
-    assertTrue("New overseer not the frontrunner", leaderchanged);
+    assertTrue("New overseer not the frontrunner : "+ OverseerCollectionProcessor.getSortedNodeNames(client.getZkStateReader().getZkClient()) + " expected : "+ anotherOverseer, leaderchanged);
 
 
     client.shutdown();
@@ -158,7 +156,7 @@ public class OverseerRolesTest  extends 
 
   }
 
-  private void setOverseerRole(CollectionAction action, String overseerDesignate) throws SolrServerException, IOException {
+  private void setOverseerRole(CollectionAction action, String overseerDesignate) throws Exception, IOException {
     log.info("Adding overseer designate {} ", overseerDesignate);
     Map m = makeMap(
         "action", action.toString().toLowerCase(Locale.ROOT),
@@ -170,14 +168,7 @@ public class OverseerRolesTest  extends 
     client.request(request);
   }
 
-  private String getLeaderNode(CloudSolrServer client) throws KeeperException, InterruptedException {
-    Map m = (Map) ZkStateReader.fromJSON(client.getZkStateReader().getZkClient().getData("/overseer_elect/leader", null, new Stat(), true));
-    String s = (String) m.get("id");
-//    log.info("leader-id {}",s);
-    String nodeName = LeaderElector.getNodeName(s);
-//    log.info("Leader {}", nodeName);
-    return nodeName;
-  }
+
 
   protected void createCollection(String COLL_NAME, CloudSolrServer client) throws Exception {
     int replicationFactor = 2;