Skip to content

Commit be2e546

Browse files
committed
Handle missing delivery marker in CQ v1 index
This can happen when a classic queue has messages published on a pre-3.10 RabbitMQ version, but still present after an upgrade to 3.10+. Fixes #7904
1 parent a59c2b5 commit be2e546

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

deps/rabbit/src/rabbit_queue_index.erl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,10 @@ action_to_entry(RelSeq, Action, JEntries) ->
952952
({no_pub, del, no_ack}) when Action == ack ->
953953
{set, {no_pub, del, ack}};
954954
({?PUB, del, no_ack}) when Action == ack ->
955+
{reset, none};
956+
%% Special case, missing del
957+
%% See journal_minus_segment1/2
958+
({?PUB, no_del, no_ack}) when Action == ack ->
955959
{reset, none}
956960
end.
957961

@@ -1342,6 +1346,11 @@ segment_plus_journal1({?PUB = Pub, no_del, no_ack}, {no_pub, del, no_ack}) ->
13421346
segment_plus_journal1({?PUB, no_del, no_ack}, {no_pub, del, ack}) ->
13431347
{undefined, -1};
13441348
segment_plus_journal1({?PUB, del, no_ack}, {no_pub, no_del, ack}) ->
1349+
{undefined, -1};
1350+
1351+
%% Special case, missing del
1352+
%% See journal_minus_segment1/2
1353+
segment_plus_journal1({?PUB, no_del, no_ack}, {no_pub, no_del, ack}) ->
13451354
{undefined, -1}.
13461355

13471356
%% Remove from the journal entries for a segment, items that are
@@ -1413,6 +1422,16 @@ journal_minus_segment1({no_pub, no_del, ack}, {?PUB, del, no_ack}) ->
14131422
journal_minus_segment1({no_pub, no_del, ack}, {?PUB, del, ack}) ->
14141423
{undefined, -1};
14151424

1425+
%% Just ack in journal, missing del
1426+
%% Since 3.10 message delivery is tracked per-queue, not per-message,
1427+
%% but to keep queue index v1 format messages are always marked as
1428+
%% delivered on publish. But for a message that was published before
1429+
%% 3.10 this is not the case and the delivery marker can be missing.
1430+
%% As a workaround we add the del marker because if a message is acked
1431+
%% it must have been delivered as well.
1432+
journal_minus_segment1({no_pub, no_del, ack}, {?PUB, no_del, no_ack}) ->
1433+
{{no_pub, del, ack}, 0};
1434+
14161435
%% Deliver and ack in journal
14171436
journal_minus_segment1({no_pub, del, ack}, {?PUB, no_del, no_ack}) ->
14181437
{keep, 0};

0 commit comments

Comments
 (0)