Hi List,

i noticed a strange behavior of the jca-adapter in a jboss environment.
It was hardly to reproduce so wasn't able to write a simple example, yet.

Some hours of debugging let me get the impression, that the caching of
the ItemStates is broken in my case...

Generally I perform some actions on an EJB that user the Repository
Resource. I choose ContainerManagedTransactions but encountered the
Problem in BMT,too.

The tasks i do are:
T1: create a node "a"
T2: create a child node "a/b"
T3: removes "a"

Sometimes(!) after repeating this process two or more times, the remove
stops with a TransactionRollbackException [0]. The jboss server.log also
gives a small hint to what has happend:
2009-01-20 15:16:33,464 DEBUG 
[org.apache.jackrabbit.core.state.SharedItemStateManager] 
41bcdd97-3589-4095-a32e-aa1f60867744 has been modified externally
The id is the id of node "a".
I could also extract the underlying Exception that leads to the rollback[1].
Also i extracted the modCount of the given ItemState and its overlayItemState:
15:16:33,401 INFO  [STDOUT] state.modCount: 0 state.overlay.getModeCount: 1

So it seems that the node i retrieve in the remove methode was modified,
while i try to remove it.  But this only happens some times and i only
tested on single client that performs the actions sequentially.

A workaround that helps me out of this is to clear the ItemCache, but
that goes far beyond the API and wasn't more than wild guessing:

Every time I aquire a new Session from the JCA Repository I do something
like this:
  
  JCASessionHandle handle = (JCASessionHandle)session;
  ItemManager itemManager = 
((XASessionImpl)handle.getManagedConnection().getSession(handle)).getItemManager();
  Method m = itemManager.getClass().getDeclaredMethod("dispose");
  m.setAccessible(true);
  m.invoke(itemManager);
        
Ugly, isn't it!?

I wasn't able to write a simple example to reproduce this. So mayby i
missused the JCR-API and cause this by my self. But besides the
dispose-hack above i only do normal jcr-Api calls.

So now i need some hints:
        1. What further informations i could provide to write an proper 
bug-report?
        2. Any ideas how to isolate the problem?


I use:
        jackrabbit-jca-1.5.0
        jboss-4.2.2.GA
my jcr-ds.xml looks like this[2]
my repository.xml like this[3]

Any help appreciated!

Regards
Moritz Rebbert



[0]
ERROR: java.lang.RuntimeException: javax.transaction.RollbackException: 
[com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] 
[com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] Can't 
commit because the transaction is in aborted state; nested exception is: 
java.lang.RuntimeException: javax.transaction.RollbackException: 
[com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] 
[com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] Can't 
commit because the transaction is in aborted state

