/*
* Copyright 2011 Red Hat, Inc. and/or its affiliates.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
package org.infinispan.container.versioning;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.VersioningScheme;
import org.infinispan.test.MultipleCacheManagersTest;
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;
import javax.transaction.RollbackException;
import javax.transaction.Transaction;
@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)
.versioning()
.enable()
.scheme(VersioningScheme.SIMPLE)
.locking()
.isolationLevel(IsolationLevel.REPEATABLE_READ)
.writeSkewCheck(true)
.transaction()
.lockingMode(LockingMode.OPTIMISTIC)
.syncCommitPhase(true);
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");
assert "world".equals(cache0.get("hello"));
assert "world".equals(cache1.get("hello"));
tm(1).begin();
assert "world".equals(cache1.get("hello"));
Transaction t = tm(1).suspend();
// create a cache2
addClusterEnabledCacheManager(builder);
Cache<Object, Object> cache2 = cache(2);
assert "world".equals(cache2.get("hello"));
cacheManagers.get(0).stop();
// Cause a write skew
cache2.put("hello", "new world");
tm(1).resume(t);
cache1.put("hello", "world2");
try {
tm(1).commit();
assert false : "Should fail";
} catch (RollbackException expected) {
// Expected
}
assert "new world".equals(cache(1).get("hello"));
assert "new world".equals(cache(2).get("hello"));
}
}