[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