summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniil Fedotov <hairyhum@gmail.com>2019-06-04 14:08:40 -0400
committerDaniil Fedotov <hairyhum@gmail.com>2019-06-04 14:08:40 -0400
commite5fd6b64c2aa7f82cc0213bea18c909dfbd741d4 (patch)
tree8b726c16fc1b200fd7404426354d314d846c20de
parent15ce27ae8e19682e64ba1adaed8f6ce39e91bc2e (diff)
downloadrabbitmq-server-git-e5fd6b64c2aa7f82cc0213bea18c909dfbd741d4.tar.gz
Reject a message before discarding it from BQ.
discard/4 confirms a message, which can cause races between confirms and rejects.
-rw-r--r--src/rabbit_amqqueue_process.erl13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl
index 2666847e77..fbab825c76 100644
--- a/src/rabbit_amqqueue_process.erl
+++ b/src/rabbit_amqqueue_process.erl
@@ -801,14 +801,21 @@ maybe_drop_head(AlreadyDropped, State = #q{backing_queue = BQ,
end.
send_reject_publish(#delivery{confirm = true,
- sender = SenderPid,
- msg_seq_no = MsgSeqNo} = Delivery,
+ sender = SenderPid,
+ flow = Flow,
+ msg_seq_no = MsgSeqNo,
+ message = #basic_message{id = MsgId}},
_Delivered,
State = #q{ backing_queue = BQ,
backing_queue_state = BQS,
msg_id_to_channel = MTC}) ->
- {BQS1, MTC1} = discard(Delivery, BQ, BQS, MTC),
gen_server2:cast(SenderPid, {reject_publish, MsgSeqNo, self()}),
+
+ MTC1 = case gb_trees:is_defined(MsgId, MTC) of
+ true -> gb_trees:delete(MsgId, MTC);
+ false -> MTC
+ end,
+ BQS1 = BQ:discard(MsgId, SenderPid, Flow, BQS),
State#q{ backing_queue_state = BQS1, msg_id_to_channel = MTC1 };
send_reject_publish(#delivery{confirm = false},
_Delivered, State) ->