package core;
/**
* Copyright 2011 Thibault Dory
* Licensed under the GPL Version 3 license
*/
import java.util.Random;
/**
* This class does the actual job of the benchmark
* @author Thibault Dory
* @version 0.1
*/
public class benchThread extends Thread{
Random generator = new Random();
int numberOfOperationsDone = 0;
int numberOfUpdates =0;
BenchDB db;
String nodeAddress;
int readPercentage;
int numberOfOperations;
int numberOfDocuments;
/**
* Constructor of the class
* @param dbA is a DB object initialized
* @param nodeAddressA is the node address to connect to
* @param readPercentageA is the percentage of requests that will be only reads
* @param numberOfOperationsA is the total number of requests that will be made by this thread
*/
public benchThread(BenchDB dbA, String nodeAddressA, int readPercentageA, int numberOfOperationsA, int numberOfDocumentsA){
db = dbA;
nodeAddress = nodeAddressA;
readPercentage = readPercentageA;
numberOfOperations = numberOfOperationsA;
numberOfDocuments = numberOfDocumentsA;
}
/**
* This function is called when the thread is started
*/
public void run(){
int countConnectErrors = 0;
int countReadErrors = 0;
int countUpdateErrors = 0;
while(!connect()){
countConnectErrors += 1;
System.out.println("This thread cannot connect to : "+nodeAddress+" retrying new attempt : "+countConnectErrors);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;i<=numberOfOperations;i++){
//Generate a random ID in the range of the document
int ID = generator.nextInt(numberOfDocuments)+1;
String document = db.readDB(String.valueOf(ID));
if(document == null){
System.out.println("Thread cannot read ID : "+ID+"for node : "+nodeAddress);
countReadErrors += 1;
}
//Update if randomUpdate > readPercentage to have ~readPercentage % of read only
int randomUpdate = generator.nextInt(100);
if(randomUpdate > readPercentage){
String newDocument = modify(document);
int ret = db.updateDB(String.valueOf(ID), newDocument);
numberOfUpdates += 1;
if(ret < 0){
System.out.println("Thread cannot update for node : "+nodeAddress);
countUpdateErrors += 1;
}
}
numberOfOperationsDone += 1;
}
System.out.println("the thread has done "+numberOfOperationsDone+" operations and "+numberOfUpdates+" updates with "+countConnectErrors+" errors");
runBenchmark.numberOfConnectErrors += countConnectErrors;
runBenchmark.numberOfReadErrors += countReadErrors;
runBenchmark.numberOfUpdateErrors += countUpdateErrors;
db.close();
return;
}
private boolean connect(){
boolean ret;
try{
int res = db.connectNode(nodeAddress);
if(res == 1) ret = true;
else ret = false;
}catch(Exception e){
ret = false;
}
return ret;
}
/**
* Function used to modify the document
* @param document the original document
* @return the modified document
*/
private String modify(String document) {
// String newDocument = document + "<lorem> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed adipiscing orci at erat " +
// "consectetur blandit. Suspendisse feugiat eros nec ante scelerisque et gravida tortor ultrices. Nulla diam felis, " +
// "vestibulum nec venenatis id, dapibus vitae enim. Nullam porta volutpat ipsum, sit amet sagittis risus dapibus at. " +
// "Sed diam nibh, eleifend id feugiat vitae, fringilla id odio. Integer est arcu, mattis non vehicula non, dictum sit " +
// "amet neque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas dapibus " +
// "libero at felis ultricies eleifend. Vivamus luctus blandit libero sed hendrerit. Vestibulum faucibus fermentum turpis, " +
// "quis dictum risus volutpat vel.Nam dolor lacus, facilisis eget placerat id, rhoncus ut diam. Duis pharetra quam et nibh " +
// "fermentum et feugiat nulla tincidunt. Pellentesque molestie ligula eget justo pulvinar ut pellentesque mi placerat. " +
// "Ut at odio vitae nisl pharetra porta ac nec tortor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, " +
// "per inceptos himenaeos. Maecenas lobortis massa at purus venenatis gravida. Pellentesque consequat ultrices ante, quis " +
// "dignissim ligula venenatis placerat. Fusce et diam in velit blandit rhoncus vitae sed nibh. Morbi quis libero eros, " +
// "fermentum vulputate neque. Mauris non felis eget felis ornare porta. In sit amet felis felis. Nunc nisl sapien, " +
// "gravida eu mollis ut, faucibus vel diam. Fusce blandit dui sed massa rutrum lacinia. Duis eleifend posuere sagittis. " +
// "Pellentesque vel tellus ligula. Nullam ac dolor vel nisl molestie dictum at vel erat.Fusce sed massa nisi. Curabitur " +
// "fermentum placerat tortor, a condimentum odio placerat ac. Aenean vitae dolor velit. Vivamus consectetur ante dui, eget " +
// "dapibus tortor. Suspendisse sed turpis eu felis tincidunt accumsan. Mauris tempor massa id purus placerat pulvinar. </lorem>";
String newDocument = document + "1";
return newDocument;
}
}