Skip to content

Commit 83bb7f0

Browse files
committed
QQ: handle missing_key crash for appended segments.
If a channel/session process has opened a segment that later was appended to the index maintained in memory does not know of the newly appended entries and thus would generate a missing_key error.
1 parent e5c0afd commit 83bb7f0

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

deps/rabbit/src/rabbit_fifo.erl

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3016,9 +3016,19 @@ incr_msg(Msg0, DelFailed, Anns) ->
30163016
end.
30173017

30183018
exec_read(Flru0, ReadPlan, Msgs) ->
3019-
{Entries, Flru} = ra_log_read_plan:execute(ReadPlan, Flru0),
3020-
%% return a list in original order
3021-
{lists:map(fun ({MsgId, ?MSG(Idx, Header)}) ->
3022-
Cmd = maps:get(Idx, Entries),
3023-
{MsgId, {Header, get_msg(Cmd)}}
3024-
end, Msgs), Flru}.
3019+
try ra_log_read_plan:execute(ReadPlan, Flru0) of
3020+
{Entries, Flru} ->
3021+
%% return a list in original order
3022+
{lists:map(fun ({MsgId, ?MSG(Idx, Header)}) ->
3023+
Cmd = maps:get(Idx, Entries),
3024+
{MsgId, {Header, get_msg(Cmd)}}
3025+
end, Msgs), Flru}
3026+
catch exit:{missing_key, _}
3027+
when Flru0 =/= undefined ->
3028+
%% this segment has most likely been appended to but the
3029+
%% cached index doesn't know about new items and need to be
3030+
%% re-generated
3031+
_ = ra_flru:evict_all(Flru0),
3032+
%% retry without segment cache
3033+
exec_read(undefined, ReadPlan, Msgs)
3034+
end.

0 commit comments

Comments
 (0)