package core;
/**
* Copyright 2011 Thibault Dory
* Licensed under the GPL Version 3 license
*/
import implementations.cassandraDB;
import implementations.hbaseDB;
import implementations.mongoDB;
import implementations.riakDB;
import implementations.scalarisDB;
import implementations.terrastoreDB;
import implementations.voldermortDB;
import java.util.ArrayList;
import javax.print.attribute.standard.NumberOfDocuments;
/**
* Main class used to start the benchmark
* @author Thibault Dory
* @version 0.1
*/
public class runBenchmark {
static int readPercentage;
public static int numberOfConnectErrors;
public static int numberOfReadErrors;
public static int numberOfUpdateErrors;
public static ArrayList<Double> finalResults;
public static void main(String[] args) {
//Handle arguments
String dbType = args[0];
int dbTypeI;
if(dbType.equals("cassandra")) dbTypeI = 0;
else if(dbType.equals("scalaris")) dbTypeI = 1;
else if(dbType.equals("voldemort")) dbTypeI = 2;
else if(dbType.equals("terrastore")) dbTypeI = 3;
else if(dbType.equals("riak")) dbTypeI = 4;
else if(dbType.equals("mongodb")) dbTypeI = 5;
else if(dbType.equals("hbase")) dbTypeI = 6;
else dbTypeI = -1;
boolean goodInts;
int numberOfOperations=0;
readPercentage=0;
try{
readPercentage = Integer.decode(args[2]);
numberOfOperations = Integer.decode(args[1]);
goodInts = true;
}catch(Exception e){
goodInts = false;
}
int numberOfDocuments;
int startnodeL;
if(goodInts){
numberOfDocuments = Integer.decode(args[3]);
startnodeL = 4;
}else{
numberOfDocuments = 1;
startnodeL = 3;
}
ArrayList<String> nodeList = new ArrayList<String>();
for(int i =startnodeL; i<args.length;i++){
nodeList.add(args[i]);
}
//Start the benchmark if the arguments are OK
if(dbTypeI>=0 && goodInts){
ArrayList<Long> results = new ArrayList<Long>();
long t0 = System.nanoTime();
results.add(startBench(numberOfOperations,nodeList,readPercentage,dbTypeI,numberOfDocuments));
int runs = 1;
while(runs <= 9){
results.add(startBench(numberOfOperations,nodeList,readPercentage,dbTypeI,numberOfDocuments));
runs += 1;
}
long t1 = System.nanoTime();
double totalTime = (t1-t0)/1000000000.0;
System.out.println("Total time for all runs "+runs+" : "+totalTime);
ArrayList<Double> resultsInSeconds = new ArrayList<Double>();
for(int i=0;i<results.size();i++){
resultsInSeconds.add(i,results.get(i)/ 1000000000.0);
}
finalResults = resultsInSeconds;
System.out.println("Individual times : "+resultsInSeconds);
}else {
System.out.println("Starting search benchmark");
ArrayList<Double> res = startBenchSearch(dbTypeI,nodeList);
finalResults = res;
System.out.println("Results : "+res);
}
}
/**
* This function does the actual job of starting all the benchmark thread
* @param numberOfOperations
* @param nodeList
* @param readPercentage
* @param dbTypeI
* @return the time taken for all the thread to finish their work in nano seconds
*/
public static long startBench(int numberOfOperations, ArrayList<String> nodeList, int readPercentage, int dbTypeI, int numberOfDocuments){
int numberOfOperationByThread = numberOfOperations/nodeList.size();
benchThread t[] = new benchThread[nodeList.size()];
//Start all the threads
long t0 = System.nanoTime();
for(int i=0;i<nodeList.size();i++){
System.out.println("starting thread "+i);
BenchDB db;
switch(dbTypeI){
case 0:
db = new cassandraDB();
break;
case 1:
db = new scalarisDB();
break;
case 2:
db = new voldermortDB();
break;
case 3:
db = new terrastoreDB();
break;
case 4:
db = new riakDB();
break;
case 5:
db = new mongoDB();
break;
case 6:
db = new hbaseDB();
break;
default:
db = new cassandraDB();
break;
}
t[i] = new benchThread(db, nodeList.get(i), readPercentage, numberOfOperationByThread, numberOfDocuments);
t[i].start();
}
//Wait until all the threads end
for(int i=0;i<nodeList.size();i++){
try {
t[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
long t1 = System.nanoTime();
double seconds = (t1 - t0) / 1000000000.0;
System.out.println("time for "+ numberOfOperations +" requests : " + seconds +" seconds");
return t1 - t0;
}
/**
* This function calls
* @param dbTypeI
* @param nodeList
* @return
*/
public static ArrayList<Double> startBenchSearch(int dbTypeI,ArrayList<String> nodeList){
BenchDB db;
switch(dbTypeI){
case 0:
db = new cassandraDB();
break;
case 1:
db = new scalarisDB();
break;
case 2:
db = new voldermortDB();
break;
case 3:
db = new terrastoreDB();
break;
case 4:
db = new riakDB();
break;
case 5:
db = new mongoDB();
break;
case 6:
db = new hbaseDB();
break;
default:
db = new riakDB();
break;
}
db.connectNode(nodeList.get(0));
ArrayList<Double> Results = new ArrayList<Double>();
//Caution! Here the readPercentage is used as the number of runs for the MapReduce benchmark
for(int i= 0; i<readPercentage;i++){
long t0 = System.nanoTime();
//I have chosen arbitrarily to use this keyword
//Be carefull it is hardcoded for the HBase implementation for now
db.searchDB("location");
long t1 = System.nanoTime();
double seconds = (t1 - t0) / 1000000000.0;
System.out.println("Search "+i+" took "+seconds+" seconds");
Results.add(seconds);
}
return Results;
}
}