[jboss-jira] [JBoss JIRA] (AS7-5539) JBOSS7 server hangs up completely when a EJB2.1 entity bean business method is called in same transaction in a separate thread from the thread which started the transaction

Mayank Gupta (JIRA) jira-events at lists.jboss.org
Wed Sep 12 06:50:32 EDT 2012


    [ https://issues.jboss.org/browse/AS7-5539?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12717830#comment-12717830 ] 

Mayank Gupta edited comment on AS7-5539 at 9/12/12 6:49 AM:
------------------------------------------------------------

This is what is happening,

We find the Entity instance using a finder method from a EJB thread. This calls JBOSS server EntityBeanSynchronizationInterceptor for the first time in the transaction.

For doing amend we do not do it directly but put the update data on a HornetQ. I think JMS hornetQ spawns a separate thread but it is joining the same XA transaction as the transaction attribute for my MDBs is MANDATORY. Now wneh I again call the business method on my Entity Bean JBOSS7 server again calls EntityBeanSynchronizationInterceptor. But this time it is not able to take the lock and also assigns the existing lock owner to requester thread. Upon trying to get the lock it hangs up completely.

Even your JBOSS code OwnableReentrantLock has code comments which suggest that multiple threads can be part of same transaction:
* A lock that supports reentrancy based on owner (and not on current thread).  For this to work, the lock needs to be
 * constructed with a reference to the {@link org.infinispan.context.InvocationContextContainer}, so it is able to determine whether the
 * caller's "owner" reference is the current thread or a {@link org.infinispan.transaction.xa.GlobalTransaction} instance.
 * <p/>
 * For now we are using a completely synchronized approach to entity concurrency. There is at most 1 entity active for a given primary
 * key at any time, and access is synchronized within a transaction.
 *
Please clarify if my understanding is wrong.
                
      was (Author: ion_mayank):
    This is what is happening,

We find the Entity instance using a finder method from a EJB thread. This calls JBOSS server EntityBeanSynchronizationInterceptor for the first time in the transaction.

For doing amend we do not do it directly but put the update data on a HornetQ. I think JMS hornetQ spawns a separate thread but it is joining the same XA transaction as the transaction attribute for my MDBs is MANDATORY. Now wneh I again call the business method on my Entity Bean JBOSS7 server again calls EntityBeanSynchronizationInterceptor. But this time it is not able to take the lock and also assigns the existing lock owner to requester thread. Upon trying to get the lock it hangs up completely.

Even your JBOSS code OwnableReentrantLock has code comments which suggest that multiple threads can be part of same transaction:
* A lock that supports reentrancy based on owner (and not on current thread).  For this to work, the lock needs to be
 * constructed with a reference to the {@link org.infinispan.context.InvocationContextContainer}, so it is able to determine whether the
 * caller's "owner" reference is the current thread or a {@link org.infinispan.transaction.xa.GlobalTransaction} instance.
 * <p/>
 * For now we are using a completely synchronized approach to entity concurrency. There is at most 1 entity active for a given primary
 * key at any time, and access is synchronized within a transaction.
 *
Please clarify if I understanding is wrong.
                  
> JBOSS7 server hangs up completely when a EJB2.1 entity bean business method is called in same transaction in a separate thread from the thread which started the transaction
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: AS7-5539
>                 URL: https://issues.jboss.org/browse/AS7-5539
>             Project: Application Server 7
>          Issue Type: Bug
>          Components: EJB, Transactions
>    Affects Versions: 7.1.1.Final, 7.1.3.Final (EAP), 7.2.0.Alpha1
>            Reporter: Mayank Gupta
>            Assignee: jaikiran pai
>
> JBOSS7 server hangs up completely while trying to access a EJB2.1 entity bean method in a specific scenario.
> I am using a session facade pattern in which I call my EntityBean from a Stateless session bean. For moth the beans I have defined the transaction attribute as REQUIRED.
> On debugging the code I found that if the same Entity bean is accessed from two different threads in same transaction then this issue occurs.
> So for the first time my code enters "EntityBeanSynchronizationInterceptor" code is able to take the lock and assign the requester thread as the lock owner. When second time it comes to access the same entity bean from different thread in SAME TRANSACTION (as 2nd required results in joining the transaction), JBOSS7 server code completely stalls in taking the lock. Moreover this time requester thread is not given the owner status of the transaction. 
> Code snippet where code hangs:
>         final Object lockOwner = getLockOwner(transactionSynchronizationRegistry);
>         lock.pushOwner(lockOwner);
>         try {
>             lock.lock();  //line 80 in EntityBeanSynchronizationInterceptor
> and subsequently in:
>     public void lock() {
>         if (compareAndSetState(0, 1))
>             owner = currentRequestor();
>         else
>             acquire(1); //Here line 86 in OwnableReentrantLock
>     }
> This is a completely blocking issue for migrating my application from JBOSS6 to JBOSS7.
> I get this error in numerous places in my application code.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the jboss-jira mailing list