]
William Burns updated ISPN-4286:
--------------------------------
Fix Version/s: 9.0.0.Beta1
(was: 9.0.0.Alpha4)
Two concurrent putIfAbsent operations can both return null during
rebalance
---------------------------------------------------------------------------
Key: ISPN-4286
URL:
https://issues.jboss.org/browse/ISPN-4286
Project: Infinispan
Issue Type: Bug
Components: Core, State Transfer
Affects Versions: 6.0.2.Final
Reporter: Dan Berindei
Assignee: Dan Berindei
Priority: Critical
Fix For: 9.0.0.Beta1
If the cache topology changes while executing a putIfAbsent operation, the old primary
owner will throw an OutdatedTopologyException, and the originator will retry on the new
owner.
When retrying the PutKeyValueCommand on the new primary owner, we compare the current
value with the command's new value. If they are equal, we assume that the initial
command wrote the old value, and we return {{null}}.
However, the value might have been written by another putIfAbsent operation. So we could
have two {{putIfAbsent(k, v)}} operations, both returning {{null}}.
{code}
A is the originator, B is the primary owner, k = null
A -> B: putIfAbsent(k, v1)
B dies before writing v, C is now primary owner
D -> C: putIfAbsent(k, v1) // another put operation from D, with the same value
C -> D: null // correct
A -> C: retry_putIfAbsent(k, v1)
C -> A: null // C assumes A is overwriting its own value, so it's also returning
null
{code}