[infinispan-issues] [JBoss JIRA] (ISPN-11167) Retrying transactions after WriteSkewException should be easier

Tristan Tarrant (Jira) issues at jboss.org
Mon Jun 15 03:56:14 EDT 2020


     [ https://issues.redhat.com/browse/ISPN-11167?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Tristan Tarrant updated ISPN-11167:
-----------------------------------
    Fix Version/s: 12.0.0.Final
                       (was: 11.0.0.Final)


> Retrying transactions after WriteSkewException should be easier
> ---------------------------------------------------------------
>
>                 Key: ISPN-11167
>                 URL: https://issues.redhat.com/browse/ISPN-11167
>             Project: Infinispan
>          Issue Type: Bug
>          Components: Core, Documentation
>    Affects Versions: 10.1.0.Final
>            Reporter: Dan Berindei
>            Priority: Major
>             Fix For: 12.0.0.Final
>
>
> I've added the documentation tag because we "know" users of optimistic transactions
> should catch {{WriteSkewException}}s and retry, but the user guide never explains how a user should do it.
> It turns out the exception tree is really complicated:
> {noformat}
> javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
> 	at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1299)	Suppressed: javax.transaction.xa.XAException
> 		at org.infinispan.transaction.impl.TransactionCoordinator.prepare(TransactionCoordinator.java:143)
>     Caused by: org.infinispan.remoting.RemoteException: ISPN000217: Received exception from ...
> 		at org.infinispan.remoting.transport.ResponseCollectors.wrapRemoteException(ResponseCollectors.java:25)
> 		Suppressed: org.infinispan.util.logging.TraceException
> 			at org.infinispan.interceptors.impl.SimpleAsyncInvocationStage.get(SimpleAsyncInvocationStage.java:39)
> 	Caused by: org.infinispan.transaction.WriteSkewException: Write skew detected on key ...
> 		at org.infinispan.marshall.exts.ThrowableExternalizer.readObject(ThrowableExternalizer.java:257)
> {noformat}
> Part of the problem is internal: we shouldn't wrap {{WriteSkewException}} in a {{RemoteException}}.
> The other part is harder to control: Narayana makes our {{XAException}} a suppressed exception instead of a cause,
> probably because in the general case multiple XA resources could fail to prepare.
> Initially I thought the XAException was suppressed because Narayana committed the transaction in one phase,
> but I disabled {{CoordinatorEnvironmentBean.commitOnePhase}} and it's still suppressed.
> OTOH the exception tree could be much simpler with {{useSynchronization(true)}},
> if it weren't for our own gratuitous wrapping:
> {noformat}
> javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
> 	at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1299)
> Caused by: org.infinispan.commons.CacheException: Could not prepare.
> 	at org.infinispan.transaction.impl.TransactionTable.beforeCompletion(TransactionTable.java:898)
> Caused by: javax.transaction.xa.XAException
> 	at org.infinispan.transaction.impl.TransactionCoordinator.prepare(TransactionCoordinator.java:143)
> Caused by: org.infinispan.remoting.RemoteException: ISPN000217: Received exception from ...
> 	at org.infinispan.remoting.transport.ResponseCollectors.wrapRemoteException(ResponseCollectors.java:25)
> 	Suppressed: org.infinispan.util.logging.TraceException
> 		at org.infinispan.interceptors.impl.SimpleAsyncInvocationStage.get(SimpleAsyncInvocationStage.java:39)
> Caused by: org.infinispan.transaction.WriteSkewException: Write skew detected on key ...
> 	at org.infinispan.marshall.exts.ThrowableExternalizer.readObject(ThrowableExternalizer.java:257)
> {noformat}
> We could remove the {{CacheException}}, the {{XAException}}, and the {{RemoteException}},
> leaving just a {{RollbackException}} caused by a {{WriteSkewException}}.
> For implicit transactions we add yet another wrapper:
> sync operations wrap the {{RollbackException}} in a {{CacheException}},
> async operations wrap it in a {{CompletionException}}.
> We could instead check if the exception is caused by a {{WriteSkewException}} and unwrap it.
> We should definitely add a helper static method for the users to check if they should retry the transaction,
> something like {{CacheTransactions.isWriteSkew(RollbackException)}}, 
> and we should change the write skew to use it.
> Currently they are content to catch a {{RollbackException}} and assume it has a {{WriteSkewException}} inside.
> We should also add a {{useSynchronization}} parameter to {{AbstractClusteredWriteSkewTest}} and all the write skew tests.



--
This message was sent by Atlassian Jira
(v7.13.8#713008)


More information about the infinispan-issues mailing list