//$ bin/sessionjc -cp tests/classes/ tests/src/purdue/exceptions/1pc/exceptions/Client.sj -d tests/classes/
//$ bin/sessionj -cp tests/classes/ purdue.onepc.Client &
package purdue.onepc;
import sessionj.runtime.*;
import sessionj.runtime.net.*;
import java.util.Random;
import java.net.*;
public class Client{
participant client;
protocol OnePC {
participants: client, coordinator, worker
.client: begin
.client -> coordinator: <Long> //Start transaction ID
.ptry {
coordinator -> worker: <Long> | <Exception> // UPDATE request or Coordinator Exception
.worker -> coordinator: <Boolean> | <Exception> //ACK or NACK
.coordinator -> client: <Boolean> //ACK or NACK
}
pcatch(Exception) {
//retry:
client -> coordinator: <Boolean>
.client -> worker: <Boolean>
}
}
Random r = new Random(System.currentTimeMillis());
public void run() throws Exception
{
final noalias SJService c = SJService.create(OnePC, "localhost", 1000);
c.participantName("client");
c.addParticipant("coordinator", "sslab04.cs.purdue.edu", 21101);
c.addParticipant("worker", "mc04.cs.purdue.edu", 21102);
final noalias SJSocketGroup socket;
try(socket)
{
int exNumber = 0, numTrials = 10000, exceptionProb = 0;
socket = c.request();
System.out.println("Client connected");
Boolean bTrue = new Boolean(true);
SJSyncObject syncObj = new SJSyncObject();
Exception myException = new Exception();
Boolean b = null;
boolean ex = false;
Long XID = null;
long duration = 0;
for(exceptionProb = -30; exceptionProb <= 90; exceptionProb += 10) {
long startTime = System.nanoTime();
int exception1Count = 0, exception2Count = 0, completedTrials = 0;
for(int i = 0; i < numTrials;) {
completedTrials++;
exNumber = 0;
XID = new Long(r.nextLong());
socket.send(XID, "coordinator");
ex = randomBoolean(exceptionProb);
ptry {
socket.receiveSync("coordinator");
exNumber = 1;
socket.receiveSync("worker");
b = (Boolean) socket.receive("coordinator");
i++;
}
catch(Exception e) {
System.out.println("Client in Handler");
socket.send(bTrue, "coordinator");
socket.send(bTrue, "worker");
if(exNumber == 0)
exception1Count++;
else if(exNumber == 1)
exception2Count++;
}
}
duration = System.nanoTime() - startTime;
System.out.println("\n\nResults for exception Probability: " + exceptionProb + "%");
System.out.println("Completed Trials: " + completedTrials);
System.out.println("Average Request Time (ms): " + ((double) duration) / numTrials / 1000000.0);
System.out.println("Exception 1 rate: " + exception1Count*100.0/completedTrials + "%");
System.out.println("Exception 2 rate: " + exception2Count*100.0/completedTrials + "%");
System.out.println("Exception rate: " + (exception1Count + exception2Count)*100.0/completedTrials + "%");
}
}
finally {}
}
public static void main(String[] args) throws Exception
{
Client a = new Client();
a.run();
}
}
|