Skip to content

Commit d93644a

Browse files
author
Alex Valiushko
committed
fix quorum queue status calculation to ignore non-voters
1 parent d9a8c2d commit d93644a

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

deps/rabbit/src/rabbit_quorum_queue.erl

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1672,18 +1672,17 @@ 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 = 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+
Online = [N || N <- Voters, lists:member(N, Running)],
16851684
{_, LeaderNode} = amqqueue:get_pid(Q),
1686-
State = case is_minority(Nodes, Online) of
1685+
State = case is_minority(Voters, Online) of
16871686
true when length(Online) == 0 ->
16881687
down;
16891688
true ->
@@ -1696,10 +1695,12 @@ format(Q, Ctx) when ?is_amqqueue(Q) ->
16961695
down
16971696
end
16981697
end,
1698+
Nodes = lists:sort(get_nodes(Q)),
16991699
[{type, quorum},
17001700
{state, State},
17011701
{node, LeaderNode},
17021702
{members, Nodes},
1703+
{voters, Voters},
17031704
{leader, LeaderNode},
17041705
{online, Online}].
17051706

@@ -1783,6 +1784,15 @@ get_nodes(Q) when ?is_amqqueue(Q) ->
17831784
#{nodes := Nodes} = amqqueue:get_type_state(Q),
17841785
Nodes.
17851786

1787+
get_voters(Q) when ?amqqueue_is_quorum(Q) ->
1788+
{_, Leader} = amqqueue:get_pid(Q),
1789+
%% FIXME replace with proper API pending rabbitmq/ra#411
1790+
case ra_server_proc:state_query(Leader, voters, 1000) of
1791+
{ok, Members, _} -> Members;
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)