diff options
author | Matthias Radestock <matthias@lshift.net> | 2008-12-23 10:26:23 +0000 |
---|---|---|
committer | Matthias Radestock <matthias@lshift.net> | 2008-12-23 10:26:23 +0000 |
commit | 8154121e282bab4951a11daacb0428ad76c2db3e (patch) | |
tree | dffc64b939b8247d42d586c5ae8c9ea17a4abc06 | |
parent | eab60583f79a3f689be30403b7f8a56aad99bd8b (diff) | |
download | rabbitmq-server-8154121e282bab4951a11daacb0428ad76c2db3e.tar.gz |
ensure fairness
-rw-r--r-- | src/rabbit_limiter.erl | 17 |
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()}. |