package org.infinispan.persistence.remote.upgrade;
import static java.util.stream.IntStream.range;
import static org.testng.Assert.assertEquals;
import java.util.concurrent.atomic.AtomicInteger;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.test.AbstractInfinispanTest;
import org.infinispan.upgrade.RollingUpgradeManager;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@Test(testName = "upgrade.hotrod.HotRodUpgradeStressTest", groups = "stress")
public class HotRodUpgradeStressTest extends AbstractInfinispanTest {
private static final String CACHE_NAME = "stress";
private TestCluster sourceCluster, targetCluster;
@BeforeClass
public void setup() throws Exception {
sourceCluster = new TestCluster.Builder().setName("sourceCluster").setNumMembers(2)
.cache().name(CACHE_NAME)
.build();
targetCluster = new TestCluster.Builder().setName("targetCluster").setNumMembers(2)
.cache().name(CACHE_NAME).remotePort(sourceCluster.getHotRodPort())
.build();
}
@AfterClass
public void tearDown() {
targetCluster.destroy();
sourceCluster.destroy();
}
void loadSourceCluster(int entries) {
RemoteCache<String, String> remoteCache = sourceCluster.getRemoteCache(CACHE_NAME);
AtomicInteger count = new AtomicInteger(0);
range(0, entries).boxed().parallel().map(String::valueOf).forEach(k -> {
remoteCache.put(k, "value" + k);
int progress = count.incrementAndGet();
if (progress % 10_000 == 0) {
System.out.printf("Loaded %d\n", progress);
}
});
}
@Test
public void testMigrate() throws Exception {
loadSourceCluster(1_000_000);
long start = System.currentTimeMillis();
RollingUpgradeManager rum = targetCluster.getRollingUpgradeManager(CACHE_NAME);
rum.synchronizeData("hotrod", 1000, 5);
System.out.println("Elapsed (s): " + (System.currentTimeMillis() - start) / 1000);
rum.disconnectSource("hotrod");
assertEquals(targetCluster.getRemoteCache(CACHE_NAME).size(), sourceCluster.getRemoteCache(CACHE_NAME).size());
}
}