Stanislav Dvorscak created JCR-3379:
---------------------------------------

             Summary: 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.5, 2.4.2
         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