Bug in mnesia:dirty_update_counter

Thomas Johnsson XA (LN/EAB) thomas.xa.johnsson@REDACTED
Thu Mar 10 08:38:32 CET 2005

> I could then replace
>  case catch ets:update_counter(Tab, Key, Incr) of
>     {'EXIT',_} -> ets:insert(Tab, {Key, Incr}), Incr;
>     N -> N
>  end

While update_counter is atomic & thread-safe if the key is already in the table,
the above is not thread safe: two or more processes
might simultaneously do the ets:update_counter, get 'EXIT', and insert....

A thread-safe version which takes into account that the key does not exist
previously in the table, should use ets:insert_new (new as of R10 ?) :

case ets:insert_new(Tab, {Key, Incr}) of
   true  -> Incr; %% really was new key, insert succeeded
   false -> ets:update_counter(Tab, Key, Incr)

If there's many simultaneous insert_new s, only one will success,
the others perform update_counter.

-- Thomas

More information about the erlang-questions mailing list