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:48:56 UTC

svn commit: r1559677 - in /lucene/dev/trunk/solr/core/src: java/org/apache/solr/cloud/OverseerCollectionProcessor.java test/org/apache/solr/cloud/OverseerRolesTest.java

Author: noble
Date: Mon Jan 20 12:48:56 2014
New Revision: 1559677

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

Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java?rev=1559677&r1=1559676&r2=1559677&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java Mon Jan 20 12:48:56 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<>(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,28 @@ 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<>(children.size());
+    for (String c : children) nodeNames.add(LeaderElector.getNodeName(c));
+    return nodeNames;
+  }
 
+  public static String getLeaderNode(SolrZkClient zkClient) throws KeeperException, InterruptedException {
+    Map m = (Map) ZkStateReader.fromJSON(zkClient.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;
   }
 
   private void invokeRejoinOverseer(String nodeName) {

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java?rev=1559677&r1=1559676&r2=1559677&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java Mon Jan 20 12:48:56 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;
 
@@ -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),