package org.infinispan.lock.singlelock.replicated.optimistic; import java.util.concurrent.CountDownLatch; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.lock.singlelock.AbstractCrashTest; import org.infinispan.test.fwk.CleanupAfterMethod; import org.infinispan.transaction.LockingMode; import org.testng.annotations.Test; /** * @author Mircea Markus * @since 5.1 */ @Test(groups = "unstable", testName = "lock.singlelock.replicated.optimistic.InitiatorCrashOptimisticReplTest", description = "See ISPN-2161 -- original group: functional") @CleanupAfterMethod public class InitiatorCrashOptimisticReplTest extends AbstractCrashTest { public InitiatorCrashOptimisticReplTest() { super(CacheMode.REPL_SYNC, LockingMode.OPTIMISTIC, false); } public InitiatorCrashOptimisticReplTest(CacheMode mode, LockingMode locking, boolean useSync) { super(mode, locking, useSync); } public void testInitiatorNodeCrashesBeforeCommit() throws Exception { TxControlInterceptor txControlInterceptor = new TxControlInterceptor(); txControlInterceptor.prepareProgress.countDown(); advancedCache(1).addInterceptor(txControlInterceptor, 1); beginAndCommitTx("k", 1); txControlInterceptor.commitReceived.await(); assertLocked(cache(0), "k"); assertEventuallyNotLocked(cache(1), "k"); assertEventuallyNotLocked(cache(2), "k"); checkTxCount(0, 0, 1); checkTxCount(1, 1, 0); checkTxCount(2, 0, 1); killMember(1); assertNotLocked("k"); eventually(new Condition() { @Override public boolean isSatisfied() throws Exception { return checkTxCount(0, 0, 0) && checkTxCount(1, 0, 0); } }); } public void testInitiatorCrashesBeforeReleasingLock() throws Exception { final CountDownLatch releaseLocksLatch = new CountDownLatch(1); prepareCache(releaseLocksLatch); beginAndCommitTx("k", 1); releaseLocksLatch.await(); assert checkTxCount(0, 0, 1); assert checkTxCount(1, 0, 0); assert checkTxCount(2, 0, 1); assertLocked(cache(0), "k"); assertEventuallyNotLocked(cache(1), "k"); assertEventuallyNotLocked(cache(2), "k"); killMember(1); eventually(new Condition() { @Override public boolean isSatisfied() throws Exception { return checkTxCount(0, 0, 0) && checkTxCount(1, 0, 0); } }); assertNotLocked("k"); assert cache(0).get("k").equals("v"); assert cache(1).get("k").equals("v"); } public void testInitiatorNodeCrashesBeforePrepare() throws Exception { TxControlInterceptor txControlInterceptor = new TxControlInterceptor(); advancedCache(1).addInterceptor(txControlInterceptor, 1); //prepare is sent, but is not precessed on other nodes because of the txControlInterceptor.preparedReceived beginAndPrepareTx("k", 1); txControlInterceptor.preparedReceived.await(); assert checkTxCount(0, 0, 1); assert checkTxCount(1, 1, 0); assert checkTxCount(2, 0, 1); killMember(1); assert caches().size() == 2; txControlInterceptor.prepareProgress.countDown(); assertNotLocked("k"); eventually(new Condition() { @Override public boolean isSatisfied() throws Exception { return checkTxCount(0, 0, 0) && checkTxCount(1, 0, 0); } }); } }