package org.infinispan.server.memcached;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
import org.infinispan.Cache;
import org.infinispan.commons.equivalence.ByteArrayEquivalence;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.distribution.DistributionTestHelper;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.Test;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.internal.OperationFuture;
/**
* Tests distributed mode with Memcached servers.
*
* @author Galder ZamarreƱo
* @since 6.0
*/
@Test(groups = "functional", testName = "server.memcached.MemcachedDistributionTest")
public class MemcachedDistributionTest extends MemcachedMultiNodeTest {
public EmbeddedCacheManager createCacheManager(int index) {
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.clustering().cacheMode(CacheMode.DIST_SYNC).hash().numOwners(1)
.dataContainer().valueEquivalence(ByteArrayEquivalence.INSTANCE);
return TestCacheManagerFactory.createClusteredCacheManager(
GlobalConfigurationBuilder.defaultClusteredBuilder().defaultCacheName(cacheName),
builder);
}
public void testGetFromNonOwner() throws InterruptedException, ExecutionException, TimeoutException {
MemcachedClient owner = getFirstOwner("1");
OperationFuture<Boolean> f = owner.set("1", 0, "v1");
assertTrue(f.get(timeout, TimeUnit.SECONDS));
MemcachedClient nonOwner = getFirstNonOwner("1");
assertEquals(nonOwner.get("1"), "v1");
}
private MemcachedClient getFirstNonOwner(String k) {
return getCacheThat(k, false);
}
private MemcachedClient getFirstOwner(String k) {
return getCacheThat(k, true);
}
private MemcachedClient getCacheThat(String k, Boolean owner) {
List<Cache<String, byte[]>> caches = servers.stream().map(s -> {
Cache<String, byte[]> cache = s.getCacheManager().getCache(cacheName);
return cache;
}).collect(Collectors.toList());
Cache<String, byte[]> cache;
if (owner) {
cache = DistributionTestHelper.getFirstOwner(k, caches);
} else {
cache = DistributionTestHelper.getFirstNonOwner(k, caches);
}
return cacheClient.get(cache);
}
}