4 Replies Latest reply on Jun 24, 2004 9:45 AM by rchristy

    JBossCache and CMT Question

    rchristy63

      Hello,

      I using JBoss 3.2.4 with Hibernate and I seem to be having a problem getting the TreeCache to participate in the containers transaction. I seem to be getting the following exception with each transaction. I've also added my treecache.xml file. Is something missing from that file that is causing this error?

      17:19:26,912 ERROR [TreeCache] getCurrentTransaction(): registration with transaction failed
      java.lang.IllegalStateException: Already committed.
      at org.jboss.tm.TransactionImpl.registerSynchronization(TransactionImpl.java:708)
      at org.jboss.cache.TreeCache.getCurrentTransaction(TreeCache.java:2559)
      at org.jboss.cache.TreeCache.put(TreeCache.java:1156)
      at net.sf.hibernate.cache.TreeCache.put(TreeCache.java:67)
      at net.sf.hibernate.cache.UpdateTimestampsCache.invalidate(UpdateTimestampsCache.java:50)
      at net.sf.hibernate.impl.SessionImpl.afterTransactionCompletion(SessionImpl.java:581)
      at net.sf.hibernate.engine.CacheSynchronization.afterCompletion(CacheSynchronization.java:29)
      at org.jboss.tm.TransactionImpl.doAfterCompletion(TransactionImpl.java:1404)
      at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:427)
      at org.jboss.ejb.plugins.TxInterceptorCMT.endTransaction(TxInterceptorCMT.java:463)
      at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:342)
      at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:156)
      at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:123)
      at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:201)
      at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:129)
      at org.jboss.ejb.StatelessSessionContainer.internalInvoke(StatelessSessionContainer.java:331)
      at org.jboss.ejb.Container.invoke(Container.java:715)
      at sun.reflect.GeneratedMethodAccessor60.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:324)
      at org.jboss.mx.server.ReflectedDispatcher.dispatch(ReflectedDispatcher.java:65)
      at org.jboss.mx.server.Invocation.dispatch(Invocation.java:61)
      at org.jboss.mx.server.Invocation.dispatch(Invocation.java:53)
      at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
      at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:196)
      at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:466)
      at org.jboss.invocation.jrmp.server.JRMPInvoker.invoke(JRMPInvoker.java:383)
      at sun.reflect.GeneratedMethodAccessor76.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:324)
      at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:261)
      at sun.rmi.transport.Transport$1.run(Transport.java:148)
      at java.security.AccessController.doPrivileged(Native Method)
      at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
      at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
      at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
      at java.lang.Thread.run(Thread.java:534)

      Here is a copy of my treecache.xml file:

      <?xml version="1.0" encoding="UTF-8"?>

      <!-- ===================================================================== -->
      <!-- -->
      <!-- Sample TreeCache Service Configuration -->
      <!-- -->
      <!-- ===================================================================== -->






      <!-- ==================================================================== -->
      <!-- Defines TreeCache configuration -->
      <!-- ==================================================================== -->



      jboss:service=Naming
      jboss:service=TransactionManager

      <!--
      Configure the TransactionManager
      -->
      org.jboss.cache.DummyTransactionManagerLookup


      <!--
      Node isolation level : SERIALIZABLE
      REPEATABLE_READ (default)
      READ_COMMITTED
      READ_UNCOMMITTED
      NONE
      -->
      REPEATABLE_READ

      <!--
      Valid modes are LOCAL
      REPL_ASYNC
      REPL_SYNC
      -->
      LOCAL

      <!-- Name of cluster. Needs to be the same for all clusters, in order
      to find each other
      -->
      TreeCache-Cluster

      <!-- JGroups protocol stack properties. Can also be a URL,
      e.g. file:/home/bela/default.xml

      -->



      <!-- UDP: if you have a multihomed machine,
      set the bind_addr attribute to the appropriate NIC IP address -->
      <!-- UDP: On Windows machines, because of the media sense feature
      being broken with multicast (even after disabling media sense)
      set the loopback attribute to true -->
      <UDP mcast_addr="228.1.2.3" mcast_port="45566"
      ip_ttl="64" ip_mcast="true"
      mcast_send_buf_size="150000" mcast_recv_buf_size="80000"
      ucast_send_buf_size="150000" ucast_recv_buf_size="80000"
      loopback="false"/>
      <PING timeout="2000" num_initial_members="3"
      up_thread="false" down_thread="false"/>
      <MERGE2 min_interval="10000" max_interval="20000"/>
      <FD shun="true" up_thread="true" down_thread="true"/>
      <VERIFY_SUSPECT timeout="1500"
      up_thread="false" down_thread="false"/>
      <pbcast.NAKACK gc_lag="50" retransmit_timeout="600,1200,2400,4800"
      up_thread="false" down_thread="false"/>
      <pbcast.STABLE desired_avg_gossip="20000"
      up_thread="false" down_thread="false"/>
      <UNICAST timeout="600,1200,2400" window_size="100" min_threshold="10"
      down_thread="false"/>
      <FRAG frag_size="8192"
      down_thread="false" up_thread="false"/>
      <pbcast.GMS join_timeout="5000" join_retry_timeout="2000"
      shun="true" print_local_addr="true"/>
      <pbcast.STATE_TRANSFER up_thread="false" down_thread="false"/>



      <!--
      Max number of entries in the cache. If this is exceeded, the
      eviction policy will kick some entries out in order to make
      more room
      -->
      20000

      <!--
      The max amount of time (in milliseconds) we wait until the
      initial state (ie. the contents of the cache) are retrieved from
      existing members in a clustered environment
      -->
      20000

      <!--
      Number of milliseconds to wait until all responses for a
      synchronous call have been received.
      -->
      10000

      <!-- Max number of milliseconds to wait for a lock acquisition -->
      15000

      <!-- Max number of milliseconds we hold a lock (not currently
      implemented) -->
      60000

      <!-- Name of the eviction policy class. Not supported now. -->









        • 1. Re: JBossCache and CMT Question
          rchristy63

          For some reason my treecache.xml file didn't show up in the original posting. Here it is again:

          
          <?xml version="1.0" encoding="UTF-8"?>
          
          <!-- ===================================================================== -->
          <!-- -->
          <!-- Sample TreeCache Service Configuration -->
          <!-- -->
          <!-- ===================================================================== -->
          
          <server>
          
           <classpath codebase="./lib" archives="jboss-cache.jar, jgroups.jar"/>
          
          
           <!-- ==================================================================== -->
           <!-- Defines TreeCache configuration -->
           <!-- ==================================================================== -->
          
           <mbean code="org.jboss.cache.TreeCache"
           name="jboss.cache:service=TreeCache">
          
           <depends>jboss:service=Naming</depends>
           <depends>jboss:service=TransactionManager</depends>
          
           <!--
           Configure the TransactionManager
           -->
           <attribute name="TransactionManagerLookupClass">org.jboss.cache.DummyTransactionManagerLookup</attribute>
          
          
           <!--
           Node isolation level : SERIALIZABLE
           REPEATABLE_READ (default)
           READ_COMMITTED
           READ_UNCOMMITTED
           NONE
           -->
           <attribute name="IsolationLevel">REPEATABLE_READ</attribute>
          
           <!--
           Valid modes are LOCAL
           REPL_ASYNC
           REPL_SYNC
           -->
           <attribute name="CacheMode">LOCAL</attribute>
          
           <!-- Name of cluster. Needs to be the same for all clusters, in order
           to find each other
           -->
           <attribute name="ClusterName">TreeCache-Cluster</attribute>
          
           <!-- JGroups protocol stack properties. Can also be a URL,
           e.g. file:/home/bela/default.xml
           <attribute name="ClusterProperties"></attribute>
           -->
          
           <attribute name="ClusterConfig">
           <config>
           <!-- UDP: if you have a multihomed machine,
           set the bind_addr attribute to the appropriate NIC IP address -->
           <!-- UDP: On Windows machines, because of the media sense feature
           being broken with multicast (even after disabling media sense)
           set the loopback attribute to true -->
           <UDP mcast_addr="228.1.2.3" mcast_port="45566"
           ip_ttl="64" ip_mcast="true"
           mcast_send_buf_size="150000" mcast_recv_buf_size="80000"
           ucast_send_buf_size="150000" ucast_recv_buf_size="80000"
           loopback="false"/>
           <PING timeout="2000" num_initial_members="3"
           up_thread="false" down_thread="false"/>
           <MERGE2 min_interval="10000" max_interval="20000"/>
           <FD shun="true" up_thread="true" down_thread="true"/>
           <VERIFY_SUSPECT timeout="1500"
           up_thread="false" down_thread="false"/>
           <pbcast.NAKACK gc_lag="50" retransmit_timeout="600,1200,2400,4800"
           up_thread="false" down_thread="false"/>
           <pbcast.STABLE desired_avg_gossip="20000"
           up_thread="false" down_thread="false"/>
           <UNICAST timeout="600,1200,2400" window_size="100" min_threshold="10"
           down_thread="false"/>
           <FRAG frag_size="8192"
           down_thread="false" up_thread="false"/>
           <pbcast.GMS join_timeout="5000" join_retry_timeout="2000"
           shun="true" print_local_addr="true"/>
           <pbcast.STATE_TRANSFER up_thread="false" down_thread="false"/>
           </config>
           </attribute>
          
           <!--
           Max number of entries in the cache. If this is exceeded, the
           eviction policy will kick some entries out in order to make
           more room
           -->
           <attribute name="MaxCapacity">20000</attribute>
          
           <!--
           The max amount of time (in milliseconds) we wait until the
           initial state (ie. the contents of the cache) are retrieved from
           existing members in a clustered environment
           -->
           <attribute name="InitialStateRetrievalTimeout">20000</attribute>
          
           <!--
           Number of milliseconds to wait until all responses for a
           synchronous call have been received.
           -->
           <attribute name="SyncReplTimeout">10000</attribute>
          
           <!-- Max number of milliseconds to wait for a lock acquisition -->
           <attribute name="LockAcquisitionTimeout">15000</attribute>
          
           <!-- Max number of milliseconds we hold a lock (not currently
           implemented) -->
           <attribute name="LockLeaseTimeout">60000</attribute>
          
           <!-- Name of the eviction policy class. Not supported now. -->
           <attribute name="EvictionPolicyClass"></attribute>
           </mbean>
          
          
          </server>
          
          
          
          


          • 2. Re: JBossCache and CMT Question
            belaban

            How do you access the TreeCache ? From a SFSB ?
            Can you submit a small test program that reproduces the problem ? Looks as if the transaction that tries to access the cache has already been committed.

            This might be a possible buf *if* you intend to access the cache after committing the TX, e.g (conceptually):

            tx.begin();
            doSomething();
            tx.commit();
            cache.put(fqn, key, val);

            The fix could be to just ignore the committed TX, and run the operation on the cache without a TX.


            Bela

            • 3. Re: JBossCache and CMT Question
              belaban

              Actually, I looked at the code, and what I described above is the default behavior. The last put() should be run outside of a TX, because the TxManager should disassociate the TX from the tread.

              Can you submit a small program that demos this bug ?

              Bela

              • 4. 3839167

                Bela,

                Actually it is Hibernate's use of the JBossCache that does this. We have another thread on the Hibernate's forum that Gavin and Ben and commented on. I don't really have a small test program, but Gavin and/or Ben have already discussed this and might be able to give you information that you need. Please look at the following thread in Hibernate

                http://forum.hibernate.org/viewtopic.php?p=2206715#2206715

                Thanks,

                Rich