use of com.arjuna.ats.internal.jta.transaction.arjunacore.jca.TransactionImporter in project narayana by jbosstm.
the class XATerminatorImpleUnitTest method testNull.
@Test
public void testNull() throws Exception {
XidImple xid = new XidImple(new Uid());
TransactionImporter imp = SubordinationManager.getTransactionImporter();
XATerminatorImple xa = new XATerminatorImple();
try {
xa.beforeCompletion(xid);
fail();
} catch (final Exception ex) {
}
try {
xa.prepare(xid);
fail();
} catch (final Exception ex) {
}
try {
xa.commit(xid, false);
fail();
} catch (final Exception ex) {
}
try {
xa.commit(xid, true);
fail();
} catch (final Exception ex) {
}
try {
xa.rollback(xid);
fail();
} catch (final Exception ex) {
}
}
use of com.arjuna.ats.internal.jta.transaction.arjunacore.jca.TransactionImporter in project narayana by jbosstm.
the class XATerminatorImpleUnitTest method testPrepareCommit.
@Test
public void testPrepareCommit() throws Exception {
XidImple xid = new XidImple(new Uid());
TransactionImporter imp = SubordinationManager.getTransactionImporter();
imp.importTransaction(xid);
XATerminatorImple xa = new XATerminatorImple();
assertTrue(xa.beforeCompletion(xid));
assertEquals(xa.prepare(xid), XAResource.XA_RDONLY);
try {
xa.commit(xid, false);
fail();
} catch (final XAException ex) {
}
imp.importTransaction(xid);
xa.commit(xid, true);
}
use of com.arjuna.ats.internal.jta.transaction.arjunacore.jca.TransactionImporter in project narayana by jbosstm.
the class XATerminatorImpleUnitTest method testAbort.
@Test
public void testAbort() throws Exception {
XidImple xid = new XidImple(new Uid());
TransactionImporter imp = SubordinationManager.getTransactionImporter();
imp.importTransaction(xid);
XATerminatorImple xa = new XATerminatorImple();
xa.rollback(xid);
}
use of com.arjuna.ats.internal.jta.transaction.arjunacore.jca.TransactionImporter in project narayana by jbosstm.
the class XATerminatorImpleUnitTest method testDoRecover.
@Test
public void testDoRecover() throws Exception {
Implementations.initialise();
Implementationsx.initialise();
Xid xid1 = XidUtils.getXid(new Uid(), false);
Xid xid2 = XidUtils.getXid(new Uid(), false);
TransactionImporter imp = SubordinationManager.getTransactionImporter();
SubordinateTransaction subTxn1 = imp.importTransaction(xid1);
SubordinateTransaction subTxn2 = imp.importTransaction(xid2);
XATerminatorImple xaTerminator = new XATerminatorImple();
subTxn1.enlistResource(new XAResourceImple(XAResource.XA_OK));
subTxn2.enlistResource(new XAResourceImple(XAResource.XA_OK));
try {
subTxn1.doPrepare();
subTxn2.doPrepare();
Xid[] xidsAll = xaTerminator.doRecover(null, null);
Assert.assertNotNull("expecting some unfinished transactions to be returned but they are null", xidsAll);
Assert.assertTrue("expecting some unfinished transactions to be returned but there is none", xidsAll.length > 1);
} finally {
subTxn1.doCommit();
subTxn2.doCommit();
}
}
use of com.arjuna.ats.internal.jta.transaction.arjunacore.jca.TransactionImporter in project narayana by jbosstm.
the class XATerminatorImpleUnitTest method testXARMERR.
@Test
public void testXARMERR() throws Exception {
Uid uid = new Uid();
XidImple xid = new XidImple(uid);
TransactionImporter imp = SubordinationManager.getTransactionImporter();
SubordinateTransaction subordinateTransaction = imp.importTransaction(xid);
Uid savingUid = getImportedSubordinateTransactionUid(subordinateTransaction);
subordinateTransaction.enlistResource(new TestXAResource() {
@Override
public void commit(Xid xid, boolean b) throws XAException {
this.xid = null;
}
@Override
public int prepare(Xid xid) throws XAException {
return 0;
}
@Override
public void rollback(Xid xid) throws XAException {
fail("Resource was rolled back");
}
});
subordinateTransaction.enlistResource(new TestXAResource() {
@Override
public void commit(Xid xid, boolean b) throws XAException {
throw new XAException(XAException.XA_HEURHAZ);
}
@Override
public int prepare(Xid xid) throws XAException {
failedResourceXid = xid;
return 0;
}
@Override
public void rollback(Xid xid) throws XAException {
fail("Resource was rolled back");
}
});
XATerminatorImple xa = new XATerminatorImple();
xa.prepare(xid);
try {
xa.commit(xid, false);
fail("Expecting heuristic mixed exception being thrown on commit");
} catch (final XAException ex) {
assertEquals(XAException.XA_HEURMIX, ex.errorCode);
}
try {
xa.commit(xid, false);
} catch (XAException e) {
assertEquals(XAException.XA_RETRY, e.errorCode);
}
ObjStoreBrowser osb = new ObjStoreBrowser();
osb.viewSubordinateAtomicActions(true);
osb.setExposeAllRecordsAsMBeans(true);
osb.start();
osb.probe();
Set<ObjectName> participants = JMXServer.getAgent().queryNames("jboss.jta:type=ObjectStore,itype=" + com.arjuna.ats.internal.jta.transaction.jts.subordinate.jca.coordinator.ServerTransaction.getType().substring(1) + ",uid=" + savingUid.stringForm().replaceAll(":", "_") + ",puid=*", null);
assertEquals(1, participants.size());
JMXServer.getAgent().getServer().invoke(participants.iterator().next(), "clearHeuristic", null, null);
xa.recover(XAResource.TMSTARTRSCAN);
xa.recover(XAResource.TMENDRSCAN);
Set<ObjectName> xaResourceRecords = JMXServer.getAgent().queryNames("jboss.jta:type=ObjectStore,itype=" + XAResourceRecord.typeName().substring(1) + ",uid=*", null);
for (ObjectName xaResourceRecord : xaResourceRecords) {
Object getGlobalTransactionId = JMXServer.getAgent().getServer().getAttribute(xaResourceRecord, "GlobalTransactionId");
Object getBranchQualifier = JMXServer.getAgent().getServer().getAttribute(xaResourceRecord, "BranchQualifier");
if (Arrays.equals(failedResourceXid.getGlobalTransactionId(), (byte[]) getGlobalTransactionId) && Arrays.equals(failedResourceXid.getBranchQualifier(), (byte[]) getBranchQualifier)) {
Object getHeuristicValue = JMXServer.getAgent().getServer().getAttribute(xaResourceRecord, "HeuristicValue");
assertTrue(getHeuristicValue.equals(new Integer(6)));
JMXServer.getAgent().getServer().invoke(xaResourceRecord, "clearHeuristic", null, null);
}
}
XARecoveryModule xaRecoveryModule = new XARecoveryModule();
xaRecoveryModule.addXAResourceRecoveryHelper(new XAResourceRecoveryHelper() {
@Override
public boolean initialise(String p) throws Exception {
return false;
}
@Override
public XAResource[] getXAResources() throws Exception {
return new XAResource[] { new TestXAResource() {
public Xid[] recover(int var) throws XAException {
if (var == XAResource.TMSTARTRSCAN) {
if (failedResourceXid != null) {
return new Xid[] { failedResourceXid };
}
}
return new Xid[0];
}
@Override
public void commit(Xid xid, boolean b) throws XAException {
failedResourceXid = null;
}
@Override
public int prepare(Xid xid) throws XAException {
return 0;
}
@Override
public void rollback(Xid xid) throws XAException {
fail("Resource was rolled back");
}
} };
}
});
xaRecoveryModule.periodicWorkFirstPass();
Field safetyIntervalMillis = RecoveryXids.class.getDeclaredField("safetyIntervalMillis");
safetyIntervalMillis.setAccessible(true);
Object o1 = safetyIntervalMillis.get(null);
safetyIntervalMillis.set(null, 0);
try {
xaRecoveryModule.periodicWorkSecondPass();
} finally {
safetyIntervalMillis.set(null, o1);
}
xa.recover(XAResource.TMSTARTRSCAN);
try {
xa.commit(xid, false);
Assert.fail("Expecting XAException being thrown indicating more recover to be called");
} catch (XAException expected) {
Assert.assertTrue("On commit XAException error code indicating more recover call is expected but it's " + expected.errorCode, XAException.XA_RETRY == expected.errorCode || XAException.XAER_RMFAIL == expected.errorCode);
} finally {
xa.recover(XAResource.TMENDRSCAN);
}
assertNull(failedResourceXid);
}
Aggregations