[rabbitmq-discuss] Race condition when acknowledging messages?

Roger Hu rhu at hearsaycorp.com
Mon Jun 16 21:57:33 BST 2014


We are running RabbitMQ v3.3.1 and librabbitmq v1.5.2 and have noticed that 
our client is periodically getting these exceptions:

ChannelError: channel error 406, message: PRECONDITION_FAILED - unknown 
delivery tag 704117

We have a dedicated separate connection and channel setup to receive the 
message and ack it back immediately.     We notice that the delivery tag of 
the same as the one we're
trying to acknowledge back, so this tag ID appears to be consistent and one 
that RMQ should know about.  However, it appears to trigger a 
PRECONDITION_FAILED, making us think
we made a duplicate ACK acknowledgment somewhere.  We have placed logging 
statements to centralize all message acknowledgments and only see one ACK, 
confirming our belief
that it is a single ACK being made.

We noticed in this code 
(https://github.com/rabbitmq/rabbitmq-server/blob/master/src/rabbit_channel.erl#L741-750) 
that the record of the note being
sent is handled by the rabbit_writer process.

            ok = rabbit_writer:send_command(
                   WriterPid,
                   #'basic.get_ok'{delivery_tag  = DeliveryTag,
                                   redelivered   = Redelivered,
                                   exchange      = ExchangeName#resource.name,
                                   routing_key   = RoutingKey,
                                   message_count = MessageCount},
                   Content),
            State1 = monitor_delivering_queue(NoAck, QPid, QName, State),
            {noreply, record_sent(none, not(NoAck), Msg, State1)};


 However, the delivery tag information appears to get record later 
in https://github.com/rabbitmq/rabbitmq-server/blob/master/src/rabbit_channel.erl#L1380-1384:

   true  -> queue:in({DeliveryTag, ConsumerTag, {QPid, MsgId}},
                                  UAMQ);


Our current workaround is to delay acknowledging the message instead of 
trying to ack it right away.  The problem shows up intermittently, possibly 
when there are large queue volumes on the RMQ box and possibly when we 
start to queue up 50-60K unacknowledged messages, which may cause issues 
for the delivery tag to be added to the unacked list (UAMQ).

Is it possible there is a race condition in which the delivery tag received 
by the client has yet to be recorded?    Again, the problem happens 
intermittently but would like to suggest changing the code to record the 
delivery tag (in record_sent() before dispatching rabbit_writer.  

Would appreciate any thoughts about changing the code to add the message 
before responding back to the writer.

Thanks,

Roger
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/attachments/20140616/e2a373e9/attachment.html>


More information about the rabbitmq-discuss mailing list