}
});
}
public void testNodeCrashesAfterPrepare() throws Exception {
DummyTransaction t1_1 = beginAndSuspendTx(cache(1));
prepareTransaction(t1_1);
DummyTransaction t1_2 = beginAndSuspendTx(cache(1));
prepareTransaction(t1_2);
DummyTransaction t1_3 = beginAndSuspendTx(cache(1));
prepareTransaction(t1_3);
manager(1).stop();
super.cacheManagers.remove(1);
TestingUtil.blockUntilViewReceived(cache(0), 1, 60000, false);
eventually(new Condition() {
@Override
public boolean isSatisfied() throws Exception {
int size = rm(cache(0)).getInDoubtTransactionInfo().size();
return size == 3;
}
});
List<Xid> inDoubtTransactions = rm(cache(0)).getInDoubtTransactions();
assertEquals(3, inDoubtTransactions.size());
assert inDoubtTransactions.contains(new SerializableXid(t1_1.getXid()));
assert inDoubtTransactions.contains(new SerializableXid(t1_2.getXid()));
assert inDoubtTransactions.contains(new SerializableXid(t1_3.getXid()));
configuration.fluent().transaction().transactionMode(TransactionMode.TRANSACTIONAL);
addClusterEnabledCacheManager(configuration);
defineRecoveryCache(1);
TestingUtil.blockUntilViewsReceived(60000, cache(0), cache(1));
DummyTransaction t1_4 = beginAndSuspendTx(cache(1));
prepareTransaction(t1_4);
log.trace("Before main recovery call.");
assertPrepared(4, t1_4);
//now second call would only return 1 prepared tx as we only go over the network once
assertPrepared(1, t1_4);
commitTransaction(t1_4);
assertPrepared(0, t1_4);
inDoubtTransactions = rm(cache(0)).getInDoubtTransactions();
assertEquals(3, inDoubtTransactions.size());
assert inDoubtTransactions.contains(new SerializableXid(t1_1.getXid()));
assert inDoubtTransactions.contains(new SerializableXid(t1_2.getXid()));
assert inDoubtTransactions.contains(new SerializableXid(t1_3.getXid()));
//now let's start to forget transactions
t1_4.firstEnlistedResource().forget(t1_1.getXid());
log.info("returned");
eventually(new Condition() {
@Override
public boolean isSatisfied() throws Exception {
return rm(cache(0)).getInDoubtTransactionInfo().size() == 2;
}
});
inDoubtTransactions = rm(cache(0)).getInDoubtTransactions();
assertEquals(2, inDoubtTransactions.size());
assert inDoubtTransactions.contains(new SerializableXid(t1_2.getXid()));
assert inDoubtTransactions.contains(new SerializableXid(t1_3.getXid()));
t1_4.firstEnlistedResource().forget(t1_2.getXid());
t1_4.firstEnlistedResource().forget(t1_3.getXid());
eventually(new Condition() {
@Override
public boolean isSatisfied() throws Exception {
return rm(cache(0)).getInDoubtTransactionInfo().size() == 0;
}