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
commit78377bc08a5674a8e051caa17ecfb72c8a12eaa3 (patch)
tree82f51d4b2b20630ef5cde4e6188ed7b97fd58162
parentf4c642ab2985c94531e0794658e56336965edf09 (diff)
downloadrabbitmq-server-78377bc08a5674a8e051caa17ecfb72c8a12eaa3.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 7723d722..5b31c8ce 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