summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandru Scvortov <alexandru@rabbitmq.com>2010-10-04 10:35:21 +0100
committerAlexandru Scvortov <alexandru@rabbitmq.com>2010-10-04 10:35:21 +0100
commitf1bf011088aa96c6643ef7c7112a4a57861da922 (patch)
tree82f51d4b2b20630ef5cde4e6188ed7b97fd58162
parentc7d1d1403cfddd7f9b75f32bea27fb168d672d3b (diff)
downloadrabbitmq-server-git-f1bf011088aa96c6643ef7c7112a4a57861da922.tar.gz
only confirm immediate messages if they haven't been delivered
-rw-r--r--src/rabbit_amqqueue_process.erl14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl
index 7723d7229e..5b31c8ce79 100644
--- a/src/rabbit_amqqueue_process.erl
+++ b/src/rabbit_amqqueue_process.erl
@@ -699,7 +699,8 @@ handle_call(consumers, _From,
[{ChPid, ConsumerTag, AckRequired} | Acc]
end, [], queue:join(ActiveConsumers, BlockedConsumers)), State);
-handle_call({deliver_immediately, Delivery}, _From, State) ->
+handle_call({deliver_immediately, Delivery = #delivery{message = Msg}}
+ , _From, State) ->
%% Synchronous, "immediate" delivery mode
%%
%% FIXME: Is this correct semantics?
@@ -713,10 +714,13 @@ handle_call({deliver_immediately, Delivery}, _From, State) ->
%% just all ready-to-consume queues get the message, with unready
%% queues discarding the message?
%%
- {Delivered, NewState} = attempt_delivery(Delivery, State),
- reply(Delivered,
- confirm_message(Delivery#delivery.message#basic_message.guid,
- record_confirm_message(Delivery, NewState)));
+ State1 = record_confirm_message(Delivery, State),
+ {Delivered, State2} = attempt_delivery(Delivery, State1),
+ State3 = case Delivered of
+ true -> State2,
+ false -> confirm_message(Msg#basic_message.guid, State2)
+ end,
+ reply(Delivered, State3);
handle_call({deliver, Delivery}, _From, State) ->
%% Synchronous, "mandatory" delivery mode