use of com.arjuna.ats.jta.xa.XidImple 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.jta.xa.XidImple 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.jta.xa.XidImple 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.jta.xa.XidImple 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);
}
use of com.arjuna.ats.jta.xa.XidImple in project narayana by jbosstm.
the class XATerminatorImpleUnitTest method testConcurrentImport.
@Test
public void testConcurrentImport() throws Exception {
AtomicInteger completionCount = new AtomicInteger(0);
XidImple xid = new XidImple(new Uid());
final int TASK_COUNT = 400;
final int THREAD_COUNT = 200;
final CyclicBarrier gate = new CyclicBarrier(THREAD_COUNT + 1);
ArrayList<CompletableFuture<SubordinateTransaction>> futures = new ArrayList<>();
ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
for (int i = 0; i < TASK_COUNT; i++) futures.add(doAsync(completionCount, gate, i < THREAD_COUNT, executor, xid));
gate.await();
SubordinateTransaction prevStx = null;
for (CompletableFuture<SubordinateTransaction> future : futures) {
SubordinateTransaction stx = future.get();
if (stx == null) {
fail("transaction import returned null for future ");
} else {
if (prevStx != null)
assertEquals("transaction import for same xid returned a different instance", stx, prevStx);
else
prevStx = stx;
}
}
assertEquals("some transaction import futures did not complete", completionCount.get(), TASK_COUNT);
}
Aggregations