[jboss-svn-commits] JBL Code SVN: r31937 - in labs/jbosstm/trunk/txbridge: tests/dd/scripts and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Mar 4 09:06:56 EST 2010


Author: jhalliday
Date: 2010-03-04 09:06:56 -0500 (Thu, 04 Mar 2010)
New Revision: 31937

Modified:
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeDurableParticipant.java
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeRecoveryManager.java
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeSynchronization.java
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeVolatileParticipant.java
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeXAResource.java
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/InboundBridge.java
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/InboundBridgeManager.java
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/JaxWSTxInboundBridgeHandler.java
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/JaxWSTxOutboundBridgeHandler.java
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/OutboundBridge.java
   labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/OutboundBridgeManager.java
   labs/jbosstm/trunk/txbridge/tests/dd/scripts/txbridge-byteman-rules.txt
Log:
Improved txbridge crash recovery support. JBTM-44


Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeDurableParticipant.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeDurableParticipant.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeDurableParticipant.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -47,25 +47,32 @@
  */
 public class BridgeDurableParticipant implements Durable2PCParticipant, Serializable
 {
-	private static Logger log = Logger.getLogger(BridgeDurableParticipant.class);
+	private static final Logger log = Logger.getLogger(BridgeDurableParticipant.class);
 
     /*
      * Uniq String used to prefix ids at participant registration,
      * so that the recovery module can identify relevant instances.
      */
-    public static String TYPE_IDENTIFIER = "BridgeDurableParticipant_";
+    public static final String TYPE_IDENTIFIER = "BridgeDurableParticipant_";
 
-	private transient XATerminator xaTerminator;
+    /*
+     * Uniq (well, hopefully) formatId so we can distinguish our own Xids.
+     */
+    public static final int XARESOURCE_FORMAT_ID = 131080;
 
-    private transient String externalTxId;
+	private transient volatile XATerminator xaTerminator;
 
+    private transient volatile String externalTxId;
+
+    private transient volatile boolean isAwaitingRecovery = false;
+
     static final long serialVersionUID = -5739871936627778072L;
 
     // Xid not guaranteed Serializable by spec, but our XidImple happens to be
-	private Xid xid;
+	private volatile Xid xid;
 
     // Id needed for recovery of the subordinate tx. Uids are likewise Serializable.
-    private Uid subordinateTransactionId;
+    private volatile Uid subordinateTransactionId;
 
     /**
      * Create a new WS-AT Durable Participant which wraps the subordinate XA tx terminator.
@@ -128,6 +135,8 @@
         xid = (Xid)in.readObject();
         subordinateTransactionId = (Uid)in.readObject();
 
+        isAwaitingRecovery = true;
+
         xaTerminator = SubordinationManager.getXATerminator();
 
         try
@@ -167,16 +176,16 @@
 			}
             else
             {
-                InboundBridgeManager.removeMapping(externalTxId);
-				log.debug("prepare on Xid="+xid+" returning ReadOnly");
+                cleanupRefs();
+                log.debug("prepare on Xid="+xid+" returning ReadOnly");
 				return new ReadOnly();
 			}
 
 		}
         catch(XAException e)
         {
-            InboundBridgeManager.removeMapping(externalTxId);
-			log.warn("prepare on Xid="+xid+" returning Aborted", e);
+            cleanupRefs();
+            log.warn("prepare on Xid="+xid+" returning Aborted", e);
 			return new Aborted();
 		}
     }
@@ -202,7 +211,7 @@
 		}
         finally
         {
-            InboundBridgeManager.removeMapping(externalTxId);
+            cleanupRefs();
         }
     }
 
@@ -228,7 +237,7 @@
 		}
         finally
         {
-            InboundBridgeManager.removeMapping(externalTxId);
+            cleanupRefs();
         }
     }
 
@@ -252,5 +261,22 @@
     {
 		log.trace("error(Xid="+xid+"): NOT IMPLEMENTED");
     }
+
+    public boolean isAwaitingRecovery() {
+        return isAwaitingRecovery;
+    }
+
+    public Xid getXid()
+    {
+        return xid;
+    }
+
+    private void cleanupRefs()
+    {
+        log.trace("cleanupRefs()");
+
+        InboundBridgeManager.removeMapping(externalTxId);
+        isAwaitingRecovery = false;
+    }
 }
 

Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeRecoveryManager.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeRecoveryManager.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeRecoveryManager.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -25,7 +25,9 @@
 
 import com.arjuna.ats.arjuna.recovery.RecoveryManager;
 import com.arjuna.ats.arjuna.recovery.RecoveryModule;
+import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
 import com.arjuna.ats.internal.jta.transaction.arjunacore.jca.SubordinationManager;
+import com.arjuna.ats.jta.recovery.XAResourceOrphanFilter;
 import org.apache.log4j.Logger;
 import org.jboss.jbossts.xts.recovery.participant.at.XTSATRecoveryModule;
 import org.jboss.jbossts.xts.recovery.participant.at.XTSATRecoveryManager;
@@ -36,20 +38,25 @@
 import javax.transaction.xa.XAResource;
 import javax.transaction.xa.Xid;
 import java.io.ObjectInputStream;
+import java.util.*;
 
 /**
- * Integrates with JBossAS MC lifecycle to provide recovery services.
+ * Integrates with JBossAS MC lifecycle and JBossTS recovery manager to provide recovery services.
  *
  * @author jonathan.halliday at redhat.com, 2009-02-10
  */
-public class BridgeRecoveryManager implements XTSATRecoveryModule, RecoveryModule
+public class BridgeRecoveryManager implements XTSATRecoveryModule, RecoveryModule, XAResourceOrphanFilter
 {
-    private static Logger log = Logger.getLogger(BridgeRecoveryManager.class);
+    private static final Logger log = Logger.getLogger(BridgeRecoveryManager.class);
 
     private final XTSATRecoveryManager xtsATRecoveryManager = XTSATRecoveryManager.getRecoveryManager();
     private final RecoveryManager acRecoveryManager = RecoveryManager.manager();
     private final XATerminator xaTerminator = SubordinationManager.getXATerminator();
 
+    private final List<BridgeDurableParticipant> participantsAwaitingRecovery =
+            Collections.synchronizedList(new LinkedList<BridgeDurableParticipant>());
+    private volatile boolean orphanedXAResourcesAreIdentifiable = false;
+
     /**
      * MC lifecycle callback, used to register the recovery module with the transaction manager.
      */
@@ -59,8 +66,27 @@
 
         xtsATRecoveryManager.registerRecoveryModule(this);
         acRecoveryManager.addModule(this);
+
+        XARecoveryModule xaRecoveryModule = getXARecoveryModule();
+        xaRecoveryModule.addXAResourceOrphanFilter(this);
     }
 
+    private XARecoveryModule getXARecoveryModule()
+    {
+        XARecoveryModule xaRecoveryModule = null;
+        for(RecoveryModule recoveryModule : ((Vector<RecoveryModule>)acRecoveryManager.getModules())) {
+            if(recoveryModule instanceof XARecoveryModule) {
+                xaRecoveryModule = (XARecoveryModule)recoveryModule;
+                break;
+            }
+        }
+
+        if(xaRecoveryModule == null) {
+            throw new IllegalStateException("no XARecoveryModule found");
+        }
+        return xaRecoveryModule;
+    }
+
     /**
      * MC lifecycle callback, used to unregister the recovery module from the transaction manager.
      */
@@ -70,6 +96,9 @@
 
         xtsATRecoveryManager.unregisterRecoveryModule(this);
         acRecoveryManager.removeModule(this, false);
+        
+        XARecoveryModule xaRecoveryModule = getXARecoveryModule();
+        xaRecoveryModule.removeXAResourceOrphanFilter(this);
     }
 
     /**
@@ -92,7 +121,9 @@
         if(id.startsWith(BridgeDurableParticipant.TYPE_IDENTIFIER))
         {
             Object participant = objectInputStream.readObject();
-            return (BridgeDurableParticipant)participant;
+            BridgeDurableParticipant bridgeDurableParticipant = (BridgeDurableParticipant)participant;
+            participantsAwaitingRecovery.add(bridgeDurableParticipant);
+            return bridgeDurableParticipant;
         }
         else
         {
@@ -118,40 +149,115 @@
     public void periodicWorkFirstPass()
     {
         log.trace("periodicWorkFirstPass()");
+    }
 
-        if(!xtsATRecoveryManager.isParticipantRecoveryStarted()) {
-            // can't do anything until XTS Participant recovery has run.
-            return;
+    /**
+     * Called by the RecoveryManager RECOVERY_BACKOFF_PERIOD seconds
+     * after the completion of the first pass
+     */
+    @Override
+    public void periodicWorkSecondPass()
+    {
+        log.trace("periodicWorkSecondPass()");
+
+        cleanupRecoveredParticipants();
+
+        // the XTS recovery module is registered and hence run before us. Therefore by the time we get here
+        // we know deserialize has been called for any BridgeDurableParticipant for which a log exists.
+        orphanedXAResourcesAreIdentifiable = true;
+
+
+        List<Xid> indoubtSubordinates = getIndoubtSubordinates();
+        for(Xid xid : indoubtSubordinates) {
+            if(checkXid(xid) == XAResourceOrphanFilter.Vote.ROLLBACK) {
+                log.trace("rolling back orphaned subordinate tx "+xid);
+                try {
+                    xaTerminator.rollback(xid);
+                } catch(XAException e) {
+                    log.error("problem rolling back orphaned subordinate tx "+xid, e);
+                }
+            }
         }
 
-        Xid[] xids = null;
+    }
+
+    /**
+     * Run a recovery scan to identify any in-doubt JTA subordinates.
+     *
+     * @return a possibly empty but non-null list of xids corresponding to outstanding
+     * JTA subordinate transactions owned by the txbridge.
+     */
+    private List<Xid> getIndoubtSubordinates()
+    {
+        log.trace("getIndoubtSubordinates()");
+
+        Xid[] allSubordinateXids = null;
         try {
-            xids = xaTerminator.recover(XAResource.TMSTARTRSCAN);
-            xaTerminator.recover(XAResource.TMENDRSCAN);
-
+            allSubordinateXids = xaTerminator.recover(XAResource.TMSTARTRSCAN);
         } catch(XAException e) {
             log.error("Problem whilst scanning for in-doubt subordinate transactions", e);
+        } finally {
+            try {
+                xaTerminator.recover(XAResource.TMENDRSCAN);
+            } catch(XAException e) {}
         }
 
-        if(xids == null) {
-            return;
+        LinkedList<Xid> mySubordinateXids = new LinkedList<Xid>();
+
+        if(allSubordinateXids == null) {
+            return mySubordinateXids;
         }
 
-        for(Xid xid : xids) {
-           log.trace("in-doubt Xid: "+xid);
+        for(Xid xid : allSubordinateXids) {
+            if(xid.getFormatId() == BridgeDurableParticipant.XARESOURCE_FORMAT_ID) {
+                mySubordinateXids.add(xid);
+                log.trace("in-doubt subordinate, xid: "+xid);
+            }
         }
 
-        // TODO: finish me
-
+        return mySubordinateXids;
     }
 
     /**
-     * Called by the RecoveryManager RECOVERY_BACKOFF_PERIOD seconds
-     * after the completion of the first pass
+     * Release any BridgeDurableParticipant instances that have been driven
+     * through to completion by their parent XTS transaction.
      */
+    private void cleanupRecoveredParticipants()
+    {
+        log.trace("cleanupRecoveredParticipants()");
+
+        synchronized(participantsAwaitingRecovery) {
+            Iterator<BridgeDurableParticipant> iter = participantsAwaitingRecovery.iterator();
+            while(iter.hasNext()) {
+                BridgeDurableParticipant participant = iter.next();
+                if(!participant.isAwaitingRecovery()) {
+                    iter.remove();
+                }
+            }
+        }
+    }
+
     @Override
-    public void periodicWorkSecondPass()
+    public Vote checkXid(Xid xid)
     {
-        log.trace("periodicWorkSecondPass()");
+        log.trace("checkXid("+xid+")");
+
+        if(xid.getFormatId() != BridgeDurableParticipant.XARESOURCE_FORMAT_ID) {
+            return Vote.ABSTAIN;
+        }
+
+        if(!orphanedXAResourcesAreIdentifiable) {
+            return Vote.LEAVE_ALONE;
+        }
+
+        synchronized(participantsAwaitingRecovery) {
+            for(BridgeDurableParticipant participant : participantsAwaitingRecovery) {
+                if(participant.getXid().equals(xid)) {
+                    return Vote.LEAVE_ALONE;
+                }
+            }
+        }
+
+        return Vote.ROLLBACK;
     }
 }

Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeSynchronization.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeSynchronization.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeSynchronization.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -38,9 +38,9 @@
  */
 public class BridgeSynchronization implements Synchronization
 {
-    private static Logger log = Logger.getLogger(BridgeSynchronization.class);
+    private static final Logger log = Logger.getLogger(BridgeSynchronization.class);
 
-    private BridgeWrapper bridgeWrapper;
+    private final BridgeWrapper bridgeWrapper;
 
     public BridgeSynchronization(BridgeWrapper bridgeWrapper)
     {

Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeVolatileParticipant.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeVolatileParticipant.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeVolatileParticipant.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -40,15 +40,15 @@
  */
 public class BridgeVolatileParticipant implements Volatile2PCParticipant
 {
-    private static Logger log = Logger.getLogger(BridgeVolatileParticipant.class);
+    private static final Logger log = Logger.getLogger(BridgeVolatileParticipant.class);
 
     // no standard interface for driving Synchronization phases separately
     // in JCA, so we have to use proprietary API.
-    private XATerminatorExtensions xaTerminatorExtensions;
+    private final XATerminatorExtensions xaTerminatorExtensions;
 
-    private String externalTxId;
+    private final String externalTxId;
 
-    private Xid xid;
+    private final Xid xid;
 
     /**
      * Create a new WS-AT Volatile Participant which wraps the subordinate XA tx terminator.

Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeXAResource.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeXAResource.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/BridgeXAResource.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -43,11 +43,11 @@
     // Design note: Given the way JBossTS is designed, we could subclass AbstractRecord rather than
     // implementing XAResource, but this design is more standards friendly and thus portable.
 
-    private static Logger log = Logger.getLogger(BridgeXAResource.class);
+    private static final Logger log = Logger.getLogger(BridgeXAResource.class);
 
-    private transient BridgeWrapper bridgeWrapper;
+    private final transient BridgeWrapper bridgeWrapper;
 
-    private transient Uid externalTxId;
+    private final transient Uid externalTxId;
 
     /**
      * Create a new XAResource which wraps the subordinate WS-AT transaction.

Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/InboundBridge.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/InboundBridge.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/InboundBridge.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -43,12 +43,12 @@
  */
 public class InboundBridge
 {
-	private static Logger log = Logger.getLogger(InboundBridge.class);
+	private static final Logger log = Logger.getLogger(InboundBridge.class);
 
     /**
      * Identifier for the subordinate transaction.
      */
-	private Xid xid;
+	private final Xid xid;
 
     /**
      * Create a new InboundBridge to manage the given subordinate JTA transaction.

Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/InboundBridgeManager.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/InboundBridgeManager.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/InboundBridgeManager.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -23,7 +23,7 @@
  */
 package org.jboss.jbossts.txbridge;
 
-import com.arjuna.ats.jta.xa.XidImple;
+import com.arjuna.ats.jta.xa.XATxConverter;
 import com.arjuna.ats.arjuna.common.Uid;
 import com.arjuna.mw.wst11.UserTransactionFactory;
 
@@ -45,17 +45,17 @@
  * Maintains the mapping data that relates WS-AT transactions to JTA subordinate transactions and related objects.
  *
  * The mappings are scoped to the singleton instance of this class and its lifetime.
- * This poses problems where you have more than one instances (classloading, clusters)
+ * This poses problems where you have more than one instance (classloading, clusters)
  * or where you need crash recovery. It short, it's rather limited.
  *
  * @author jonathan.halliday at redhat.com, 2007-04-30
  */
 public class InboundBridgeManager
 {
-	private static Logger log = Logger.getLogger(InboundBridgeManager.class);
+	private static final Logger log = Logger.getLogger(InboundBridgeManager.class);
 
     // maps WS-AT Tx Id to InboundBridge instance.
-	private static ConcurrentMap<String, InboundBridge> inboundBridgeMappings = new ConcurrentHashMap<String, InboundBridge>();
+	private static final ConcurrentMap<String, InboundBridge> inboundBridgeMappings = new ConcurrentHashMap<String, InboundBridge>();
 
 	/**
 	 * Return an InboundBridge instance that maps the current Thread's WS transaction context
@@ -134,7 +134,7 @@
 
         // Xid for driving the subordinate,
         // shared by the bridge (thread assoc) and Participant (termination via XATerminator)
-		Xid xid = new XidImple(new Uid());
+		Xid xid = XATxConverter.getXid(new Uid(), false, BridgeDurableParticipant.XARESOURCE_FORMAT_ID);
 
 		BridgeDurableParticipant bridgeDurableParticipant = new BridgeDurableParticipant(externalTxId, xid);
         // construct the participantId in such as way as we can recognise it at recovery time:

Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/JaxWSTxInboundBridgeHandler.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/JaxWSTxInboundBridgeHandler.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/JaxWSTxInboundBridgeHandler.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -42,7 +42,7 @@
  */
 public class JaxWSTxInboundBridgeHandler implements Handler
 {
-	private static Logger log = Logger.getLogger(JaxWSTxInboundBridgeHandler.class);
+	private static final Logger log = Logger.getLogger(JaxWSTxInboundBridgeHandler.class);
 
 	/**
 	 * Process a message. Determines if it is inbound or outbound and dispatches accordingly.

Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/JaxWSTxOutboundBridgeHandler.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/JaxWSTxOutboundBridgeHandler.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/JaxWSTxOutboundBridgeHandler.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -42,7 +42,7 @@
  */
 public class JaxWSTxOutboundBridgeHandler implements Handler
 {
-	private static Logger log = Logger.getLogger(JaxWSTxOutboundBridgeHandler.class);
+	private static final Logger log = Logger.getLogger(JaxWSTxOutboundBridgeHandler.class);
 
 	/**
 	 * Process a message. Determines if it is inbound or outbound and dispatches accordingly.

Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/OutboundBridge.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/OutboundBridge.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/OutboundBridge.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -38,12 +38,12 @@
  */
 public class OutboundBridge
 {
-    private static Logger log = Logger.getLogger(OutboundBridge.class);
+    private static final Logger log = Logger.getLogger(OutboundBridge.class);
 
     /**
      * Management object for the subordinate transaction
      */
-    private BridgeWrapper bridgeWrapper;
+    private final BridgeWrapper bridgeWrapper;
 
     /**
      * Create a new OutboundBridge to manage the given subordinate WS-AT transaction.

Modified: labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/OutboundBridgeManager.java
===================================================================
--- labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/OutboundBridgeManager.java	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/src/org/jboss/jbossts/txbridge/OutboundBridgeManager.java	2010-03-04 14:06:56 UTC (rev 31937)
@@ -49,10 +49,10 @@
  */
 public class OutboundBridgeManager
 {
-    private static Logger log = Logger.getLogger(OutboundBridgeManager.class);
+    private static final Logger log = Logger.getLogger(OutboundBridgeManager.class);
 
     // maps JTA Tx Id to OutboundBridge instance.
-    private static ConcurrentMap<Uid, OutboundBridge> outboundBridgeMappings = new ConcurrentHashMap<Uid, OutboundBridge>();
+    private static final ConcurrentMap<Uid, OutboundBridge> outboundBridgeMappings = new ConcurrentHashMap<Uid, OutboundBridge>();
 
     /**
      * Return an OutboundBridge instance that maps the current Thread's JTA transaction context

Modified: labs/jbosstm/trunk/txbridge/tests/dd/scripts/txbridge-byteman-rules.txt
===================================================================
--- labs/jbosstm/trunk/txbridge/tests/dd/scripts/txbridge-byteman-rules.txt	2010-03-04 13:46:23 UTC (rev 31936)
+++ labs/jbosstm/trunk/txbridge/tests/dd/scripts/txbridge-byteman-rules.txt	2010-03-04 14:06:56 UTC (rev 31937)
@@ -1,6 +1,14 @@
+#RULE testrule
+#CLASS ^XTSATRecoveryManager
+#METHOD writeParticipantRecoveryRecord
+#AT EXIT
+#IF true
+#DO killJVM()
+#ENDRULE
+
 RULE testrule
-CLASS ^XTSATRecoveryManager
-METHOD writeParticipantRecoveryRecord
+CLASS ^TestXAResource
+METHOD prepare
 AT EXIT
 IF true
 DO killJVM()



More information about the jboss-svn-commits mailing list