From 3a10a45e0f78337435c8bc84015c4724a9fa7741 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 6 Jul 2017 17:15:21 +0200 Subject: [PATCH] BUG-8618: introduce RaftActor.unpauseLeader() This is a preparatory patch, which notifies RaftActor when the operation hooked to pauseLeader() fails to complete and the leader should resume its normal operation. This is needed to correctly resume operations of tell-based protocol after a pauseLeader() completes without actually changing the leader. Change-Id: Ia00e52ebb327575a484af62bf0c31131a33303b3 Signed-off-by: Robert Varga --- .../controller/cluster/raft/RaftActor.java | 11 +++++++++++ .../raft/RaftActorLeadershipTransferCohort.java | 1 + .../controller/cluster/datastore/Shard.java | 6 ++++++ 3 files changed, 18 insertions(+) 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 9d970f1695..fecf223346 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 @@ -851,6 +851,17 @@ public abstract class RaftActor extends AbstractUntypedPersistentActor { operation.run(); } + /** + * This method is invoked when the actions hooked to the leader becoming paused failed to execute and the leader + * should resume normal operations. + * + *

+ * Note this method can be invoked even before the operation supplied to {@link #pauseLeader(Runnable)} is invoked. + */ + protected void unpauseLeader() { + + } + protected void onLeaderChanged(String oldLeader, String newLeader) { } 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 0a22abb965..5b27d50130 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 @@ -178,6 +178,7 @@ public class RaftActorLeadershipTransferCohort { raftActor.getLeaderId(), transferTimer); } else { LOG.warn("{}: Failed to transfer leadership in {}", raftActor.persistenceId(), transferTimer); + raftActor.unpauseLeader(); } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java index 4440c8972d..df9753e063 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java @@ -857,6 +857,12 @@ public class Shard extends RaftActor { store.setRunOnPendingTransactionsComplete(operation); } + @Override + protected void unpauseLeader() { + LOG.debug("{}: In unpauseLeader", persistenceId()); + store.setRunOnPendingTransactionsComplete(null); + } + @Override protected OnDemandRaftState.AbstractBuilder newOnDemandRaftStateBuilder() { return OnDemandShardState.newBuilder().treeChangeListenerActors(treeChangeSupport.getListenerActors()) -- 2.36.6