]
Radim Vansa commented on ISPN-7820:
-----------------------------------
Actually it is a problem for non-transactional commands as well: since we may have
concurrent readers and writers, without internal synchronization the concurrent operation
could be processed concurrently.
Besides, if there's a retry operation, we'd be modifying the collection twice (and
version history wouldn't help us).
Document store-by-reference effects in functional commands
----------------------------------------------------------
Key: ISPN-7820
URL:
https://issues.jboss.org/browse/ISPN-7820
Project: Infinispan
Issue Type: Bug
Components: Core, Test Suite - Core, Transactions
Affects Versions: 9.0.0.Final
Reporter: Radim Vansa
Assignee: Radim Vansa
In transactional mode, functional read write command loads the value into the context
without making a defensive copy. Then, the function is applied directly on that value,
exposing uncommitted changes to all other threads. Rollback is ineffective, the value is
already changed.
There are no tests for rollback in FunctionalTxInMemoryTest.
Reproducer:
{code:java}
@Test
public void testValueInContextIsACopy() throws Exception {
Object key = getKeyForCache(cache(0, DIST), cache(1, DIST));
cache(0, DIST).put(key, new ArrayList());
tm.begin();
// nasty cast
FunctionalMap.ReadWriteMap<Object, List> otherRw =
(FunctionalMap.ReadWriteMap) rw;
otherRw.eval(key, (Serializable &
Function<EntryView.ReadWriteEntryView<Object, List>, Object>) view -> {
List list = view.get();
list.add("woohoo");
view.set(list);
return null;
}).join();
tm.rollback();
assertEquals(new ArrayList(), cache(0, DIST).get(key));
}
{code}