summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@rabbitmq.com>2011-09-22 12:32:06 +0100
committerMatthew Sackman <matthew@rabbitmq.com>2011-09-22 12:32:06 +0100
commit61b426d83ebb25f9a6bc07cb5e1a5d3833b6d23e (patch)
tree524e8a1f10c7ce5cb0cdc4f51e5b7f189871fcff
parent2dab788ca9b74e09cf0515702d1697e0b51d5fca (diff)
downloadrabbitmq-server-bug24433.tar.gz
Avoid construction of intermediate queuebug24433
-rw-r--r--src/rabbit_amqqueue_process.erl13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl
index d2559868..e3a2ca90 100644
--- a/src/rabbit_amqqueue_process.erl
+++ b/src/rabbit_amqqueue_process.erl
@@ -800,13 +800,14 @@ i(Item, _) ->
throw({bad_argument, Item}).
consumers(#q{active_consumers = ActiveConsumers}) ->
+ lists:foldl(fun (C, Acc) -> consumers(C#cr.blocked_consumers, Acc) end,
+ consumers(ActiveConsumers, []), all_ch_record()).
+
+consumers(Consumers, Acc) ->
rabbit_misc:queue_fold(
- fun ({ChPid, #consumer{tag = ConsumerTag,
- ack_required = AckRequired}}, Acc) ->
- [{ChPid, ConsumerTag, AckRequired} | Acc]
- end, [], lists:foldl(fun (#cr{blocked_consumers = Consumers}, Acc) ->
- queue:join(Acc, Consumers)
- end, ActiveConsumers, all_ch_record())).
+ fun ({ChPid, #consumer{tag = CTag, ack_required = AckRequired}}, Acc1) ->
+ [{ChPid, CTag, AckRequired} | Acc1]
+ end, Acc, Consumers).
emit_stats(State) ->
emit_stats(State, []).