Skip to content

Commit 3a52acc

Browse files
author
Alex Valiushko
committed
fix quorum queue status calculation to ignore non-voters
1 parent fdef585 commit 3a52acc

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

MODULE.bazel

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,8 @@ erlang_package.hex_package(
338338
name = "ra_alt",
339339
build_file = "@rabbitmq-server//bazel:BUILD.ra",
340340
pkg = "ra",
341-
sha256 = "20ba906dc4feb824f07facca227b5a4f9bf7435eb21f469028112313a64a8490",
342-
version = "2.7.1",
341+
sha256 = "950ece39e4ba109523d9176a507335a3144264bd7e2af461c36b206b2ef54e10",
342+
version = "2.8.0",
343343
)
344344

345345
erlang_package.git_package(

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 = 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:voters(Leader) 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.

deps/rabbitmq_cli/mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ defmodule RabbitMQCtl.MixfileBase do
1111
[
1212
app: :rabbitmqctl,
1313
version: "3.13.0-dev",
14-
elixir: ">= 1.13.4 and < 1.16.0",
14+
elixir: ">= 1.13.4 and < 1.17.0",
1515
build_embedded: Mix.env() == :prod,
1616
start_permanent: Mix.env() == :prod,
1717
escript: [

0 commit comments

Comments
 (0)