summaryrefslogtreecommitdiff
path: root/src/rabbit_limiter.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rabbit_limiter.erl')
-rw-r--r--src/rabbit_limiter.erl17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/rabbit_limiter.erl b/src/rabbit_limiter.erl
index 257950b3..7ca9772b 100644
--- a/src/rabbit_limiter.erl
+++ b/src/rabbit_limiter.erl
@@ -129,8 +129,17 @@ remember_queue(QPid, State = #lim{queues = Queues}) ->
end.
forget_queues(State = #lim{ch_pid = ChPid, queues = Queues}) ->
- ok = dict:fold(fun(Q, Ref, ok) ->
- true = erlang:demonitor(Ref),
- rabbit_amqqueue:unblock(Q, ChPid)
- end, ok, Queues),
+ QList = dict:to_list(Queues),
+ case length(QList) of
+ 0 -> ok;
+ L ->
+ %% We randomly vary the position in which each queue
+ %% appears in the list, thus ensuring that each queue has
+ %% an equal chance of being notified first.
+ {L1, L2} = lists:split(random:uniform(L), QList),
+ [begin
+ true = erlang:demonitor(Ref),
+ ok = rabbit_amqqueue:unblock(Q, ChPid)
+ end || {Q, Ref} <- L2 ++ L1]
+ end,
State#lim{queues = dict:new()}.