owensgroup / SlabHash

A warp-oriented dynamic hash table for GPUs

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Race condition on InsertPairUnique can result in duplicates of the same key

huntermBerkeley opened this issue · comments

There is a race condition in the table when insertions and deletions occur concurrently.

This occurs when multiple unique insertions of the same key have a deletion interleaved between them, resulting in the inserting warps disagreeing on the correct position for insertion.

For a simple walkthrough consider a bucket currently storing one key A in slot 0, so the bucket is [A,empty].

Thread one is inserting key B and observes the bucket as [A,empty]. From this it determines slot 1 is the correct slot for insertion.

A different thread deletes A and frees slot 0, resulting in [empty, empty].

A third thread also inserts B. It observes the bucket as [empty, empty] and determines slot 0 as the correct slot.

Finally, both threads sucessfully CAS with empty_pair_64 and insert their keys. Neither thread observed the operation of the other but the final result in the bucket is [B,B] which is disallowed by insertPairUnique.

This also appears to be an issue if a key exists later in the chain, as the insertion will proceed if an empty slot exists in previous buckets in the chain despite a duplicate existing. Is this the expected behavior?