package io.teknek.nibiru.sponsor;
import io.teknek.nibiru.Configuration;
import io.teknek.nibiru.ConsistencyLevel;
import io.teknek.nibiru.Server;
import io.teknek.nibiru.ServerShutdown;
import io.teknek.nibiru.TestUtil;
import io.teknek.nibiru.client.Client;
import io.teknek.nibiru.client.ClientException;
import io.teknek.nibiru.client.ColumnFamilyClient;
import io.teknek.nibiru.client.MetaDataClient;
import io.teknek.nibiru.client.Session;
import io.teknek.nibiru.engine.DefaultColumnFamily;
import io.teknek.nibiru.engine.atom.ColumnValue;
import io.teknek.nibiru.metadata.KeyspaceMetaData;
import io.teknek.nibiru.metadata.StoreMetaData;
import io.teknek.nibiru.router.TokenRouter;
import io.teknek.nibiru.transport.Response;
import io.teknek.tunit.TUnit;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
public class SponsorTest extends ServerShutdown {
@Rule
public TemporaryFolder node1Folder = new TemporaryFolder();
@Rule
public TemporaryFolder node2Folder = new TemporaryFolder();
@Test
public void test() throws ClientException, InterruptedException{
final Server[] servers = new Server[2];
TemporaryFolder [] tempFolders = { node1Folder, node2Folder};
Configuration [] cs = new Configuration[2];
for (int i = 0; i < cs.length; i++) {
cs[i] = TestUtil.aBasicConfiguration(tempFolders[i]);
cs[i].setTransportHost("127.0.0." + (i + 1));
cs[i].setClusterMembershipProperties(TestUtil.gossipPropertiesFor127Seed());
servers[i] = registerServer(new Server(cs[i]));
}
servers[0].init();
final MetaDataClient metaClient = new MetaDataClient(servers[0].getConfiguration().getTransportHost(), servers[0]
.getConfiguration().getTransportPort(), 10000, 10000);
createKeyspaceInformation(metaClient, servers);
Assert.assertEquals(servers[0].getClusterMembership().getLiveMembers().size(), 0);//We do not count ourselves
ColumnFamilyClient c = new ColumnFamilyClient(new Client(servers[0].getConfiguration().getTransportHost(), servers[0]
.getConfiguration().getTransportPort(),10000,10000));
Session session = c.createBuilder().withKeyspace("abc")
.withWriteConsistency(ConsistencyLevel.ALL, new HashMap<String, Object>())
.withReadConsistency(ConsistencyLevel.ALL, new HashMap<String, Object>())
.withStore("def").build();
for (int k = 0; k < 10; k++) {
session.put(k+"", k+"", k+"", 1);
}
servers[1].init();
TUnit.assertThat( new Callable<Integer>(){
public Integer call() throws Exception {
return servers[0].getClusterMembership().getLiveMembers().size();
}}).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo(1);
servers[1].join("abc", "127.0.0.1", "5");
Thread.sleep(1000);
Assert.assertEquals(servers[1].getServerId().getU().toString(),
servers[0].getCoordinator().getSponsorCoordinator().getProtege().getDestinationId());
insertDataOverClient(session);
assertDataIsDistributed(servers);
TUnit.assertThat( new Callable<Integer>(){
@SuppressWarnings("unchecked")
public Integer call() throws Exception {
Map<String,String> keyspaceMembers = (Map<String, String>) metaClient.getKeyspaceMetadata("abc").get(TokenRouter.TOKEN_MAP_KEY);
return keyspaceMembers.size();
}}).afterWaitingAtMost(5, TimeUnit.SECONDS).isEqualTo(2);
metaClient.shutdown();
}
private void createKeyspaceInformation(MetaDataClient metaClient, Server [] s) throws ClientException{
Map<String,Object> props = new HashMap<>();
TreeMap<String,String> tokenMap = new TreeMap<>();
tokenMap.put("10", s[0].getServerId().getU().toString());
props.put(TokenRouter.TOKEN_MAP_KEY, tokenMap);
props.put(TokenRouter.REPLICATION_FACTOR, 1);
props.put(KeyspaceMetaData.ROUTER_CLASS, TokenRouter.class.getName());
metaClient.createOrUpdateKeyspace("abc", props, true);
metaClient.createOrUpdateStore("abc", "def", new Response()
.withProperty(StoreMetaData.IMPLEMENTING_CLASS, DefaultColumnFamily.class.getName()), true);
}
private void insertDataOverClient(Session session) throws ClientException {
session.put("1", "1", "after", 8);
session.put("7", "7", "after", 8);
session.put("11", "11", "after", 8);
}
private void assertDataIsDistributed(Server [] servers){
Assert.assertEquals("after", ((ColumnValue) servers[1].get("abc", "def", "11" , "11")).getValue());
Assert.assertEquals("after", ((ColumnValue) servers[0].get("abc", "def", "1" , "1")).getValue());
Assert.assertEquals("after", ((ColumnValue) servers[1].get("abc", "def", "11" , "11")).getValue());
Assert.assertEquals("after", ((ColumnValue) servers[1].get("abc", "def", "1" , "1")).getValue());
}
}