]
Dan Berindei commented on ISPN-7820:
------------------------------------
[~rvansa] a thread can read a value from the cache and store it somewhere else, so
modifying cache values in-place can affect any previous reader, not just concurrent ones.
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
Fix For: 9.1.0.CR1
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}