package org.infinispan.lock;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNull;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.distribution.MagicKey;
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.infinispan.transaction.LockingMode;
import org.testng.annotations.Test;
@Test(testName = "lock.APIDistTest", groups = "functional")
@CleanupAfterMethod
public class APIDistTest extends MultipleCacheManagersTest {
EmbeddedCacheManager cm1, cm2;
MagicKey key; // guaranteed to be mapped to cache2
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder cfg = createConfig();
cm1 = TestCacheManagerFactory.createClusteredCacheManager(cfg);
cm2 = TestCacheManagerFactory.createClusteredCacheManager(cfg);
registerCacheManager(cm1, cm2);
cm1.getCache();
waitForClusterToForm();
key = new MagicKey("Key mapped to Cache2", cm2.getCache());
}
protected ConfigurationBuilder createConfig() {
ConfigurationBuilder cfg = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true);
cfg
.transaction().lockingMode(LockingMode.PESSIMISTIC)
.clustering().l1().disable().hash().numOwners(1)
.locking().lockAcquisitionTimeout(TestingUtil.shortTimeoutMillis());
return cfg;
}
public void testLockAndGet() throws SystemException, NotSupportedException {
Cache<MagicKey, String> cache1 = cache(0), cache2 = cache(1);
cache1.put(key, "v");
assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1";
assert "v".equals(cache2.get(key)) : "Could not find key " + key + " on cache2";
tm(0).begin();
log.trace("About to lock");
cache1.getAdvancedCache().lock(key);
log.trace("About to get");
assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1";
tm(0).rollback();
}
public void testLockAndGetAndPut() throws SystemException, NotSupportedException, RollbackException, HeuristicRollbackException, HeuristicMixedException {
Cache<MagicKey, String> cache1 = cache(0), cache2 = cache(1);
cache1.put(key, "v");
assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1";
assert "v".equals(cache2.get(key)) : "Could not find key " + key + " on cache2";
tm(0).begin();
cache1.getAdvancedCache().lock(key);
assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1";
String old = cache1.put(key, "new_value");
assert "v".equals(old) : "Expected v, was " + old;
log.trace("Before commit!");
tm(0).commit();
assertEquals("Could not find key " + key + " on cache 1.", "new_value", cache1.get(key));
assertEquals("Could not find key " + key + " on cache 2.", "new_value", cache2.get(key));
}
public void testLockAndPutRetval() throws SystemException, NotSupportedException, RollbackException, HeuristicRollbackException, HeuristicMixedException {
Cache<MagicKey, String> cache1 = cache(0), cache2 = cache(1);
cache1.put(key, "v");
assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1";
assert "v".equals(cache2.get(key)) : "Could not find key " + key + " on cache2";
tm(0).begin();
cache1.getAdvancedCache().lock(key);
String old = cache1.put(key, "new_value");
assert "v".equals(old) : "Expected v, was " + old;
tm(0).commit();
assertEquals("Could not find key " + key + " on cache 1.", "new_value", cache1.get(key));
assertEquals("Could not find key " + key + " on cache 2.", "new_value", cache2.get(key));
}
public void testLockAndRemoveRetval() throws SystemException, NotSupportedException, RollbackException, HeuristicRollbackException, HeuristicMixedException {
Cache<MagicKey, String> cache1 = cache(0), cache2 = cache(1);
cache1.put(key, "v");
assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1";
assert "v".equals(cache2.get(key)) : "Could not find key " + key + " on cache2";
tm(0).begin();
cache1.getAdvancedCache().lock(key);
String old = cache1.remove(key);
assert "v".equals(old) : "Expected v, was " + old;
tm(0).commit();
assertNull("Could not find key " + key + " on cache 1.", cache1.get(key));
assertNull("Could not find key " + key + " on cache 2.", cache2.get(key));
}
}