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

Stanislav Dvorscak updated JCR-3379:
------------------------------------

    Summary: XA concurrent transactions - NullPointerException  (was: 
NullPointerException)
    
> XA concurrent transactions - NullPointerException
> -------------------------------------------------
>
>                 Key: JCR-3379
>                 URL: https://issues.apache.org/jira/browse/JCR-3379
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-core
>    Affects Versions: 2.4.2, 2.5
>         Environment: java version "1.6.0_26"
> Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
> Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
> Linux dev 2.6.32-5-amd64 #1 SMP Thu Mar 22 17:26:33 UTC 2012 x86_64 GNU/Linux
>            Reporter: Stanislav Dvorscak
>
> If several threads are working with XA transactions, the NullPointerException 
> is randomly happened. After that each other transaction will deadlock on the 
> Jackrabbit side, and the restart of the server is necessary.
> The exception is:
> Exception in thread "executor-13" java.lang.NullPointerException
>       at 
> org.apache.jackrabbit.core.version.VersioningLock$XidRWLock.isSameGlobalTx(VersioningLock.java:116)
>       at 
> org.apache.jackrabbit.core.version.VersioningLock$XidRWLock.allowReader(VersioningLock.java:126)
>       at 
> org.apache.jackrabbit.core.version.VersioningLock$XidRWLock.endWrite(VersioningLock.java:161)
>       at 
> EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock$WriterLock.release(Unknown
>  Source)
>       at 
> org.apache.jackrabbit.core.version.VersioningLock$WriteLock.release(VersioningLock.java:76)
>       at 
> org.apache.jackrabbit.core.version.InternalXAVersionManager$2.internalReleaseWriteLock(InternalXAVersionManager.java:703)
>       at 
> org.apache.jackrabbit.core.version.InternalXAVersionManager$2.commit(InternalXAVersionManager.java:691)
>       at 
> org.apache.jackrabbit.core.TransactionContext.commit(TransactionContext.java:195)
>       at 
> org.apache.jackrabbit.core.XASessionImpl.commit(XASessionImpl.java:326)
>       at 
> org.apache.jackrabbit.rmi.server.ServerXASession.commit(ServerXASession.java:58)
>       at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at java.lang.reflect.Method.invoke(Method.java:597)
>       at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
>       at sun.rmi.transport.Transport$1.run(Transport.java:159)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
>       at 
> sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
>       at 
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
>       at 
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>       at java.lang.Thread.run(Thread.java:662)
>       at 
> sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
>       at 
> sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
>       at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
>       at org.apache.jackrabbit.rmi.server.ServerXASession_Stub.commit(Unknown 
> Source)
>       at 
> org.apache.jackrabbit.rmi.client.ClientXASession.commit(ClientXASession.java:74)
>       at org.objectweb.jotm.SubCoordinator.doCommit(SubCoordinator.java:1123)
>       at 
> org.objectweb.jotm.SubCoordinator.commit_one_phase(SubCoordinator.java:483)
>       at org.objectweb.jotm.TransactionImpl.commit(TransactionImpl.java:318)
>       at org.objectweb.jotm.Current.commit(Current.java:452)
>       at 
> org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1010)
>       at 
> org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
>       at 
> org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
>       at 
> org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
>       at 
> org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
>       at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
>       at 
> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
> And the point of the other deadlocks is:
> Thread [executor-13] (Suspended)      
>       SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) 
> line: not available [native method]        
>       SocketInputStream.read(byte[], int, int) line: 129      
>       BufferedInputStream.fill() line: 218    
>       BufferedInputStream.read() line: 237    
>       DataInputStream.readByte() line: 248    
>       StreamRemoteCall.executeCall() line: 195        
>       UnicastRef.invoke(Remote, Method, Object[], long) line: 142     
>       ServerXASession_Stub.prepare(Xid) line: not available   
>       ClientXASession.prepare(Xid) line: 106  
>       SubCoordinator.doPrepare() line: 829    
>       SubCoordinator.commit_one_phase() line: 480     
>       TransactionImpl.commit() line: 318      
>       Current.commit() line: 452      
>       JtaTransactionManager.doCommit(DefaultTransactionStatus) line: 1010     
>       
> JtaTransactionManager(AbstractPlatformTransactionManager).processCommit(DefaultTransactionStatus)
>  line: 754     
>       
> JtaTransactionManager(AbstractPlatformTransactionManager).commit(TransactionStatus)
>  line: 723   
>       
> TransactionInterceptor(TransactionAspectSupport).commitTransactionAfterReturning(TransactionAspectSupport$TransactionInfo)
>  line: 393    
>       TransactionInterceptor.invoke(MethodInvocation) line: 120       
>       ReflectiveMethodInvocation.proceed() line: 172  
>       JdkDynamicAopProxy.invoke(Object, Method, Object[]) line: 202   
>       $Proxy94.processProductDetail(String) line: not available       
>       ProcessProductDetailConsumer$1.run() line: 79   
>       ThreadPoolExecutor$Worker.runTask(Runnable) line: 886   
>       ThreadPoolExecutor$Worker.run() line: 908       
>       Thread.run() line: 680  
> I fixed this bug as the:
> diff --git 
> a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersioningLock.java
>  
> b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersioningLock.java
> index c9a9a77..9716b0a 100644
> --- 
> a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersioningLock.java
> +++ 
> b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersioningLock.java
> @@ -113,7 +113,7 @@ public class VersioningLock {
>           * @return true if same globalTX otherwise false
>           */
>          boolean isSameGlobalTx(Xid otherXid) {
> -            return (activeXid == otherXid) || 
> Arrays.equals(activeXid.getGlobalTransactionId(), 
> otherXid.getGlobalTransactionId());
> +            return activeXid != null && (activeXid == otherXid) || 
> Arrays.equals(activeXid.getGlobalTransactionId(), 
> otherXid.getGlobalTransactionId());
>          }
>  
>          /**
> it seems that the activeXid is null. After this fix, I made the test of this 
> one over 16 parallel threads and 30 000 commits, it seems no problem was 
> appeared again.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to