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%2FRaftActor.java;h=2bd75923d9a06c24a34f506ab2b4574263ab6f0a;hb=36372c716205959311bb86256872cf9c7b2d350b;hp=6851f6aab9ca4441ab79055c967d14c4c5335cc5;hpb=4e000b89c3b5ac555cb1e2c39e999a8633b48a96;p=controller.git diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java index 6851f6aab9..2bd75923d9 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java @@ -316,9 +316,14 @@ public abstract class RaftActor extends AbstractUntypedPersistentActor { } }); } else if(currentBehavior.state() == RaftState.Leader) { - pauseLeader(new Runnable() { + pauseLeader(new TimedRunnable(context.getConfigParams().getElectionTimeOutInterval(), this) { @Override - public void run() { + protected void doRun() { + self().tell(PoisonPill.getInstance(), self()); + } + + @Override + protected void doCancel() { self().tell(PoisonPill.getInstance(), self()); } }); @@ -532,7 +537,12 @@ public abstract class RaftActor extends AbstractUntypedPersistentActor { } protected boolean isLeaderActive() { - return currentBehavior.state() != RaftState.IsolatedLeader && !shuttingDown && leadershipTransferInProgress == null; + return currentBehavior.state() != RaftState.IsolatedLeader && !shuttingDown && + !isLeadershipTransferInProgress(); + } + + private boolean isLeadershipTransferInProgress() { + return leadershipTransferInProgress != null && leadershipTransferInProgress.isTransferring(); } /** @@ -718,8 +728,9 @@ public abstract class RaftActor extends AbstractUntypedPersistentActor { /** * This method is called prior to operations such as leadership transfer and actor shutdown when the leader * must pause or stop its duties. This method allows derived classes to gracefully pause or finish current - * work prior to performing the operation. On completion of any work, the run method must be called to - * proceed with the given operation. + * work prior to performing the operation. On completion of any work, the run method must be called on the + * given Runnable to proceed with the given operation. Important: the run method must be called on + * this actor's thread dispatcher as as it modifies internal state. *

* The default implementation immediately runs the operation. *