summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2013-01-06 05:33:26 +0000
committerMatthias Radestock <matthias@rabbitmq.com>2013-01-06 05:33:26 +0000
commitd6376fbdbed5b36dc435cddc99a7beaa18dbe4f2 (patch)
tree88387f29edbebbb5618d5d2ec3aa2c6240892b2c /src
parent32a50f9cebbc31b7b2a8bac295563ab9ad1907fa (diff)
downloadrabbitmq-server-git-d6376fbdbed5b36dc435cddc99a7beaa18dbe4f2.tar.gz
optimise ack collection
for the common case of ack'ing/reject'ing the oldest tag
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_channel.erl12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl
index 68625dbf31..2686d76d9c 100644
--- a/src/rabbit_channel.erl
+++ b/src/rabbit_channel.erl
@@ -1245,19 +1245,25 @@ record_sent(ConsumerTag, AckRequired,
collect_acks(Q, 0, true) ->
{queue:to_list(Q), queue:new()};
collect_acks(Q, DeliveryTag, Multiple) ->
- collect_acks([], queue:new(), Q, DeliveryTag, Multiple).
+ collect_acks([], [], Q, DeliveryTag, Multiple).
collect_acks(ToAcc, PrefixAcc, Q, DeliveryTag, Multiple) ->
case queue:out(Q) of
{{value, UnackedMsg = {CurrentDeliveryTag, _ConsumerTag, _Msg}},
QTail} ->
if CurrentDeliveryTag == DeliveryTag ->
- {[UnackedMsg | ToAcc], queue:join(PrefixAcc, QTail)};
+ {[UnackedMsg | ToAcc],
+ case PrefixAcc of
+ [] -> QTail;
+ _ -> queue:join(
+ queue:from_list(lists:reverse(PrefixAcc)),
+ QTail)
+ end};
Multiple ->
collect_acks([UnackedMsg | ToAcc], PrefixAcc,
QTail, DeliveryTag, Multiple);
true ->
- collect_acks(ToAcc, queue:in(UnackedMsg, PrefixAcc),
+ collect_acks(ToAcc, [UnackedMsg | PrefixAcc],
QTail, DeliveryTag, Multiple)
end;
{empty, _} ->