[jboss-jira] [JBoss JIRA] (WFLY-9839) Incorrect lock management in infinispan
Oleg K (JIRA)
issues at jboss.org
Mon Feb 26 13:25:00 EST 2018
[ https://issues.jboss.org/browse/WFLY-9839?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13538434#comment-13538434 ]
Oleg K commented on WFLY-9839:
------------------------------
I think that the problem that "wildfly - hibernate - infinispan" integration is implemented that call to EntityManager.refresh() acquires lock in infinispan cache which is not release until transaction is completed. But such call should not take locks if entity was not locked before in this transaction.
*EntityManager.refresh() method issues org.infinispan.commands.write.RemoveCommand to the Infinispan which seems take lock on cached element but does not release this lock until transaction completion.* I think that it should not aquire a lock (or at least should release the lock immediately after call return - at least for refresh operations - so infinispan's logic of locking should behave different for EntityManager.remove() and EntityManager.refresh() operations or something like that).
Or it might be that the problem somewhere in this classes:
{code}
at org.infinispan.util.concurrent.locks.impl.DefaultLockManager$KeyAwareExtendedLockPromise.lock(DefaultLockManager.java:253)
at org.infinispan.interceptors.locking.AbstractLockingInterceptor.lockAndRecord(AbstractLockingInterceptor.java:269)
at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.checkPendingAndLockKey(AbstractTxLockingInterceptor.java:161)
at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.lockOrRegisterBackupLock(AbstractTxLockingInterceptor.java:83)
at org.infinispan.interceptors.locking.PessimisticLockingInterceptor.acquireLocalLock(PessimisticLockingInterceptor.java:93)
at org.infinispan.interceptors.locking.PessimisticLockingInterceptor.visitDataWriteCommand(PessimisticLockingInterceptor.java:172)
at org.infinispan.interceptors.locking.AbstractLockingInterceptor.visitRemoveCommand(AbstractLockingInterceptor.java:105)
at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:63)
at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndFinally(BaseAsyncInterceptor.java:154)
at org.infinispan.interceptors.impl.TxInterceptor.handleWriteCommand(TxInterceptor.java:458)
at org.infinispan.interceptors.impl.TxInterceptor.visitRemoveCommand(TxInterceptor.java:249)
at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:63)
{code}
Workaround: do not call refresh in enclosing transaction - but use EntityManager.clear() and EntityManager.find(). That is bad solution but may help. Calling EntityManagerFactory.getCache().evict(Object, primaryKey) does not help - lock in refresh() call is aquired anyway (even if there isn't this cached entity in infinispan)
> Incorrect lock management in infinispan
> ---------------------------------------
>
> Key: WFLY-9839
> URL: https://issues.jboss.org/browse/WFLY-9839
> Project: WildFly
> Issue Type: Bug
> Components: JPA / Hibernate, Transactions
> Affects Versions: 10.1.0.Final, 11.0.0.Final
> Environment: Reproduced on Debian 8 GNU/Linux,
> Java - openjdk version "1.8.0_131"
> Reporter: Oleg K
> Assignee: Scott Marlow
> Attachments: maven-with-arquillian-unittest.zip
>
>
> If we update one JPA entity with one id (primary key) in several transactions and refresh (via EntityManager.refresh call) loaded entity between them - infinispan does not release lock for the entity - so one can fail on timeout waiting for that lock to be released.
> The root exception is:
> org.infinispan.util.concurrent.TimeoutException: ISPN000299: Unable to acquire lock after 15 seconds for key 10 and requestor GlobalTransaction:<null>:6:local. Lock is held by GlobalTransaction:<null>:4:local
> at org.infinispan.util.concurrent.locks.impl.DefaultLockManager$KeyAwareExtendedLockPromise.lock(DefaultLockManager.java:238)
> at org.infinispan.interceptors.locking.AbstractLockingInterceptor.lockAndRecord(AbstractLockingInterceptor.java:193)
> at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.checkPendingAndLockKey(AbstractTxLockingInterceptor.java:193)
> at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.lockOrRegisterBackupLock(AbstractTxLockingInterceptor.java:116)
> at org.infinispan.interceptors.locking.PessimisticLockingInterceptor.visitDataWriteCommand(PessimisticLockingInterceptor.java:134)
> at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.visitPutKeyValueCommand(AbstractTxLockingInterceptor.java:65)
> at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:78)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
> at org.infinispan.interceptors.TxInterceptor.enlistWriteAndInvokeNext(TxInterceptor.java:367)
> at org.infinispan.interceptors.TxInterceptor.visitPutKeyValueCommand(TxInterceptor.java:221)
> at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:78)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
> at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:114)
> at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:83)
> at org.infinispan.commands.AbstractVisitor.visitPutKeyValueCommand(AbstractVisitor.java:43)
> at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:78)
> at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:335)
> at org.infinispan.cache.impl.CacheImpl.executeCommandAndCommitIfNeeded(CacheImpl.java:1672)
> at org.infinispan.cache.impl.CacheImpl.putInternal(CacheImpl.java:1121)
> at org.infinispan.cache.impl.CacheImpl.put(CacheImpl.java:1111)
> at org.infinispan.cache.impl.DecoratedCache.put(DecoratedCache.java:453)
> at org.infinispan.cache.impl.AbstractDelegatingCache.put(AbstractDelegatingCache.java:291)
> at org.hibernate.cache.infinispan.access.TxInvalidationCacheAccessDelegate.update(TxInvalidationCacheAccessDelegate.java:67)
> at org.hibernate.cache.infinispan.entity.ReadWriteAccess.update(ReadWriteAccess.java:29)
> at org.hibernate.action.internal.EntityUpdateAction.cacheUpdate(EntityUpdateAction.java:222)
> at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:196)
> at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:582)
> at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:456)
> at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
> at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
> at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)
> at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1300)
> at org.jboss.as.jpa.container.AbstractEntityManager.flush(AbstractEntityManager.java:459)
> at wildfly.infinispan.test.MyEntityManagerEJB.updateMyEntity(MyEntityManagerEJB.java:36)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:498)
--
This message was sent by Atlassian JIRA
(v7.5.0#75005)
More information about the jboss-jira
mailing list