ETS: update list value without race condition

Frank Muller frank.muller.erl@REDACTED
Thu Apr 22 14:18:11 CEST 2021


Sverker,

The doc states there is a full table scan :-(

Is it possible to specify the Key in the match spec to avoid the table scan?

ets:select_replace(T, [{Old, [], [{const, New}]}])),


> It seems ets:select_replace could be your solution.
>
>
>
> The documentation contains this example usage to do a compare-and-swap for
> a single key:
>
>
>
> [Old] = ets:lookup(T, Key),
>
> New = update_object(Old),
>
> Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
>
>
>
> /Sverker
>
>
>
> *From:* erlang-questions <erlang-questions-bounces@REDACTED> *On Behalf
> Of *Frank Muller
> *Sent:* den 22 april 2021 13:32
> *To:* Erlang-Questions Questions <erlang-questions@REDACTED>
> *Subject:* ETS: update list value without race condition
>
>
>
> Hi guys
>
>
>
> I’ve a little issue I’m unable to solve with the current ETS API.
>
>
>
> My table is of type set. Keys are integers and values are list of names:
>
> 123 -> [ jane, john, bob ]
>
> 456 -> [ joe, alice ]
>
>>
>
>
> Process A with Key=123 wants to delete ‘Jane’ while process B with Key=123
> wants to add ‘Adam’.
>
>
>
> First, they both needs to read the value associated with Key=123, update
> that list accordingly and set back the new value.
>
>
>
> But this lead to race condition (ex. process B could put back ‘jane’ -
> last write wins).
>
>
>
> Could this problem be solved atomically without involving explicit locking
> per Key?
>
>
>
> Is there any other better way to represent this data set which will not
> suffer from the race condition?
>
>
>
> Thanks
>
> /Frank
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20210422/96e92ef1/attachment.htm>


More information about the erlang-questions mailing list