package org.infinispan.container.versioning;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.fail;
import javax.transaction.RollbackException;
import javax.transaction.Transaction;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
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.infinispan.util.concurrent.IsolationLevel;
import org.testng.annotations.Test;
@Test(testName = "container.versioning.VersionedReplStateTransferTest", groups = "functional")
@CleanupAfterMethod
public class VersionedReplStateTransferTest extends MultipleCacheManagersTest {
ConfigurationBuilder builder;
@Override
protected void createCacheManagers() throws Throwable {
builder = TestCacheManagerFactory.getDefaultCacheConfiguration(true);
builder.clustering().cacheMode(CacheMode.REPL_SYNC)
.locking().isolationLevel(IsolationLevel.REPEATABLE_READ)
.transaction().lockingMode(LockingMode.OPTIMISTIC);
amendConfig(builder);
createCluster(builder, 2);
waitForClusterToForm();
}
protected void amendConfig(ConfigurationBuilder builder) {
}
public void testStateTransfer() throws Exception {
Cache<Object, Object> cache0 = cache(0);
Cache<Object, Object> cache1 = cache(1);
cache0.put("hello", "world");
assertEquals("world", cache0.get("hello"));
assertEquals("world", cache1.get("hello"));
tm(1).begin();
assertEquals("world", cache1.get("hello"));
Transaction t = tm(1).suspend();
// create a cache2
addClusterEnabledCacheManager(builder);
Cache<Object, Object> cache2 = cache(2);
assertEquals("world", cache2.get("hello"));
cacheManagers.get(0).stop();
cacheManagers.remove(0);
TestingUtil.waitForNoRebalance(caches());
// Cause a write skew
cache2.put("hello", "new world");
tm(1).resume(t);
cache1.put("hello", "world2");
try {
tm(1).commit();
fail("Write skew check should fail");
} catch (RollbackException expected) {
// Expected
}
assertEquals("new world", cache1.get("hello"));
assertEquals("new world", cache2.get("hello"));
}
}