[
https://issues.jboss.org/browse/WFLY-9839?page=com.atlassian.jira.plugin....
]
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)