[ 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