diff options
| author | Matthias Radestock <matthias@rabbitmq.com> | 2013-01-06 05:33:26 +0000 |
|---|---|---|
| committer | Matthias Radestock <matthias@rabbitmq.com> | 2013-01-06 05:33:26 +0000 |
| commit | d6376fbdbed5b36dc435cddc99a7beaa18dbe4f2 (patch) | |
| tree | 88387f29edbebbb5618d5d2ec3aa2c6240892b2c /src | |
| parent | 32a50f9cebbc31b7b2a8bac295563ab9ad1907fa (diff) | |
| download | rabbitmq-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.erl | 12 |
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, _} -> |
