package org.infinispan.lock; import org.infinispan.Cache; import org.infinispan.commands.tx.VersionedPrepareCommand; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.distribution.MagicKey; import org.infinispan.interceptors.AsyncInterceptorChain; import org.infinispan.interceptors.distribution.VersionedDistributionInterceptor; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.test.TestingUtil; import org.infinispan.test.fwk.CleanupAfterMethod; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.annotations.Test; @Test(testName = "lock.StaleLocksOnPrepareFailureTest", groups = "functional") @CleanupAfterMethod public class StaleLocksOnPrepareFailureTest extends MultipleCacheManagersTest { private static final int NUM_CACHES = 10; @Override protected void createCacheManagers() throws Throwable { ConfigurationBuilder cfg = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true); cfg.clustering().hash().numOwners(NUM_CACHES) .locking().lockAcquisitionTimeout(TestingUtil.shortTimeoutMillis()); for (int i = 0; i < NUM_CACHES; i++) { EmbeddedCacheManager cm = TestCacheManagerFactory.createClusteredCacheManager(cfg); registerCacheManager(cm); } waitForClusterToForm(); } public void testModsCommit() throws Exception { Cache<Object, Object> c1 = cache(0); Cache<Object, Object> c2 = cache(NUM_CACHES /2); // force the prepare command to fail on c2 FailInterceptor interceptor = new FailInterceptor(); interceptor.failFor(VersionedPrepareCommand.class); AsyncInterceptorChain ic = c2.getAdvancedCache().getAsyncInterceptorChain(); ic.addInterceptorBefore(interceptor, VersionedDistributionInterceptor.class); MagicKey k1 = new MagicKey("k1", c1); tm(c1).begin(); c1.put(k1, "v1"); try { tm(c1).commit(); assert false : "Commit should have failed"; } catch (Exception e) { // expected } for (int i = 0; i < NUM_CACHES; i++) { assertEventuallyNotLocked(cache(i), k1); } } }