From e052249e6ce4da0c6a022bb8da0186cd678e1054 Mon Sep 17 00:00:00 2001 From: Daniil Fedotov Date: Fri, 29 Jun 2018 14:54:32 -0400 Subject: Fix delete_object and write convergence in transaction. Fix a bug, when delete_object was deleting the record if it was written in the same transaction even if it was written to a different value. To verify: %% Create a set table mnesia:create_table(foo, []). %% Write and delete_object in transaction mnesia:transaction(fun() -> mnesia:write({foo, bar, one}), mnesia:delete_object({foo, bar, not_one}) end). {atomic, [{foo, bar, one}]} = mnesia:transaction(fun() -> mnesia:read(foo, bar) end). Added a section to isolation tests to check for non-matching delete_object requests. --- lib/mnesia/src/mnesia.erl | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'lib/mnesia/src') diff --git a/lib/mnesia/src/mnesia.erl b/lib/mnesia/src/mnesia.erl index e298904e2a..df3a2dfe6f 100644 --- a/lib/mnesia/src/mnesia.erl +++ b/lib/mnesia/src/mnesia.erl @@ -779,12 +779,16 @@ do_delete_object(Tid, Ts, Tab, Val, LockKind) -> ?ets_insert(Store, {Oid, Val, delete_object}); _ -> case ?ets_match_object(Store, {Oid, '_', write}) of - [] -> - ?ets_match_delete(Store, {Oid, Val, '_'}), - ?ets_insert(Store, {Oid, Val, delete_object}); - _ -> - ?ets_delete(Store, Oid), - ?ets_insert(Store, {Oid, Oid, delete}) + [] -> + ?ets_match_delete(Store, {Oid, Val, '_'}), + ?ets_insert(Store, {Oid, Val, delete_object}); + Ops -> + case lists:member({Oid, Val, write}, Ops) of + true -> + ?ets_delete(Store, Oid), + ?ets_insert(Store, {Oid, Oid, delete}); + false -> ok + end end end, ok; -- cgit v1.2.3