0

I have Infinispan 9.4 and this settings in infinispan.xml:

<local-cache name="localCache">
  <locking isolation="READ_COMMITTED"/>
  <transaction mode="BATCH"/>
  <memory>
     <object strategy="NONE"/>
  </memory>
</local-cache>

and when i try to add new value in this cache in the transaction but in the beforeCompletion phase

tx.registerSynchronization(new Synchronization()
{
...

public void beforeCompletion()
{
  cache.put(CACHE_KEY, value);
}

...
}

i got this exception:

...

at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76) ~[jbossjts-4.16.6.Final.jar:?]
    at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:273) ~[jbossjts-4.16.6.Final.jar:?]
    at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:93) ~[jbossjts-4.16.6.Final.jar:?]
    at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:164) ~[jbossjts-4.16.6.Final.jar:?]
    at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1165) ~[jbossjts-4.16.6.Final.jar:?]
    at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:117) ~[jbossjts-4.16.6.Final.jar:?]`

...

ERROR impl.InvocationContextInterceptor - ISPN000136: Error executing command PutKeyValueCommand on Cache 'localCache', writing keys [storage] 

java.lang.UnsupportedOperationException: null
    at org.infinispan.commons.util.ImmutableListCopy.add(ImmutableListCopy.java:124) ~[infinispan-commons-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.transaction.impl.LocalTransaction.addModification(LocalTransaction.java:66) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.impl.TxInterceptor.lambda$handleWriteCommand$8(TxInterceptor.java:414) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndFinally(BaseAsyncInterceptor.java:165) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.impl.TxInterceptor.handleWriteCommand(TxInterceptor.java:402) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.impl.TxInterceptor.visitPutKeyValueCommand(TxInterceptor.java:235) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:73) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:56) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.impl.CacheMgmtInterceptor.updateStoreStatistics(CacheMgmtInterceptor.java:217) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.impl.CacheMgmtInterceptor.visitPutKeyValueCommand(CacheMgmtInterceptor.java:182) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:73) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndExceptionally(BaseAsyncInterceptor.java:125) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.impl.InvocationContextInterceptor.visitCommand(InvocationContextInterceptor.java:90) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:58) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.impl.BatchingInterceptor.handleDefault(BatchingInterceptor.java:69) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.impl.BatchingInterceptor.visitPutKeyValueCommand(BatchingInterceptor.java:49) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:73) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.DDAsyncInterceptor.visitCommand(DDAsyncInterceptor.java:50) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.interceptors.impl.AsyncInterceptorChainImpl.invoke(AsyncInterceptorChainImpl.java:248) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.cache.impl.CacheImpl.executeCommandAndCommitIfNeeded(CacheImpl.java:1915) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.cache.impl.CacheImpl.put(CacheImpl.java:1430) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.cache.impl.CacheImpl.put(CacheImpl.java:2040) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.cache.impl.CacheImpl.put(CacheImpl.java:230) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.cache.impl.AbstractDelegatingCache.put(AbstractDelegatingCache.java:448) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
    at org.infinispan.cache.impl.EncoderCache.put(EncoderCache.java:729) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Fina

i checked - if i do it without a beforeCompletion phase - it's ok.

But i need execute this in this phase - how i can fix it?

1 Answers1

2

What is happening is that your cache is transactional and by invoking put() inside beforeCompletion(), Infinispan will try to register itself within the transaction. At this time, the transaction is preparing and modifications are not accepted.

You need to configure your cache as nontransactional by setting <transaction mode="NONE"/>.

If you need your cache to be transactional, you need to suspend the transaction before invoking put() and then resume the transaction.

pruivo
  • 1,214
  • 7
  • 7