mirror of https://github.com/apache/lucene.git
SOLR-5715 CloudSolrServer should choose URLs that match _route_
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1579897 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6b95159fa2
commit
c05222bc0d
|
@ -55,7 +55,6 @@ import org.apache.solr.common.params.ShardParams;
|
||||||
import org.apache.solr.common.util.NamedList;
|
import org.apache.solr.common.util.NamedList;
|
||||||
import org.apache.solr.common.util.SimpleOrderedMap;
|
import org.apache.solr.common.util.SimpleOrderedMap;
|
||||||
import org.apache.solr.common.util.StrUtils;
|
import org.apache.solr.common.util.StrUtils;
|
||||||
import org.apache.solr.handler.component.HttpShardHandlerFactory;
|
|
||||||
import org.apache.solr.handler.component.ShardHandler;
|
import org.apache.solr.handler.component.ShardHandler;
|
||||||
import org.apache.solr.handler.component.ShardRequest;
|
import org.apache.solr.handler.component.ShardRequest;
|
||||||
import org.apache.solr.handler.component.ShardResponse;
|
import org.apache.solr.handler.component.ShardResponse;
|
||||||
|
@ -72,15 +71,11 @@ import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import static org.apache.solr.cloud.Assign.Node;
|
import static org.apache.solr.cloud.Assign.Node;
|
||||||
|
@ -281,7 +276,7 @@ public class OverseerCollectionProcessor implements Runnable, ClosableThread {
|
||||||
if(overseerDesignates.size() == 1 && overseerDesignates.contains(getLeaderNode(zk))) return;
|
if(overseerDesignates.size() == 1 && overseerDesignates.contains(getLeaderNode(zk))) return;
|
||||||
log.info("overseer designates {}", overseerDesignates);
|
log.info("overseer designates {}", overseerDesignates);
|
||||||
|
|
||||||
List<String> nodeNames = getSortedNodeNames(zk);
|
List<String> nodeNames = getSortedOverseerNodeNames(zk);
|
||||||
if(nodeNames.size()<2) return;
|
if(nodeNames.size()<2) return;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -318,7 +313,7 @@ public class OverseerCollectionProcessor implements Runnable, ClosableThread {
|
||||||
long timeout = System.nanoTime() + TimeUnit.NANOSECONDS.convert(2500, TimeUnit.MILLISECONDS);
|
long timeout = System.nanoTime() + TimeUnit.NANOSECONDS.convert(2500, TimeUnit.MILLISECONDS);
|
||||||
|
|
||||||
while (System.nanoTime() < timeout) {
|
while (System.nanoTime() < timeout) {
|
||||||
List<String> currentNodeNames = getSortedNodeNames(zk);
|
List<String> currentNodeNames = getSortedOverseerNodeNames(zk);
|
||||||
|
|
||||||
int totalLeaders = 0;
|
int totalLeaders = 0;
|
||||||
|
|
||||||
|
@ -339,7 +334,7 @@ public class OverseerCollectionProcessor implements Runnable, ClosableThread {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!prioritizationComplete) {
|
if(!prioritizationComplete) {
|
||||||
log.warn("available designates and current state {} {} ", availableDesignates, getSortedNodeNames(zk));
|
log.warn("available designates and current state {} {} ", availableDesignates, getSortedOverseerNodeNames(zk));
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -358,7 +353,7 @@ public class OverseerCollectionProcessor implements Runnable, ClosableThread {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<String> getSortedNodeNames(SolrZkClient zk) throws KeeperException, InterruptedException {
|
public static List<String> getSortedOverseerNodeNames(SolrZkClient zk) throws KeeperException, InterruptedException {
|
||||||
List<String> children = null;
|
List<String> children = null;
|
||||||
try {
|
try {
|
||||||
children = zk.getChildren(OverseerElectionContext.PATH + LeaderElector.ELECTION_NODE, null, true);
|
children = zk.getChildren(OverseerElectionContext.PATH + LeaderElector.ELECTION_NODE, null, true);
|
||||||
|
|
|
@ -58,6 +58,7 @@ import org.apache.solr.common.cloud.ZkCoreNodeProps;
|
||||||
import org.apache.solr.common.cloud.ZkNodeProps;
|
import org.apache.solr.common.cloud.ZkNodeProps;
|
||||||
import org.apache.solr.common.cloud.ZkStateReader;
|
import org.apache.solr.common.cloud.ZkStateReader;
|
||||||
import org.apache.solr.common.cloud.ZooKeeperException;
|
import org.apache.solr.common.cloud.ZooKeeperException;
|
||||||
|
import org.apache.solr.common.params.CollectionParams;
|
||||||
import org.apache.solr.common.params.SolrParams;
|
import org.apache.solr.common.params.SolrParams;
|
||||||
import org.apache.solr.common.util.URLUtil;
|
import org.apache.solr.common.util.URLUtil;
|
||||||
import org.apache.solr.core.CoreContainer;
|
import org.apache.solr.core.CoreContainer;
|
||||||
|
@ -1662,4 +1663,24 @@ public final class ZkController {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void checkOverseerDesignate() {
|
||||||
|
try {
|
||||||
|
byte[] data = zkClient.getData(ZkStateReader.ROLES, null, new Stat(), true);
|
||||||
|
if(data ==null) return;
|
||||||
|
Map roles = (Map) ZkStateReader.fromJSON(data);
|
||||||
|
if(roles ==null) return;
|
||||||
|
List nodeList= (List) roles.get("overseer");
|
||||||
|
if(nodeList == null) return;
|
||||||
|
if(nodeList.contains(getNodeName())){
|
||||||
|
ZkNodeProps props = new ZkNodeProps(Overseer.QUEUE_OPERATION, CollectionParams.CollectionAction.ADDROLE.toString().toLowerCase(Locale.ROOT),
|
||||||
|
"node", getNodeName(),
|
||||||
|
"role", "overseer");
|
||||||
|
log.info("Going to add role {} ",props);
|
||||||
|
getOverseerCollectionQueue().offer(ZkStateReader.toJSON(props));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("could not readd the overseer designate ",e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -347,6 +347,7 @@ public class CoreContainer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
zkSys.getZkController().checkOverseerDesignate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ package org.apache.solr.cloud;
|
||||||
import static org.apache.solr.cloud.OverseerCollectionProcessor.MAX_SHARDS_PER_NODE;
|
import static org.apache.solr.cloud.OverseerCollectionProcessor.MAX_SHARDS_PER_NODE;
|
||||||
import static org.apache.solr.cloud.OverseerCollectionProcessor.NUM_SLICES;
|
import static org.apache.solr.cloud.OverseerCollectionProcessor.NUM_SLICES;
|
||||||
import static org.apache.solr.cloud.OverseerCollectionProcessor.REPLICATION_FACTOR;
|
import static org.apache.solr.cloud.OverseerCollectionProcessor.REPLICATION_FACTOR;
|
||||||
import static org.apache.solr.cloud.OverseerCollectionProcessor.getSortedNodeNames;
|
import static org.apache.solr.cloud.OverseerCollectionProcessor.getSortedOverseerNodeNames;
|
||||||
import static org.apache.solr.cloud.OverseerCollectionProcessor.getLeaderNode;
|
import static org.apache.solr.cloud.OverseerCollectionProcessor.getLeaderNode;
|
||||||
import static org.apache.solr.common.cloud.ZkNodeProps.makeMap;
|
import static org.apache.solr.common.cloud.ZkNodeProps.makeMap;
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ public class OverseerRolesTest extends AbstractFullDistribZkTestBase{
|
||||||
createCollection(collectionName, client);
|
createCollection(collectionName, client);
|
||||||
|
|
||||||
waitForRecoveriesToFinish(collectionName, false);
|
waitForRecoveriesToFinish(collectionName, false);
|
||||||
List<String> l = OverseerCollectionProcessor.getSortedNodeNames(client.getZkStateReader().getZkClient()) ;
|
List<String> l = OverseerCollectionProcessor.getSortedOverseerNodeNames(client.getZkStateReader().getZkClient()) ;
|
||||||
|
|
||||||
log.info("All nodes {}", l);
|
log.info("All nodes {}", l);
|
||||||
String currentLeader = OverseerCollectionProcessor.getLeaderNode(client.getZkStateReader().getZkClient());
|
String currentLeader = OverseerCollectionProcessor.getLeaderNode(client.getZkStateReader().getZkClient());
|
||||||
|
@ -118,15 +118,9 @@ public class OverseerRolesTest extends AbstractFullDistribZkTestBase{
|
||||||
}
|
}
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
}
|
}
|
||||||
/*if(!leaderchanged){
|
|
||||||
|
|
||||||
log.warn("expected {}, current order {}",
|
|
||||||
overseerDesignate,
|
|
||||||
getSortedNodeNames(client.getZkStateReader().getZkClient())+ " ldr :"+ OverseerCollectionProcessor.getLeaderNode(client.getZkStateReader().getZkClient()) );
|
|
||||||
}*/
|
|
||||||
assertTrue("could not set the new overseer . expected "+
|
assertTrue("could not set the new overseer . expected "+
|
||||||
overseerDesignate + " current order : " +
|
overseerDesignate + " current order : " +
|
||||||
getSortedNodeNames(client.getZkStateReader().getZkClient()) +
|
getSortedOverseerNodeNames(client.getZkStateReader().getZkClient()) +
|
||||||
" ldr :"+ OverseerCollectionProcessor.getLeaderNode(client.getZkStateReader().getZkClient()) ,leaderchanged);
|
" ldr :"+ OverseerCollectionProcessor.getLeaderNode(client.getZkStateReader().getZkClient()) ,leaderchanged);
|
||||||
|
|
||||||
|
|
||||||
|
@ -145,7 +139,7 @@ public class OverseerRolesTest extends AbstractFullDistribZkTestBase{
|
||||||
timeout = System.currentTimeMillis()+10000;
|
timeout = System.currentTimeMillis()+10000;
|
||||||
leaderchanged = false;
|
leaderchanged = false;
|
||||||
for(;System.currentTimeMillis() < timeout;){
|
for(;System.currentTimeMillis() < timeout;){
|
||||||
List<String> sortedNodeNames = getSortedNodeNames(client.getZkStateReader().getZkClient());
|
List<String> sortedNodeNames = getSortedOverseerNodeNames(client.getZkStateReader().getZkClient());
|
||||||
if(sortedNodeNames.get(1) .equals(anotherOverseer) || sortedNodeNames.get(0).equals(anotherOverseer)){
|
if(sortedNodeNames.get(1) .equals(anotherOverseer) || sortedNodeNames.get(0).equals(anotherOverseer)){
|
||||||
leaderchanged =true;
|
leaderchanged =true;
|
||||||
break;
|
break;
|
||||||
|
@ -153,14 +147,18 @@ public class OverseerRolesTest extends AbstractFullDistribZkTestBase{
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
assertTrue("New overseer not the frontrunner : "+ getSortedNodeNames(client.getZkStateReader().getZkClient()) + " expected : "+ anotherOverseer, leaderchanged);
|
assertTrue("New overseer not the frontrunner : "+ getSortedOverseerNodeNames(client.getZkStateReader().getZkClient()) + " expected : "+ anotherOverseer, leaderchanged);
|
||||||
|
|
||||||
|
|
||||||
String currentOverseer = getLeaderNode(client.getZkStateReader().getZkClient());
|
String currentOverseer = getLeaderNode(client.getZkStateReader().getZkClient());
|
||||||
|
|
||||||
|
String killedOverseer = currentOverseer;
|
||||||
|
|
||||||
log.info("Current Overseer {}", currentOverseer);
|
log.info("Current Overseer {}", currentOverseer);
|
||||||
Pattern pattern = Pattern.compile("(.*):(\\d*)(.*)");
|
Pattern pattern = Pattern.compile("(.*):(\\d*)(.*)");
|
||||||
Matcher m = pattern.matcher(currentOverseer);
|
Matcher m = pattern.matcher(currentOverseer);
|
||||||
|
JettySolrRunner stoppedJetty =null;
|
||||||
|
|
||||||
if(m.matches()){
|
if(m.matches()){
|
||||||
String hostPort = m.group(1)+":"+m.group(2);
|
String hostPort = m.group(1)+":"+m.group(2);
|
||||||
|
|
||||||
|
@ -171,7 +169,7 @@ public class OverseerRolesTest extends AbstractFullDistribZkTestBase{
|
||||||
if(s.contains(hostPort)){
|
if(s.contains(hostPort)){
|
||||||
log.info("leader node {}",s);
|
log.info("leader node {}",s);
|
||||||
ChaosMonkey.stop(jetty);
|
ChaosMonkey.stop(jetty);
|
||||||
|
stoppedJetty = jetty;
|
||||||
timeout = System.currentTimeMillis()+10000;
|
timeout = System.currentTimeMillis()+10000;
|
||||||
leaderchanged = false;
|
leaderchanged = false;
|
||||||
for(;System.currentTimeMillis() < timeout;){
|
for(;System.currentTimeMillis() < timeout;){
|
||||||
|
@ -189,6 +187,25 @@ public class OverseerRolesTest extends AbstractFullDistribZkTestBase{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChaosMonkey.start(stoppedJetty);
|
||||||
|
|
||||||
|
timeout = System.currentTimeMillis()+10000;
|
||||||
|
leaderchanged = false;
|
||||||
|
for(;System.currentTimeMillis() < timeout;){
|
||||||
|
List<String> sortedNodeNames = getSortedOverseerNodeNames(client.getZkStateReader().getZkClient());
|
||||||
|
if(sortedNodeNames.get(1).equals(killedOverseer) || sortedNodeNames.get(0).equals(killedOverseer)){
|
||||||
|
leaderchanged =true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Thread.sleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue("New overseer not the frontrunner : "+ getSortedOverseerNodeNames(client.getZkStateReader().getZkClient()) + " expected : "+ killedOverseer, leaderchanged);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
client.shutdown();
|
client.shutdown();
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue