You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Hiroki Tateno (JIRA)" <ji...@apache.org> on 2009/02/09 07:54:59 UTC

[jira] Updated: (OPENJPA-913) A deadlock issue happens when DirtyListener is used

     [ https://issues.apache.org/jira/browse/OPENJPA-913?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Hiroki Tateno updated OPENJPA-913:
----------------------------------

    Attachment: testcase.zip

I uploaded a simple testcase testcase.zip.

====
step by step test procedure)
1. update database configuration in persistence.xml
2. run "ant test"
====


> A deadlock issue happens when DirtyListener is used
> ---------------------------------------------------
>
>                 Key: OPENJPA-913
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-913
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 1.2.0
>         Environment: Linux x86
>            Reporter: Hiroki Tateno
>         Attachments: testcase.zip
>
>
> A deadlock issue happens when OpenJPA entity manager is
> concurrently called and DirtyListener is used and 
> DirtyListener.beforeDirty calls an entity manager related 
> operation. To call OpenJPA entity manager concurrently, 
> we need to define openjpa.MulthThreaded option as true.
> Following is test scenario.
> 1. Thread A calls entityMangaer.refresh() repeatedly.
>    In refresh() method, entityManager acquires BrokerImpl
>    lock. And then, entityManager acquires LifecycleEventManager
>    lock to call lifecycle callback.
> 2. Thread B calls persistedObject.getAItems() (getting
>    collection items).
> 3. In enhanced getItems() method, entityManager tries
>    to mark it as "dirty". Before marking, callback listener
>    DirtyListener.beforeDirty is called. In this point,
>    LifecycleEventManager lock is acquired without acquiring
>    BrokerImpl lock.
> 4. In the testcase, beforeDirty calls persistedObject.getAItems().
>    And then, entity manager tries to acquire BrokerImpl lock.
>    But, sometimes BrokerImpl lock is already acquired by Thread B.
>    So, a deadlock issue happens. deadlock stack is as follows.
> ====
>      [java] "Thread-1" prio=1 tid=0x09e98b28 nid=0x7fcc waiting on condition [0xb15f3000..0xb15f4130]
>      [java]     at sun.misc.Unsafe.park(Native Method)
>      [java]     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:118)
>      [java]     at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:716)
>      [java]     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:746)
>      [java]     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1076)
>      [java]     at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:184)
>      [java]     at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:256)
>      [java]     at org.apache.openjpa.kernel.BrokerImpl.lock(BrokerImpl.java:4168)
>      [java]     at org.apache.openjpa.kernel.BrokerImpl.beginOperation(BrokerImpl.java:1770)
>      [java]     at org.apache.openjpa.kernel.BrokerImpl.isActive(BrokerImpl.java:1742)
>      [java]     at org.apache.openjpa.kernel.StateManagerImpl.beforeRead(StateManagerImpl.java:964)
>      [java]     at org.apache.openjpa.kernel.StateManagerImpl.accessingField(StateManagerImpl.java:1501)
>      [java]     at model.A.getAItems(A.java)
>      [java]     at model.ADirtyListener.beforeDirty(ADirtyListener.java:24)
>      [java]     at org.apache.openjpa.event.LifecycleEventManager.fireEvent(LifecycleEventManager.java:423)
>      [java]     at org.apache.openjpa.event.LifecycleEventManager.fireEvent(LifecycleEventManager.java:289)
>      [java]     - locked <0x51b4e4b0> (a org.apache.openjpa.event.LifecycleEventManager)
>      [java]     at org.apache.openjpa.kernel.BrokerImpl.fireLifecycleEvent(BrokerImpl.java:693)
>      [java]     at org.apache.openjpa.kernel.StateManagerImpl.fireLifecycleEvent(StateManagerImpl.java:364)
>      [java]     at org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1596)
>      [java]     at org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1539)
>      [java]     at org.apache.openjpa.util.Proxies.dirty(Proxies.java:66)
>      [java]     at org.apache.openjpa.util.ProxyCollections.beforeAdd(ProxyCollections.java:57)
>      [java]     at org.apache.openjpa.util.java$util$HashSet$proxy.add(Unknown Source)
>      [java]     at business.Test$2.run(Test.java:80)
>      [java]     at java.lang.Thread.run(Thread.java:595)
>      [java] "Thread-0" prio=1 tid=0x09e9d010 nid=0x7fcb waiting for monitor entry [0xb1674000..0xb1674db0]
>      [java]     at org.apache.openjpa.event.LifecycleEventManager.fireEvent(LifecycleEventManager.java:272)
>      [java]     - waiting to lock <0x51b4e4b0> (a org.apache.openjpa.event.LifecycleEventManager)
>      [java]     at org.apache.openjpa.kernel.BrokerImpl.fireLifecycleEvent(BrokerImpl.java:693)
>      [java]     at org.apache.openjpa.kernel.StateManagerImpl.fireLifecycleEvent(StateManagerImpl.java:364)
>      [java]     at org.apache.openjpa.kernel.StateManagerImpl.clearFields(StateManagerImpl.java:2647)
>      [java]     at org.apache.openjpa.kernel.StateManagerImpl.beforeRefresh(StateManagerImpl.java:1239)
>      [java]     at org.apache.openjpa.kernel.BrokerImpl.refreshInternal(BrokerImpl.java:2835)
>      [java]     at org.apache.openjpa.kernel.BrokerImpl.refresh(BrokerImpl.java:2781)
>      [java]     at org.apache.openjpa.kernel.DelegatingBroker.refresh(DelegatingBroker.java:1078)
>      [java]     at org.apache.openjpa.persistence.EntityManagerImpl.refresh(EntityManagerImpl.java:694)
>      [java]     at business.Test$1.run(Test.java:64)
>      [java]     at java.lang.Thread.run(Thread.java:595)
> ====
> Intially the problem is reproduced on OpenJPA 1.x. But,
> I verified the problem could be reproduced with latest 
> OpenJPA head.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.