[1]
16:20:13,463 ERROR [STDERR] javax.transaction.xa.XAException
16:20:13,464 ERROR [STDERR]     at 
org.apache.jackrabbit.core.TransactionContext.prepare(TransactionContext.java:155)
16:20:13,464 ERROR [STDERR]     at 
org.apache.jackrabbit.core.XASessionImpl.commit(XASessionImpl.java:337)
16:20:13,465 ERROR [STDERR]     at 
org.apache.jackrabbit.jca.TransactionBoundXAResource.commit(TransactionBoundXAResource.java:39)
16:20:13,465 ERROR [STDERR]     at 
org.jboss.resource.connectionmanager.xa.JcaXAResourceWrapper.commit(JcaXAResourceWrapper.java:53)
16:20:13,465 ERROR [STDERR]     at 
com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord.topLevelOnePhaseCommit(XAResourceRecord.java:636)
16:20:13,465 ERROR [STDERR]     at 
com.arjuna.ats.arjuna.coordinator.BasicAction.onePhaseCommit(BasicAction.java:2619)
16:20:13,465 ERROR [STDERR]     at 
com.arjuna.ats.arjuna.coordinator.BasicAction.End(BasicAction.java:1779)
16:20:13,465 ERROR [STDERR]     at 
com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:88)
16:20:13,466 ERROR [STDERR]     at 
com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
16:20:13,466 ERROR [STDERR]     at 
com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1389)
16:20:13,466 ERROR [STDERR]     at 
com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)
16:20:13,466 ERROR [STDERR]     at 
com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)
16:20:13,466 ERROR [STDERR]     at 
org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
16:20:13,466 ERROR [STDERR]     at 
org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
16:20:13,466 ERROR [STDERR]     at 
org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
16:20:13,466 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:13,467 ERROR [STDERR]     at 
org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95)
16:20:13,467 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:13,467 ERROR [STDERR]     at 
org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:83)
16:20:13,467 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:13,468 ERROR [STDERR]     at 
org.jboss.aspects.security.RoleBasedAuthorizationInterceptor.invoke(RoleBasedAuthorizationInterceptor.java:166)
16:20:13,478 ERROR [STDERR]     at 
org.jboss.ejb3.security.RoleBasedAuthorizationInterceptor.invoke(RoleBasedAuthorizationInterceptor.java:115)
16:20:13,478 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:13,479 ERROR [STDERR]     at 
org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
16:20:13,479 ERROR [STDERR]     at 
org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
16:20:13,496 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:13,496 ERROR [STDERR]     at 
org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
16:20:13,496 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:13,496 ERROR [STDERR]     at 
org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
16:20:13,496 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:13,496 ERROR [STDERR]     at 
org.jboss.ejb3.stateful.StatefulContainer.dynamicInvoke(StatefulContainer.java:335)
16:20:13,497 ERROR [STDERR]     at 
org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
16:20:13,497 ERROR [STDERR]     at 
org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
16:20:13,497 ERROR [STDERR]     at 
org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:769)
16:20:13,511 ERROR [STDERR]     at 
org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:573)
16:20:13,512 ERROR [STDERR]     at 
org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:373)
16:20:13,512 ERROR [STDERR]     at 
org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:166)
16:20:13,513 ERROR [STDERR] Caused by: 
org.apache.jackrabbit.core.TransactionException: Unable to prepare transaction.
16:20:13,513 ERROR [STDERR]     at 
org.apache.jackrabbit.core.state.XAItemStateManager.prepare(XAItemStateManager.java:155)
16:20:13,513 ERROR [STDERR]     at 
org.apache.jackrabbit.core.TransactionContext.prepare(TransactionContext.java:138)
16:20:13,514 ERROR [STDERR]     ... 36 more
16:20:13,514 ERROR [STDERR] Caused by: 
org.apache.jackrabbit.core.state.StaleItemStateException: 
b0a65dc6-5180-4fe9-8f77-d09f0870b2cb has been modified externally
16:20:13,514 ERROR [STDERR]     at 
org.apache.jackrabbit.core.state.SharedItemStateManager$Update.begin(SharedItemStateManager.java:644)
16:20:13,515 ERROR [STDERR]     at 
org.apache.jackrabbit.core.state.SharedItemStateManager.beginUpdate(SharedItemStateManager.java:1054)
16:20:13,515 ERROR [STDERR]     at 
org.apache.jackrabbit.core.state.XAItemStateManager.prepare(XAItemStateManager.java:149)
16:20:13,515 ERROR [STDERR]     ... 37 more
16:20:22,241 ERROR [STDERR] javax.transaction.xa.XAException
16:20:22,241 ERROR [STDERR]     at 
org.apache.jackrabbit.core.TransactionContext.prepare(TransactionContext.java:155)
16:20:22,241 ERROR [STDERR]     at 
org.apache.jackrabbit.core.XASessionImpl.commit(XASessionImpl.java:337)
16:20:22,241 ERROR [STDERR]     at 
org.apache.jackrabbit.jca.TransactionBoundXAResource.commit(TransactionBoundXAResource.java:39)
16:20:22,241 ERROR [STDERR]     at 
org.jboss.resource.connectionmanager.xa.JcaXAResourceWrapper.commit(JcaXAResourceWrapper.java:53)
16:20:22,241 ERROR [STDERR]     at 
com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord.topLevelOnePhaseCommit(XAResourceRecord.java:636)
16:20:22,241 ERROR [STDERR]     at 
com.arjuna.ats.arjuna.coordinator.BasicAction.onePhaseCommit(BasicAction.java:2619)
16:20:22,242 ERROR [STDERR]     at 
com.arjuna.ats.arjuna.coordinator.BasicAction.End(BasicAction.java:1779)
16:20:22,242 ERROR [STDERR]     at 
com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:88)
16:20:22,242 ERROR [STDERR]     at 
com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
16:20:22,242 ERROR [STDERR]     at 
com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1389)
16:20:22,242 ERROR [STDERR]     at 
com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)
16:20:22,243 ERROR [STDERR]     at 
com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)
16:20:22,243 ERROR [STDERR]     at 
org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
16:20:22,243 ERROR [STDERR]     at 
org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
16:20:22,243 ERROR [STDERR]     at 
org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
16:20:22,243 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:22,243 ERROR [STDERR]     at 
org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95)
16:20:22,244 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:22,244 ERROR [STDERR]     at 
org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:83)
16:20:22,244 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:22,244 ERROR [STDERR]     at 
org.jboss.aspects.security.RoleBasedAuthorizationInterceptor.invoke(RoleBasedAuthorizationInterceptor.java:166)
16:20:22,244 ERROR [STDERR]     at 
org.jboss.ejb3.security.RoleBasedAuthorizationInterceptor.invoke(RoleBasedAuthorizationInterceptor.java:115)
16:20:22,244 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:22,244 ERROR [STDERR]     at 
org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
16:20:22,244 ERROR [STDERR]     at 
org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
16:20:22,284 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:22,284 ERROR [STDERR]     at 
org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
16:20:22,284 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:22,284 ERROR [STDERR]     at 
org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
16:20:22,284 ERROR [STDERR]     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
16:20:22,284 ERROR [STDERR]     at 
org.jboss.ejb3.stateful.StatefulContainer.dynamicInvoke(StatefulContainer.java:335)
16:20:22,285 ERROR [STDERR]     at 
org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
16:20:22,285 ERROR [STDERR]     at 
org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
16:20:22,285 ERROR [STDERR]     at 
org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:769)
16:20:22,285 ERROR [STDERR]     at 
org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:573)
16:20:22,285 ERROR [STDERR]     at 
org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:373)
16:20:22,285 ERROR [STDERR]     at 
org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:166)
16:20:22,286 ERROR [STDERR] Caused by: 
org.apache.jackrabbit.core.TransactionException: Unable to prepare transaction.
16:20:22,286 ERROR [STDERR]     at 
org.apache.jackrabbit.core.state.XAItemStateManager.prepare(XAItemStateManager.java:155)
16:20:22,286 ERROR [STDERR]     at 
org.apache.jackrabbit.core.TransactionContext.prepare(TransactionContext.java:138)
16:20:22,286 ERROR [STDERR]     ... 36 more
16:20:22,286 ERROR [STDERR] Caused by: 
org.apache.jackrabbit.core.state.StaleItemStateException: 
b0a65dc6-5180-4fe9-8f77-d09f0870b2cb has been modified externally
16:20:22,286 ERROR [STDERR]     at 
org.apache.jackrabbit.core.state.SharedItemStateManager$Update.begin(SharedItemStateManager.java:644)
16:20:22,287 ERROR [STDERR]     at 
org.apache.jackrabbit.core.state.SharedItemStateManager.beginUpdate(SharedItemStateManager.java:1054)
16:20:22,287 ERROR [STDERR]     at 
org.apache.jackrabbit.core.state.XAItemStateManager.prepare(XAItemStateManager.java:149)
16:20:22,287 ERROR [STDERR]     ... 37 more


