diff options
author | Michael Klishin <klishinm@vmware.com> | 2020-10-20 07:09:10 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-20 07:09:10 +0300 |
commit | 37f6df2117a7aeefdc306367383dffe7cb7367c3 (patch) | |
tree | 2bdf3e3dea83c037daa12373e0c8a391742e0319 | |
parent | 402c53ef38cdb10bd0492c0fb73e14f59b9b188d (diff) | |
parent | 76255ef5daa6dc89f42f562f29eca1d7bd8aa377 (diff) | |
download | rabbitmq-server-git-37f6df2117a7aeefdc306367383dffe7cb7367c3.tar.gz |
Merge pull request #2476 from rabbitmq/rabbitmq-server-2474
Stop local quorum queue followers after transferring leadership
-rw-r--r-- | src/rabbit_maintenance.erl | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/rabbit_maintenance.erl b/src/rabbit_maintenance.erl index 004f8b4cea..039d125b13 100644 --- a/src/rabbit_maintenance.erl +++ b/src/rabbit_maintenance.erl @@ -89,6 +89,7 @@ do_drain() -> [length(TransferCandidates), ReadableCandidates]), transfer_leadership_of_classic_mirrored_queues(TransferCandidates), transfer_leadership_of_quorum_queues(TransferCandidates), + stop_local_quorum_queue_followers(), %% allow plugins to react rabbit_event:notify(maintenance_draining, #{ @@ -276,6 +277,28 @@ transfer_leadership_of_classic_mirrored_queues(TransferCandidates) -> end || Q <- Queues], rabbit_log:info("Leadership transfer for local classic mirrored queues is complete"). +-spec stop_local_quorum_queue_followers() -> ok. +stop_local_quorum_queue_followers() -> + Queues = rabbit_amqqueue:list_local_followers(), + rabbit_log:info("Will stop local follower replicas of ~b quorum queues on this node", + [length(Queues)]), + [begin + Name = amqqueue:get_name(Q), + rabbit_log:debug("Will stop a local follower replica of quorum queue ~s", + [rabbit_misc:rs(Name)]), + %% shut down Ra nodes so that they are not considered for leader election + {RegisteredName, _LeaderNode} = amqqueue:get_pid(Q), + RaNode = {RegisteredName, node()}, + rabbit_log:debug("Will stop Ra server ~p", [RaNode]), + case ra:stop_server(RaNode) of + ok -> + rabbit_log:debug("Successfully stopped Ra server ~p", [RaNode]); + {error, nodedown} -> + rabbit_log:error("Failed to stop Ra server ~p: target node was reported as down") + end + end || Q <- Queues], + rabbit_log:info("Stopped all local replicas of quorum queues hosted on this node"). + -spec primary_replica_transfer_candidate_nodes() -> [node()]. primary_replica_transfer_candidate_nodes() -> filter_out_drained_nodes_consistent_read(rabbit_nodes:all_running() -- [node()]). |