]
Tristan Tarrant updated ISPN-4972:
----------------------------------
Assignee: Galder ZamarreƱo
Two concurrent replaceWithVersions may both succeed
---------------------------------------------------
Key: ISPN-4972
URL:
https://issues.jboss.org/browse/ISPN-4972
Project: Infinispan
Issue Type: Bug
Components: Remote Protocols
Affects Versions: 7.0.0.Final
Reporter: Radim Vansa
Assignee: Galder ZamarreƱo
Cache contains entry {{K = V}}. Two concurrent threads, that execute:
{code}
long version = cache.getVersioned(K).getVersion();
boolean succeeded = cache.replaceWithVersion(K, V, version);
{code}
Both of these threads can get {{succeeded = true}}.
Reason:
When the server receives the operation ReplaceIfUnmodified=replaceWithVersion, it
retrieves the entry (key + value + metadata) from the cache and checks that the version
stored (in metadata) is the same as the version in the request. If so, it creates
conditional ReplaceCommand which contains the value (retrieved atomically with version
from the cache) and executes this one. Therefore, as the value is in both requests
identical (and is not changed by the replace), two concurrent ReplaceCommands can both
succeed, and this value is returned to the HotRod client.