]
Radim Vansa commented on ISPN-7820:
-----------------------------------
In fact this has to be handled in user code and we should just add a warning to the docs;
both to functional API and to compute*. Otherwise, we would have to create a defensive
copy even for reads (because we can't guarantee that the should-be-read-only function
won't access the value in modifying way) and that would result in excessive overhead.
Uncommitted functional command modifies value
---------------------------------------------
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}