[infinispan-issues] [JBoss JIRA] (ISPN-7526) Write skew check throws even if the previous value was not read

Radim Vansa (JIRA) issues at jboss.org
Fri Feb 24 12:33:00 EST 2017


    [ https://issues.jboss.org/browse/ISPN-7526?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13369154#comment-13369154 ] 

Radim Vansa commented on ISPN-7526:
-----------------------------------

[~dan.berindei] I think that write skew check should check that *preconditions* of the transaction did not changed, rather than any concurrent update to the value. If the transactions were serialized, the update could happen just before the transaction starts/read is executed.

However, the situation is even worse when the key is non-local: this test fails:
{code:java}
final Object key = new MagicKey("ignore-return-value", cache(0));
final AdvancedCache<Object, Object> c = advancedCache(1);
final TransactionManager tm = tm(1);

cache(0).put(key, "init");

tm.begin();
c.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES).put(key, "v1");
c.replace(key, "v1", "v2");
tm.commit(); // throws WSCE
{code}
because the replace command is not forced to retrieve the remote entry (the value is already cached in context). Therefore, the seen version for WSC is a non-existent version, which does not match the actual version.

There are two ways to fix this: a) don't do the check as we haven't seen any version b) force remote read with {{IGNORE_RETURN_VALUES}} if the entry is not yet in the context.

> Write skew check throws even if the previous value was not read
> ---------------------------------------------------------------
>
>                 Key: ISPN-7526
>                 URL: https://issues.jboss.org/browse/ISPN-7526
>             Project: Infinispan
>          Issue Type: Bug
>          Components: Core, Transactions
>    Affects Versions: 9.0.0.CR2, 8.2.6.Final
>            Reporter: Radim Vansa
>            Assignee: Radim Vansa
>
> When the entry was overwritten without reading previous value and then we read it (this read is handled from the current context), write skew check is still applied and can fail, despite that it's unnecessary.
> {code:java}
> cache.put("k", "init");
> tm.begin();
> cache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES).put("k", "v1");
> assertEquals("v1", cache.put("k", "v2"));
> Transaction tx = tm.suspend();
> assertEquals("init", cache.put("k", "other"));
> tm.resume(tx);
> tm.commit(); // fails with WriteSkewCheckException
> {code}



--
This message was sent by Atlassian JIRA
(v7.2.3#72005)


More information about the infinispan-issues mailing list