package com.rayo.storage;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.math.RandomUtils;
import com.rayo.server.storage.model.Application;
import com.rayo.storage.cassandra.CassandraDatastore;
import com.rayo.storage.cassandra.DefaultCassandraPrimer;
public class CassandraLoadTest {
private static DefaultCassandraPrimer primer = createCassandraPrimer();
public static void main(String[] args) throws Exception {
System.out.println("Initializing load test");
CassandraDatastore store = new CassandraDatastore();
store.getSchemaHandler().setWaitForSyncing(false);
store.setPrimer(primer);
store.setPrimeTestData(true);
store.init();
List<String> addresses = new ArrayList<String>();
for (long i=0;i<5*100000;i++) {
addresses.add(randomNumber());
addresses.add(randomNumber());
addresses.add(randomSip());
addresses.add(randomToken());
addresses.add(randomToken());
}
List<Application> applications = new ArrayList<Application>();
for (int i=0;i<100000;i++) {
String appName = "load" + String.valueOf(i);
applications.add(buildApplication(appName, appName+"@tropo.com"));
}
long init = System.currentTimeMillis();
System.out.println("Populating database with " + applications.size() + " applications");
int j=0;
for (Application application: applications) {
Application stored = store.storeApplication(application);
for (int i=0;i<5;i++) {
store.storeAddress(addresses.get(j), stored.getBareJid());
j = j+1;
}
if (j % 10000 == 0) {
System.out.println ("Added " + j + " addresses");
}
}
long end = System.currentTimeMillis();
System.out.println("Time taken to add the whole data: " + (end - init) / 1000 + " seconds");
// Now we will try to read some apps.
for (int i=0;i<100;i++) {
String address = addresses.get(RandomUtils.nextInt(5*100000));
init = System.nanoTime();
Application application = store.getApplicationForAddress(address);
long ellapsed = (System.nanoTime() - init) / 1000;
System.out.println(String.format("Time taken to fetch application for address %s: %s microseconds. App id: %s", address, ellapsed, application.getAppId()));
}
}
private static String randomSip() {
return "sip:" + RandomStringUtils.randomNumeric(9)+"@tropo.com";
}
private static String randomToken() {
return RandomStringUtils.randomAlphabetic(128);
}
private static String randomNumber() {
return "+" + RandomStringUtils.randomNumeric(12);
}
public static Application buildApplication(String appId) {
return buildApplication(appId, "client@jabber.org");
}
public static Application buildApplication(String appId, String jid) {
return buildApplication(appId, jid,"staging");
}
public static Application buildApplication(String appId, String jid, String platform) {
Application application = new Application(appId, jid, platform);
application.setName("name-" + appId);
application.setAccountId("zytr-" + appId);
application.setPermissions("read,write");
return application;
}
private static DefaultCassandraPrimer createCassandraPrimer() {
DefaultCassandraPrimer primer = new DefaultCassandraPrimer();
primer.setDefaultAppName("voxeo");
primer.setDefaultPlatform("staging");
primer.setDefaultRayoUsername("rayo");
primer.setDialUris("localhost");
primer.setLoadTestAppPrefix("test");
primer.setLoadTestPrismUsername("user");
primer.setXmppServer("xmppserver");
return primer;
}
}