package org.infinispan.lock; import javax.transaction.RollbackException; import javax.transaction.Transaction; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.distribution.MagicKey; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.test.fwk.CleanupAfterMethod; import org.infinispan.transaction.LockingMode; import org.infinispan.util.concurrent.IsolationLevel; import org.testng.AssertJUnit; import org.testng.annotations.Test; /** * Test the failures after lock acquired for Optimistic transactional caches. * * @author Pedro Ruivo * @since 6.0 */ @Test(groups = "functional", testName = "lock.OptimisticTxFailureAfterLockingTest") @CleanupAfterMethod public class OptimisticTxFailureAfterLockingTest extends MultipleCacheManagersTest { /** * ISPN-3556 */ public void testInOwner() throws Exception { //primary owner is cache(0) and the failure is executed in cache(0) doTest(0, 0); } /** * ISPN-3556 */ public void testInNonOwner() throws Exception { //primary owner is cache(1) and the failure is executed in cache(0) doTest(1, 0); } @Override protected void createCacheManagers() throws Throwable { ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true); builder.locking().isolationLevel(IsolationLevel.REPEATABLE_READ); builder.transaction().lockingMode(LockingMode.OPTIMISTIC); builder.clustering().hash().numOwners(2); createClusteredCaches(3, builder); } private void doTest(int primaryOwnerIndex, int execIndex) throws Exception { final Object key = new MagicKey(cache(primaryOwnerIndex), cache(2)); cache(primaryOwnerIndex).put(key, "v1"); tm(execIndex).begin(); AssertJUnit.assertEquals("v1", cache(execIndex).get(key)); final Transaction transaction = tm(execIndex).suspend(); cache(primaryOwnerIndex).put(key, "v2"); tm(execIndex).resume(transaction); AssertJUnit.assertEquals("v1", cache(execIndex).put(key, "v3")); try { tm(execIndex).commit(); AssertJUnit.fail("Exception expected!"); } catch (RollbackException e) { //expected } assertNoTransactions(); assertEventuallyNotLocked(cache(primaryOwnerIndex), key); } }