diff --git a/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java b/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java index 0948a8edc2c..c8fc0dec16e 100644 --- a/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java +++ b/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java @@ -71,7 +71,7 @@ public abstract class ElectionContext { } } - abstract void runLeaderProcess(boolean weAreReplacement) throws KeeperException, InterruptedException, IOException; + abstract void runLeaderProcess(boolean weAreReplacement, int pauseTime) throws KeeperException, InterruptedException, IOException; public void checkIfIamLeaderFired() {} @@ -106,7 +106,7 @@ class ShardLeaderElectionContextBase extends ElectionContext { } @Override - void runLeaderProcess(boolean weAreReplacement) throws KeeperException, + void runLeaderProcess(boolean weAreReplacement, int pauseBeforeStart) throws KeeperException, InterruptedException, IOException { zkClient.makePath(leaderPath, ZkStateReader.toJSON(leaderProps), @@ -154,7 +154,7 @@ final class ShardLeaderElectionContext extends ShardLeaderElectionContextBase { * weAreReplacement: has someone else been the leader already? */ @Override - void runLeaderProcess(boolean weAreReplacement) throws KeeperException, + void runLeaderProcess(boolean weAreReplacement, int pauseBeforeStart) throws KeeperException, InterruptedException, IOException { log.info("Running the leader process for shard " + shardId); @@ -270,7 +270,7 @@ final class ShardLeaderElectionContext extends ShardLeaderElectionContextBase { } boolean success = false; try { - super.runLeaderProcess(weAreReplacement); + super.runLeaderProcess(weAreReplacement, 0); success = true; } catch (Exception e) { SolrException.log(log, "There was a problem trying to register as the leader", e); @@ -449,7 +449,7 @@ final class OverseerElectionContext extends ElectionContext { } @Override - void runLeaderProcess(boolean weAreReplacement) throws KeeperException, + void runLeaderProcess(boolean weAreReplacement, int pauseBeforeStart) throws KeeperException, InterruptedException { log.info("I am going to be the leader {}", id); final String id = leaderSeqPath @@ -458,6 +458,13 @@ final class OverseerElectionContext extends ElectionContext { zkClient.makePath(leaderPath, ZkStateReader.toJSON(myProps), CreateMode.EPHEMERAL, true); + if(pauseBeforeStart >0){ + try { + Thread.sleep(pauseBeforeStart); + } catch (InterruptedException e) { + log.warn("Wait interrupted ", e); + } + } overseer.start(id); } diff --git a/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java b/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java index 799fcf1c97e..488ae8f7f7a 100644 --- a/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java +++ b/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java @@ -161,7 +161,7 @@ public class LeaderElector { // TODO: get this core param out of here protected void runIamLeaderProcess(final ElectionContext context, boolean weAreReplacement) throws KeeperException, InterruptedException, IOException { - context.runLeaderProcess(weAreReplacement); + context.runLeaderProcess(weAreReplacement,0); } /** diff --git a/solr/core/src/java/org/apache/solr/cloud/Overseer.java b/solr/core/src/java/org/apache/solr/cloud/Overseer.java index 89c14ba062f..1c3c5efd630 100644 --- a/solr/core/src/java/org/apache/solr/cloud/Overseer.java +++ b/solr/core/src/java/org/apache/solr/cloud/Overseer.java @@ -59,10 +59,10 @@ public class Overseer { public static final String ADD_ROUTING_RULE = "addroutingrule"; public static final String REMOVE_ROUTING_RULE = "removeroutingrule"; - private static final int STATE_UPDATE_DELAY = 1500; // delay between cloud state updates + public static final int STATE_UPDATE_DELAY = 1500; // delay between cloud state updates private static Logger log = LoggerFactory.getLogger(Overseer.class); - + static enum LeaderStatus { DONT_KNOW, NO, YES }; private long lastUpdatedTime = 0; @@ -89,7 +89,7 @@ public class Overseer { @Override public void run() { - + LeaderStatus isLeader = amILeader(); while (isLeader == LeaderStatus.DONT_KNOW) { log.debug("am_i_leader unclear {}", isLeader); diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java index 7b8d60478f1..3b83db45e8b 100644 --- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java +++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java @@ -295,9 +295,8 @@ public final class ZkController { public void forceOverSeer(){ try { zkClient.delete("/overseer_elect/leader",-1, true); - log.info("Forcing me to be leader {} ",getBaseUrl()); - overseerElector.getContext().runLeaderProcess(true); - rejoinOverseerElection(); + log.info("Forcing me to be leader {} ", getBaseUrl()); + overseerElector.getContext().runLeaderProcess(true, Overseer.STATE_UPDATE_DELAY+100); } catch (Exception e) { throw new SolrException(ErrorCode.SERVER_ERROR, " Error becoming overseer ",e);