ETS: update list value without race condition

Frank Muller frank.muller.erl@REDACTED
Thu Apr 22 14:08:25 CEST 2021


Can’t see how the bag type can help with concurrent update Jesper.

I still need a read, update followed by a write.
Am I wrong?


> Another path is to figure out if the ETS type 'bag' is more suitable in
> your situation.
>
> On Thu, Apr 22, 2021 at 1:46 PM Sverker Eriksson <
> sverker.eriksson@REDACTED> wrote:
>
>> 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
>>
>
>
> --
> J.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20210422/0a37f8da/attachment.htm>


More information about the erlang-questions mailing list