package org.infinispan.tx.recovery;
import static org.infinispan.tx.recovery.RecoveryTestUtil.beginAndSuspendTx;
import static org.infinispan.tx.recovery.RecoveryTestUtil.prepareTransaction;
import static org.testng.AssertJUnit.assertEquals;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.test.MultipleCacheManagersTest;
import org.infinispan.test.TestingUtil;
import org.infinispan.transaction.lookup.EmbeddedTransactionManagerLookup;
import org.infinispan.transaction.tm.EmbeddedTransaction;
import org.testng.annotations.Test;
/**
* @author Mircea Markus
* @since 5.0
*/
@Test(groups = "functional", testName = "tx.recovery.InDoubtXidReturnedOnceTest")
public class InDoubtXidReturnedOnceTest extends MultipleCacheManagersTest {
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder configuration = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true);
configuration
.locking()
.useLockStriping(false)
.transaction()
.transactionManagerLookup(new EmbeddedTransactionManagerLookup())
.useSynchronization(false)
.recovery()
.enable()
.clustering()
.stateTransfer()
.fetchInMemoryState(false)
.hash()
.numOwners(3);
createCluster(configuration, 4);
waitForClusterToForm();
}
public void testXidReturnedOnlyOnce() throws Throwable {
EmbeddedTransaction dummyTransaction1 = beginAndSuspendTx(this.cache(3));
prepareTransaction(dummyTransaction1);
manager(3).stop();
TestingUtil.blockUntilViewsReceived(60000, false, cache(0), cache(1), cache(2));
TestingUtil.waitForNoRebalance(cache(0), cache(1), cache(2));
EmbeddedTransaction dummyTransaction = beginAndSuspendTx(this.cache(0));
Xid[] recover = dummyTransaction.firstEnlistedResource().recover(XAResource.TMSTARTRSCAN | XAResource.TMENDRSCAN);
assertEquals(recover.length,1);
assertEquals(dummyTransaction1.getXid(), recover[0]);
}
}