package lsr.paxos.test;
import java.util.Random;
import java.util.concurrent.Semaphore;
import lsr.common.Configuration;
import lsr.paxos.replica.Replica;
import lsr.service.AbstractService;
public class InternalClientTest extends AbstractService {
final Semaphore requestSem;
int reqCounter;
int replCounter;
final int reqSize;
private final int localId;
private Replica replica;
private int executeSeqNo;
Thread reqSender = new Thread() {
public void run() {
try {
Random r = new Random();
while (true) {
requestSem.acquire();
if (reqCounter-- < 0)
break;
byte[] req = new byte[reqSize];
r.nextBytes(req);
req[0] = (byte) localId;
System.err.println("abcast " + requestSem.availablePermits() + " " +
reqCounter);
replica.executeNonFifo(req);
}
System.err.println(" FINISHED ABCAST ");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
};
};
{
reqSender.setDaemon(true);
reqSender.setName("ReqSender");
}
public InternalClientTest(String[] args, int localId) {
this.localId = localId;
reqCounter = replCounter = Integer.valueOf(args[1]);
requestSem = new Semaphore(Integer.valueOf(args[2]));
reqSize = Integer.valueOf(args[3]);
}
@Override
public byte[] execute(byte[] value, int executeSeqNo) {
this.executeSeqNo = executeSeqNo;
if (value[0] == (byte) localId) {
requestSem.release();
if (replCounter-- == 0)
System.err.println(" FINISHED ADELIVER " + (char) 033 + "[37m");
System.err.println(" adeliver " + requestSem.availablePermits() + " " + replCounter);
}
return new byte[0];
}
@Override
public void askForSnapshot(int lastSnapshotNextRequestSeqNo) {
forceSnapshot(lastSnapshotNextRequestSeqNo);
}
@Override
public void forceSnapshot(int lastSnapshotNextRequestSeqNo) {
fireSnapshotMade(executeSeqNo + 1, new byte[128 * reqSize], null);
}
@Override
public void updateToSnapshot(int nextRequestSeqNo, byte[] snapshot) {
this.executeSeqNo = nextRequestSeqNo - 1;
}
@Override
public void recoveryFinished() {
super.recoveryFinished();
reqSender.start();
}
public static void main(String[] args) throws Exception {
int localId = Integer.valueOf(args[0]);
InternalClientTest service = new InternalClientTest(args, localId);
Replica replica = new Replica(new Configuration(), localId,
service);
service.setReplica(replica);
replica.start();
System.in.read();
System.exit(-1);
}
public void setReplica(Replica replica) {
this.replica = replica;
}
}