Skip to content

Commit 34202f1

Browse files
author
Alex Valiushko
committed
fix quorum queue status calculation to ignore non-voters
1 parent 1919feb commit 34202f1

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

deps/rabbit/src/rabbit_quorum_queue.erl

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1672,34 +1672,36 @@ online(Q) when ?is_amqqueue(Q) ->
16721672
is_pid(Pid)].
16731673

16741674
format(Q, Ctx) when ?is_amqqueue(Q) ->
1675-
%% TODO: this should really just be voters
1676-
Nodes = lists:sort(get_nodes(Q)),
1675+
Voters = lists:sort(get_voters(Q)),
16771676
Running = case Ctx of
16781677
#{running_nodes := Running0} ->
16791678
Running0;
16801679
_ ->
16811680
%% WARN: slow
16821681
rabbit_nodes:list_running()
16831682
end,
1684-
Online = [N || N <- Nodes, lists:member(N, Running)],
1683+
OnlineVoters = [N || N <- Voters, lists:member(N, Running)],
16851684
{_, LeaderNode} = amqqueue:get_pid(Q),
1686-
State = case is_minority(Nodes, Online) of
1687-
true when length(Online) == 0 ->
1685+
State = case is_minority(Voters, OnlineVoters) of
1686+
true when length(OnlineVoters) == 0 ->
16881687
down;
16891688
true ->
16901689
minority;
16911690
false ->
1692-
case lists:member(LeaderNode, Online) of
1691+
case lists:member(LeaderNode, OnlineVoters) of
16931692
true ->
16941693
running;
16951694
false ->
16961695
down
16971696
end
16981697
end,
1698+
Nodes = lists:sort(get_nodes(Q)),
1699+
Online = [N || N <- Nodes, lists:member(N, Running)],
16991700
[{type, quorum},
17001701
{state, State},
17011702
{node, LeaderNode},
17021703
{members, Nodes},
1704+
{voters, Voters},
17031705
{leader, LeaderNode},
17041706
{online, Online}].
17051707

@@ -1783,6 +1785,14 @@ get_nodes(Q) when ?is_amqqueue(Q) ->
17831785
#{nodes := Nodes} = amqqueue:get_type_state(Q),
17841786
Nodes.
17851787

1788+
get_voters(Q) when ?amqqueue_is_quorum(Q) ->
1789+
Leader = amqqueue:get_pid(Q),
1790+
case ra_server_proc:local_state_query(Leader, voters, 5000) of
1791+
{ok, Vs, _} -> [Node || {_RaName, Node} <- Vs];
1792+
_ -> []
1793+
end.
1794+
1795+
17861796
get_connected_nodes(Q) when ?is_amqqueue(Q) ->
17871797
ErlangNodes = [node() | nodes()],
17881798
[N || N <- get_nodes(Q), lists:member(N, ErlangNodes)].
@@ -1907,6 +1917,9 @@ force_all_queues_shrink_member_to_current_member() ->
19071917
rabbit_log:warning("Disaster recovery procedure: shrinking finished"),
19081918
ok.
19091919

1920+
is_minority([], _) ->
1921+
%% Leader couldn't list voters.
1922+
true;
19101923
is_minority(All, Up) ->
19111924
MinQuorum = length(All) div 2 + 1,
19121925
length(Up) < MinQuorum.

0 commit comments

Comments
 (0)