Stop local quorum queue followers after transferring leadership
This way the shutdown of a node that's been put into maintenance mode won't have any further effects on the quorum (or rather, the effects will be "frontloaded" which is the goal of maintenance mode). Closes #2474.
This commit is contained in:
parent
bfe9eebc63
commit
76255ef5da
|
|
@ -89,6 +89,7 @@ do_drain() ->
|
||||||
[length(TransferCandidates), ReadableCandidates]),
|
[length(TransferCandidates), ReadableCandidates]),
|
||||||
transfer_leadership_of_classic_mirrored_queues(TransferCandidates),
|
transfer_leadership_of_classic_mirrored_queues(TransferCandidates),
|
||||||
transfer_leadership_of_quorum_queues(TransferCandidates),
|
transfer_leadership_of_quorum_queues(TransferCandidates),
|
||||||
|
stop_local_quorum_queue_followers(),
|
||||||
|
|
||||||
%% allow plugins to react
|
%% allow plugins to react
|
||||||
rabbit_event:notify(maintenance_draining, #{
|
rabbit_event:notify(maintenance_draining, #{
|
||||||
|
|
@ -276,6 +277,28 @@ transfer_leadership_of_classic_mirrored_queues(TransferCandidates) ->
|
||||||
end || Q <- Queues],
|
end || Q <- Queues],
|
||||||
rabbit_log:info("Leadership transfer for local classic mirrored queues is complete").
|
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()].
|
-spec primary_replica_transfer_candidate_nodes() -> [node()].
|
||||||
primary_replica_transfer_candidate_nodes() ->
|
primary_replica_transfer_candidate_nodes() ->
|
||||||
filter_out_drained_nodes_consistent_read(rabbit_nodes:all_running() -- [node()]).
|
filter_out_drained_nodes_consistent_read(rabbit_nodes:all_running() -- [node()]).
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue