X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FRaftActorLeadershipTransferCohort.java;h=9ee4c732c90874746c12d547cef3f41508457edd;hb=bfe4439155b27fbf9ae300252420c8a81fcbdb80;hp=59ae4d3069ba97085c3473b5581dbb608dde574f;hpb=0c05dff15e4f36c5ecbd26e82309de21f67c8cd5;p=controller.git diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorLeadershipTransferCohort.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorLeadershipTransferCohort.java index 59ae4d3069..9ee4c732c9 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorLeadershipTransferCohort.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorLeadershipTransferCohort.java @@ -54,6 +54,8 @@ import scala.concurrent.duration.FiniteDuration; public class RaftActorLeadershipTransferCohort { private static final Logger LOG = LoggerFactory.getLogger(RaftActorLeadershipTransferCohort.class); + static final long USE_DEFAULT_LEADER_TIMEOUT = -1; + private final List onCompleteCallbacks = new ArrayList<>(); private final Stopwatch transferTimer = Stopwatch.createUnstarted(); private final RaftActor raftActor; @@ -70,6 +72,13 @@ public class RaftActorLeadershipTransferCohort { RaftActorLeadershipTransferCohort(final RaftActor raftActor, @Nullable final String requestedFollowerId) { this.raftActor = raftActor; this.requestedFollowerId = requestedFollowerId; + + // We'll wait an election timeout period for a new leader to be elected plus some cushion to take into + // account the variance. + final long electionTimeout = raftActor.getRaftActorContext().getConfigParams() + .getElectionTimeOutInterval().toMillis(); + final int variance = raftActor.getRaftActorContext().getConfigParams().getElectionTimeVariance(); + newLeaderTimeoutInMillis = electionTimeout + variance * 2; } void init() { @@ -141,9 +150,8 @@ public class RaftActorLeadershipTransferCohort { // and convert to follower due to higher term. We should then get an AppendEntries heart // beat with the new leader id. - // Add a timer in case we don't get a leader change - 2 sec should be plenty of time if a new - // leader is elected. Note: the Runnable is sent as a message to the raftActor which executes it - // safely run on the actor's thread dispatcher. + // Add a timer in case we don't get a leader change. Note: the Runnable is sent as a message to the raftActor + // which executes it safely run on the actor's thread dispatcher. FiniteDuration timeout = FiniteDuration.create(newLeaderTimeoutInMillis, TimeUnit.MILLISECONDS); newLeaderTimer = raftActor.getContext().system().scheduler().scheduleOnce(timeout, raftActor.self(), (Runnable) () -> { @@ -189,9 +197,10 @@ public class RaftActorLeadershipTransferCohort { return isTransferring; } - @VisibleForTesting void setNewLeaderTimeoutInMillis(final long newLeaderTimeoutInMillis) { - this.newLeaderTimeoutInMillis = newLeaderTimeoutInMillis; + if (newLeaderTimeoutInMillis != USE_DEFAULT_LEADER_TIMEOUT) { + this.newLeaderTimeoutInMillis = newLeaderTimeoutInMillis; + } } public Optional getRequestedFollowerId() {