package org.infinispan.tx.lockreordering;
import org.infinispan.commons.hash.MurmurHash3;
import org.infinispan.config.Configuration;
import org.infinispan.test.MultipleCacheManagersTest;
import org.testng.annotations.Test;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import static org.infinispan.tx.lockreordering.LocalLockReorderingTest.runTest;
/**
* @author Mircea Markus
* @since 5.1
*/
@Test (groups = "functional", testName = "tx.lockreordering.DistLockReorderingTest")
public class DistLockReorderingTest extends MultipleCacheManagersTest {
List keys;
protected Configuration.CacheMode cacheMode = Configuration.CacheMode.DIST_SYNC;
@Override
protected void createCacheManagers() throws Throwable {
final Configuration c = getDefaultClusteredConfig(cacheMode, true);
c.fluent().transaction().cacheStopTimeout(1);
c.fluent().transaction().locking().lockAcquisitionTimeout(30000L);//timeouts are possible otherwise
createCluster(c, 2);
waitForClusterToForm();
buildKeys();
}
void buildKeys() {
int node = (int) (System.nanoTime() % 2);
/** this is what's used for inducing ordering */
MurmurHash3 hashFunction = new MurmurHash3();
keys = new ArrayList<Integer>(2);
final Object firstKey = getKeyForCache(node);
keys.add(firstKey);
while (keys.size() < 2) {
final Object keyForCache = getKeyForCache(node);
final int hash = hashFunction.hash(keyForCache);
if (hash != hashFunction.hash(firstKey)) keys.add(keyForCache);
}
}
public void testWithPut(Method m) throws Exception {
runTest(StresserThread.PUT_PERFORMER, cache(0), cache(1), keys, getThreadPrefix(m));
}
public void testWithRemove(Method m) throws InterruptedException {
runTest(StresserThread.REMOVE_PERFORMER, cache(0), cache(1), keys, getThreadPrefix(m));
}
public void testWithPutAll(Method m) throws InterruptedException {
runTest(StresserThread.PUT_ALL_PERFORMER, cache(0), cache(1), keys, getThreadPrefix(m));
}
public void testMixed(Method m) throws InterruptedException {
runTest(StresserThread.MIXED_OPS_PERFORMER, cache(0), cache(1), keys, getThreadPrefix(m));
}
private String getThreadPrefix(Method m) {
return getClass().getSimpleName() + "." + m.getName();
}
}