[erlang-questions] dialyzer: possible race condition with insert after lookup

Joel Reymont joelr1@REDACTED
Sun Oct 23 20:00:51 CEST 2011

Consider this piece of code

handle_cast({bump, Key, Value}, Data) ->
    %% cannot update counter on a non-existing record,
    %% so a lookup cannot be avoided
    _ = case ets:lookup(stats, Key) of
            [] -> ets:insert(stats, [{Key, now(), count, Value}]);
            _  -> ets:update_counter(stats, Key, {4, Value})
    {noreply, Data};

Dialyzer reports that 

stats.erl:150: The call ets:insert('stats',[{_,{non_neg_integer(),non_neg_integer(),non_neg_integer()},'count',_},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('stats',Key::any()) call in stats.erl on line 149

What is the proper way to fix this?

	Thanks, Joel

- for hire: mac osx device driver ninja, kernel extensions and usb drivers
http://wagerlabs.com | @wagerlabs | http://www.linkedin.com/in/joelreymont

More information about the erlang-questions mailing list