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;