Skip to content

Commit cb77f67

Browse files
Merge pull request #1542 from rabbitmq/master-locator-min-masters-group-bindings-3.7
Make min-masters locator count uniqueue queue names instead of bindings 3.7
2 parents 9b02e69 + 5a0e471 commit cb77f67

File tree

2 files changed

+42
-11
lines changed

2 files changed

+42
-11
lines changed

src/rabbit_queue_location_min_masters.erl

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,26 @@ count_masters(Node, Masters) ->
5757
get_bound_queue_masters_per_vhost([], Acc) ->
5858
lists:flatten(Acc);
5959
get_bound_queue_masters_per_vhost([VHost|RemVHosts], Acc) ->
60-
Bindings = rabbit_binding:list(VHost),
61-
BoundQueueMasters = get_queue_master_per_binding(VHost, Bindings, []),
60+
BoundQueueNames =
61+
lists:filtermap(
62+
fun(#binding{destination =#resource{kind = queue,
63+
name = QueueName}}) ->
64+
{true, QueueName};
65+
(_) ->
66+
false
67+
end,
68+
rabbit_binding:list(VHost)),
69+
UniqQueueNames = lists:usort(BoundQueueNames),
70+
BoundQueueMasters = get_queue_masters(VHost, UniqQueueNames, []),
6271
get_bound_queue_masters_per_vhost(RemVHosts, [BoundQueueMasters|Acc]).
6372

6473

65-
get_queue_master_per_binding(_VHost, [], BoundQueueNodes) -> BoundQueueNodes;
66-
get_queue_master_per_binding(VHost, [#binding{destination=
67-
#resource{kind=queue,
68-
name=QueueName}}|
69-
RemBindings],
70-
QueueMastersAcc) ->
74+
get_queue_masters(_VHost, [], BoundQueueNodes) -> BoundQueueNodes;
75+
get_queue_masters(VHost, [QueueName | RemQueueNames], QueueMastersAcc) ->
7176
QueueMastersAcc0 = case rabbit_queue_master_location_misc:lookup_master(
7277
QueueName, VHost) of
7378
{ok, Master} when is_atom(Master) ->
7479
[Master|QueueMastersAcc];
7580
_ -> QueueMastersAcc
7681
end,
77-
get_queue_master_per_binding(VHost, RemBindings, QueueMastersAcc0);
78-
get_queue_master_per_binding(VHost, [_|RemBindings], QueueMastersAcc) ->
79-
get_queue_master_per_binding(VHost, RemBindings, QueueMastersAcc).
82+
get_queue_masters(VHost, RemQueueNames, QueueMastersAcc0).

test/queue_master_location_SUITE.erl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ groups() ->
5656
declare_policy_exactly,
5757
declare_config,
5858
calculate_min_master,
59+
calculate_min_master_with_bindings,
5960
calculate_random,
6061
calculate_client_local
6162
]}
@@ -210,6 +211,22 @@ calculate_min_master(Config) ->
210211
verify_min_master(Config, Q),
211212
ok.
212213

214+
calculate_min_master_with_bindings(Config) ->
215+
setup_test_environment(Config),
216+
QueueName = rabbit_misc:r(<<"/">>, queue, Q = <<"qm.test_bound">>),
217+
Args = [{<<"x-queue-master-locator">>, longstr, <<"min-masters">>}],
218+
declare(Config, QueueName, false, false, Args, none),
219+
verify_min_master(Config, Q),
220+
%% Add 20 bindings to this queue
221+
[ bind(Config, QueueName, integer_to_binary(N)) || N <- lists:seq(1, 20) ],
222+
223+
QueueName1 = rabbit_misc:r(<<"/">>, queue, Q1 = <<"qm.test_unbound">>),
224+
declare(Config, QueueName1, false, false, Args, none),
225+
% Another queue should still be on the same node, bindings should
226+
% not account for min-masters counting
227+
verify_min_master(Config, Q1),
228+
ok.
229+
213230
calculate_random(Config) ->
214231
setup_test_environment(Config),
215232
QueueName = rabbit_misc:r(<<"/">>, queue, Q = <<"qm.test">>),
@@ -314,6 +331,17 @@ declare(Config, QueueName, Durable, AutoDelete, Args0, Owner) ->
314331
{new, Queue} = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_amqqueue, declare, Args1),
315332
Queue.
316333

334+
bind(Config, QueueName, RoutingKey) ->
335+
ExchangeName = rabbit_misc:r(QueueName, exchange, <<"amq.direct">>),
336+
337+
ok = rabbit_ct_broker_helpers:rpc(
338+
Config, 0, rabbit_binding, add,
339+
[#binding{source = ExchangeName,
340+
destination = QueueName,
341+
key = RoutingKey,
342+
args = []},
343+
<<"acting-user">>]).
344+
317345
verify_min_master(Config, Q, MinMasterNode) ->
318346
Rpc = rabbit_ct_broker_helpers:rpc(Config, 0,
319347
rabbit_queue_master_location_misc,

0 commit comments

Comments
 (0)