diff --git a/src/ra_mt.erl b/src/ra_mt.erl index df25476e..bfea116b 100644 --- a/src/ra_mt.erl +++ b/src/ra_mt.erl @@ -155,10 +155,15 @@ commit(#?MODULE{tid = Tid, commit(Prev0) end, Staged = lists:reverse(Staged0), - true = ets:insert(Tid, Staged), - %% TODO: mt: could prev contain overwritten entries? - {PrevStaged ++ Staged, State#?MODULE{staged = undefined, - prev = Prev}}. + case catch ets:insert(Tid, Staged) of + true -> + %% TODO: mt: could prev contain overwritten entries? + {PrevStaged ++ Staged, State#?MODULE{staged = undefined, + prev = Prev}}; + {'EXIT', {badarg, _}} -> + {[], State#?MODULE{staged = undefined, + prev = Prev}} + end. -spec abort(state()) -> state(). abort(#?MODULE{staged = undefined} = State) -> diff --git a/test/ra_mt_SUITE.erl b/test/ra_mt_SUITE.erl index 4aff51ef..4ef05799 100644 --- a/test/ra_mt_SUITE.erl +++ b/test/ra_mt_SUITE.erl @@ -34,6 +34,7 @@ all_tests() -> stage_commit, range_overlap, stage_commit_abort, + commit_after_table_deleted, perf ]. @@ -468,6 +469,25 @@ perf(_Config) -> ok. +commit_after_table_deleted(_Config) -> + Tid = ets:new(t1, [set, public]), + Mt0 = ra_mt:init(Tid), + + %% Stage some entries + {ok, Mt1} = ra_mt:stage({1, 1, <<"data1">>}, Mt0), + {ok, Mt2} = ra_mt:stage({2, 1, <<"data2">>}, Mt1), + + %% Simulate table deletion + true = ets:delete(Tid), + + %% Should return empty list since table is deleted + {Entries, _Mt3} = ra_mt:commit(Mt2), + + %% Should return empty entries since table was deleted + ?assertEqual([], Entries), + + ok. + %%% Util