Skip to content

Commit 1496354

Browse files
author
Alex Valiushko
committed
node_critical takes into account where it is called from
1 parent dd6d7c3 commit 1496354

File tree

4 files changed

+51
-9
lines changed

4 files changed

+51
-9
lines changed

deps/rabbit/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,11 @@ rabbitmq_integration_suite(
906906
size = "medium",
907907
)
908908

909+
rabbitmq_suite(
910+
name = "unit_quorum_queue_SUITE",
911+
size = "medium",
912+
)
913+
909914
rabbitmq_integration_suite(
910915
name = "unit_app_management_SUITE",
911916
size = "medium",

deps/rabbit/app.bzl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,6 +1621,15 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
16211621
erlc_opts = "//:test_erlc_opts",
16221622
deps = ["//deps/amqp_client:erlang_app"],
16231623
)
1624+
erlang_bytecode(
1625+
name = "unit_quorum_queue_SUITE_beam_files",
1626+
testonly = True,
1627+
srcs = ["test/unit_quorum_queue_SUITE.erl"],
1628+
outs = ["test/unit_quorum_queue_SUITE.beam"],
1629+
app_name = "rabbit",
1630+
erlc_opts = "//:test_erlc_opts",
1631+
deps = ["//deps/amqp_client:erlang_app"],
1632+
)
16241633
erlang_bytecode(
16251634
name = "unit_app_management_SUITE_beam_files",
16261635
testonly = True,

deps/rabbit/src/rabbit_quorum_queue.erl

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
-export([file_handle_release_reservation/0]).
5252
-export([list_with_minimum_quorum/0,
5353
filter_quorum_critical/1,
54-
filter_quorum_critical/2,
54+
filter_quorum_critical/3,
5555
all_replica_states/0]).
5656
-export([capabilities/0]).
5757
-export([repair_amqqueue_nodes/1,
@@ -411,19 +411,21 @@ filter_quorum_critical(Queues) ->
411411
ReplicaStates = maps:from_list(
412412
rabbit_misc:append_rpc_all_nodes(rabbit_nodes:list_running(),
413413
?MODULE, all_replica_states, [])),
414-
filter_quorum_critical(Queues, ReplicaStates).
414+
filter_quorum_critical(Queues, ReplicaStates, node()).
415415

416-
-spec filter_quorum_critical([amqqueue:amqqueue()], #{node() => #{atom() => atom()}}) -> [amqqueue:amqqueue()].
416+
-spec filter_quorum_critical([amqqueue:amqqueue()], #{node() => #{atom() => atom()}}, node()) ->
417+
[amqqueue:amqqueue()].
417418

418-
filter_quorum_critical(Queues, ReplicaStates) ->
419+
filter_quorum_critical(Queues, ReplicaStates, Self) ->
419420
lists:filter(fun (Q) ->
420421
MemberNodes = rabbit_amqqueue:get_quorum_nodes(Q),
421-
{Name, _Node} = amqqueue:get_pid(Q),
422-
AllUp = lists:filter(fun (N) ->
423-
{Name, _} = amqqueue:get_pid(Q),
424-
case maps:get(N, ReplicaStates, undefined) of
422+
{Name, _} = amqqueue:get_pid(Q),
423+
AllUp = lists:filter(fun (Node) ->
424+
case maps:get(Node, ReplicaStates, undefined) of
425425
#{Name := State} when State =:= follower orelse State =:= leader ->
426426
true;
427+
#{Name := State} when State =:= nonvoter andalso Node =:= Self ->
428+
true;
427429
_ -> false
428430
end
429431
end, MemberNodes),
@@ -1148,7 +1150,7 @@ add_member(Q, Node, Timeout) when ?amqqueue_is_quorum(Q) ->
11481150
Conf = make_ra_conf(Q, ServerId, TickTimeout, SnapshotInterval),
11491151
case ra:start_server(?RA_SYSTEM, Conf#{voter => false}) of
11501152
ok ->
1151-
case ra:add_member(Members, ServerId, Timeout) of
1153+
case ra:add_member(Members, #{id => ServerId, voter => false}, Timeout) of
11521154
{ok, _, Leader} ->
11531155
Fun = fun(Q1) ->
11541156
Q2 = update_type_state(
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
-module(unit_quorum_queue_SUITE).
2+
3+
-compile(export_all).
4+
5+
all() ->
6+
[
7+
filter_quorum_critical_accounts_nonvoters
8+
].
9+
10+
filter_quorum_critical_accounts_nonvoters(_Config) ->
11+
Nodes = [test@leader, test@follower1, test@follower2],
12+
Qs0 = [amqqueue:new(rabbit_misc:r(<<"/">>, queue, <<"q1">>),
13+
{q1, test@leader},
14+
false, false, none, [], undefined, #{}),
15+
amqqueue:new(rabbit_misc:r(<<"/">>, queue, <<"q2">>),
16+
{q2, test@leader},
17+
false, false, none, [], undefined, #{})
18+
],
19+
Qs = [Q1, Q2] = lists:map(fun (Q) -> amqqueue:set_type_state(Q, #{nodes => Nodes}) end, Qs0),
20+
Ss = #{test@leader => #{q1 => leader, q2 => leader},
21+
test@follower1 => #{q1 => nonvoter, q2 => follower},
22+
test@follower2 => #{q1 => follower, q2 => nonvoter}},
23+
Qs = rabbit_quorum_queue:filter_quorum_critical(Qs, Ss, test@leader),
24+
[Q2] = rabbit_quorum_queue:filter_quorum_critical(Qs, Ss, test@follower1),
25+
[Q1] = rabbit_quorum_queue:filter_quorum_critical(Qs, Ss, test@follower2),
26+
ok.

0 commit comments

Comments
 (0)