[2]
<connection-factories>
    <tx-connection-factory>
        <jndi-name>jcr/local</jndi-name>
        <xa-transaction/>
        <rar-name>jackrabbit-jca-1.5.0.rar</rar-name>
        <track-connection-by-tx/>
        <connection-definition>javax.jcr.Repository</connection-definition>
        <config-property name="homeDir" 
type="java.lang.String">/Users/moritzrebbert/jackrabbit/homeDir</config-property>
        <config-property name="configFile" 
type="java.lang.String">classpath:repository.xml</config-property>
        <config-property name="bindSessionToTransaction" 
type="java.lang.Boolean">true</config-property>
    </tx-connection-factory>
</connection-factories>

[3]
i<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 
1.2//EN"
                            
"http://jackrabbit.apache.org/dtd/repository-1.4.dtd";>
<Repository>
    <FileSystem 
             class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
        <param name="path" value="${rep.home}/repository"/>
    </FileSystem>

    <Security appName="Jackrabbit">
      <!-- <AccessManager 
class="org.apache.jackrabbit.core.security.SimpleAccessManager"/>  -->
       <AccessManager 
class="de.jabc.dms.backend.security.LoggingAccessManager"/>
        <LoginModule 
class="org.apache.jackrabbit.core.security.SimpleLoginModule">
           <param name="anonymousId" value="anonymous"/>
        </LoginModule>
    </Security>

    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default" />

    <Workspace name="${wsp.name}">
        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
            <param name="path" value="${wsp.home}"/>
        </FileSystem>

        <PersistenceManager 
class="org.apache.jackrabbit.core.persistence.bundle.PostgreSQLPersistenceManager">
               <param name="driver" value="org.postgresql.Driver"/>
               <param name="url" 
value="jdbc:postgresql://localhost/jackrabbit"/>
               <param name="schema" value="postgresql"/>
               <param name="user" value="postgres"/>
               <param name="password" value="postgres"/>
               <param name="schemaObjectPrefix" value="${wsp.name}_"/>
               <param name="externalBLOBs" value="false"/>
        </PersistenceManager>
        <SearchIndex 
class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
            <param name="path" value="${wsp.home}/index" />
        </SearchIndex>
    </Workspace>
                                                                                
                                                                                
   
    <Versioning rootPath="${rep.home}/versions">                                
                                                                                
   
        <FileSystem 
class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">                    
                                                               
            <param name="path" value="${rep.home}/versions"/>                   
                                                                                
   
        </FileSystem>                                                           
                                                                                
   
        <!-- TODO -->                                                           
                                                                                
   
        <PersistenceManager 
class="org.apache.jackrabbit.core.state.xml.XMLPersistenceManager" />           
                                                       
    </Versioning>                                                               
                                                                                
   
                                                                                
                                                                                
   
    <DataStore class="org.apache.jackrabbit.core.data.FileDataStore">           
                                                                                
   
        <param name="path" value="${rep.home}/repository/datastore"/>           
                                                                                
   
        <param name="minRecordLength" value="100"/>                             
                                                                                
   
    </DataStore>                                                                
                                                                                
   
                                                                                
                                                                                
   
</Repository> 

Reply via email to