package lsr.paxos.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
import lsr.paxos.client.Client;
import lsr.paxos.client.ReplicationException;
/**
* One-threaded client that uses a byte[] (if set, randoms it every request) and
* sends it once it received answer for the previous request.
*/
public class GenericClient {
private Client client;
private final Random random = new Random();
private final byte[] request;
private final boolean randomRequests;
public GenericClient(int requestSize, boolean randomRequests) {
this.randomRequests = randomRequests;
request = new byte[requestSize];
}
public void run() throws IOException, ReplicationException {
client = new Client();
client.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line;
line = reader.readLine();
if (line == null) {
break;
}
String[] args = line.split(" ");
if (args[0].equals("bye")) {
System.exit(0);
}
if (args.length != 3) {
System.err.println("Wrong command length! Expected:");
instructions();
continue;
}
int delay;
int maxRequests;
boolean isRandom;
try {
delay = Integer.parseInt(args[0]);
maxRequests = Integer.parseInt(args[1]);
isRandom = Boolean.parseBoolean(args[2]);
} catch (NumberFormatException e) {
System.err.println("Wrong argument! Expected:");
instructions();
continue;
}
execute(delay, maxRequests, isRandom);
}
}
private void execute(int delay, int maxRequests, boolean isRandom) throws ReplicationException {
long duration = 0;
for (int i = 0; i < maxRequests; i++) {
if (delay != 0 && i != 0) {
try {
Thread.sleep(isRandom ? random.nextInt(delay) : delay);
} catch (InterruptedException e) {
break;
}
}
if (randomRequests)
random.nextBytes(request);
long start = System.currentTimeMillis();
client.execute(request);
duration += System.currentTimeMillis() - start;
}
System.err.println(String.format("Finished %d %4.2f\n", duration, (double) maxRequests /
duration));
}
private static void showUsage() {
System.out.println("EchoClient <requestSize> <randomEachRequest>");
}
private static void instructions() {
System.out.println("Command: <delay> <maxRequests> <isRandom>");
}
public static void main(String[] args) throws IOException, ReplicationException {
if (args.length != 2) {
showUsage();
System.exit(1);
}
instructions();
GenericClient client = new GenericClient(Integer.parseInt(args[0]),
Boolean.parseBoolean(args[1]));
client.run();
}
}