[erlang-questions] Design question -- a valid or foolhardy approach to ets update?

Sverker Eriksson sverker@REDACTED
Tue Jul 14 17:00:13 CEST 2009


Ulf Wiger wrote:
> Note also that update_counter() requires the key to already
> exist in the table. Try to find a good place to initially
> create the counter. Otherwise, a fairly common pattern is:
>
> update_counter(Key, Incr) ->
>    try ets:update_counter(?tab, Key, {#counter.value, Incr})
>    catch
>       error:_ -> init_counter(Key, Incr)
>    end.
>
> init_counter(Key, Incr) ->
>    true = ets:insert_new(?tab, #counter{key = Key, value = Incr}),
>    Incr.
>
> ...but this obviously messes with atomicity.
>
I think you will be "safe" as long as you catch the unlikely race when 
insert_new fails:

init_counter(Key, Incr) ->
    case ets:insert_new(?tab, #counter{key = Key, value = Incr}) of
        true -> Incr;
        false -> update_counter(Key, Incr)
    end.


/Sverker, Erlang/OTP



More information about the erlang-questions mailing list