From 1a16f73ec3bb0eae98b4d540984f9015abe4c249 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 28 May 2008 22:14:40 +0000 Subject: all protocol classnames now have a VS prefix --- .../implementations/BerkelyTimeProtocol.java | 200 --------------------- .../implementations/BroadcastSturmProtocol.java | 106 ----------- .../protocols/implementations/DummyProtocol.java | 101 ----------- .../implementations/ExternalTimeSyncProtocol.java | 121 ------------- .../implementations/InternalTimeSyncProtocol.java | 125 ------------- .../implementations/OnePhaseCommitProtocol.java | 143 --------------- .../implementations/PingPongProtocol.java | 115 ------------ .../implementations/TwoPhaseCommitProtocol.java | 190 -------------------- .../implementations/VSBerkelyTimeProtocol.java | 200 +++++++++++++++++++++ .../implementations/VSBroadcastSturmProtocol.java | 106 +++++++++++ .../protocols/implementations/VSDummyProtocol.java | 101 +++++++++++ .../VSExternalTimeSyncProtocol.java | 121 +++++++++++++ .../VSInternalTimeSyncProtocol.java | 125 +++++++++++++ .../implementations/VSOnePhaseCommitProtocol.java | 143 +++++++++++++++ .../implementations/VSPingPongProtocol.java | 115 ++++++++++++ .../implementations/VSTwoPhaseCommitProtocol.java | 190 ++++++++++++++++++++ 16 files changed, 1101 insertions(+), 1101 deletions(-) delete mode 100644 sources/protocols/implementations/BerkelyTimeProtocol.java delete mode 100644 sources/protocols/implementations/BroadcastSturmProtocol.java delete mode 100644 sources/protocols/implementations/DummyProtocol.java delete mode 100644 sources/protocols/implementations/ExternalTimeSyncProtocol.java delete mode 100644 sources/protocols/implementations/InternalTimeSyncProtocol.java delete mode 100644 sources/protocols/implementations/OnePhaseCommitProtocol.java delete mode 100644 sources/protocols/implementations/PingPongProtocol.java delete mode 100644 sources/protocols/implementations/TwoPhaseCommitProtocol.java create mode 100644 sources/protocols/implementations/VSBerkelyTimeProtocol.java create mode 100644 sources/protocols/implementations/VSBroadcastSturmProtocol.java create mode 100644 sources/protocols/implementations/VSDummyProtocol.java create mode 100644 sources/protocols/implementations/VSExternalTimeSyncProtocol.java create mode 100644 sources/protocols/implementations/VSInternalTimeSyncProtocol.java create mode 100644 sources/protocols/implementations/VSOnePhaseCommitProtocol.java create mode 100644 sources/protocols/implementations/VSPingPongProtocol.java create mode 100644 sources/protocols/implementations/VSTwoPhaseCommitProtocol.java (limited to 'sources/protocols') diff --git a/sources/protocols/implementations/BerkelyTimeProtocol.java b/sources/protocols/implementations/BerkelyTimeProtocol.java deleted file mode 100644 index ab4c96e..0000000 --- a/sources/protocols/implementations/BerkelyTimeProtocol.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * VS is (c) 2008 by Paul C. Buetow - * vs@dev.buetow.org - */ -package protocols.implementations; - -import protocols.VSAbstractProtocol; -import core.VSMessage; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Vector; - -/** - * The Class BerkelyTimeProtocol. - */ -public class BerkelyTimeProtocol extends VSAbstractProtocol { - private static final long serialVersionUID = 1L; - - /** - * Instantiates a new berkely time protocol. - */ - public BerkelyTimeProtocol() { - super(VSAbstractProtocol.HAS_ON_SERVER_START); - setClassname(getClass().toString()); - } - - /** Integer: Process ID, Long: Local time of the process */ - private HashMap processTimes = new HashMap(); - - /** Integer: Process ID, Long: Time of receiving the response from the process */ - private HashMap recvTimes = new HashMap(); - - /** Integer: Process ID, Long: Calculated process times (using the RTT) */ - private HashMap realTimesRTT = new HashMap(); - - /** Contains all process IDs of processes which want to justify their time */ - private ArrayList peers = new ArrayList(); - - /** Time the request/response has started */ - private long requestTime; - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onServerInit() - */ - public void onServerInit() { - /* Those prefs are editable through the VSAbstractProtocol VSAbstractEditor GUI. */ - Vector vec = new Vector(); - vec.add(2); - vec.add(3); - initVector("pids", vec, "PIDs beteiliger Prozesse"); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerReset() - */ - public void onServerReset() { - processTimes.clear(); - recvTimes.clear(); - realTimesRTT.clear(); - peers.clear(); - peers.addAll(getVector("pids")); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerStart() - */ - public void onServerStart() { - peers.addAll(getVector("pids")); - requestTime = process.getTime(); - VSMessage message = new VSMessage(); - message.setBoolean("isRequest", true); - sendMessage(message); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) - */ - public void onServerRecv(VSMessage recvMessage) { - /* Ignore all protocol messages which are not a response message, e.g. itself */ - if (!recvMessage.getBoolean("isResponse")) - return; - - Integer processID = recvMessage.getIntegerObj("processID"); - - if (peers.contains(processID)) - peers.remove(processID); - else - return; /* Process has been handled already or is not listed */ - - Long time = new Long(recvMessage.getLong("time")); - - processTimes.put(processID, time); - recvTimes.put(processID, new Long(process.getTime())); - - /* All peers have told their times */ - if (peers.size() == 0) { - long avgTime = calculateAverageTime(); - /* Set the local's process time to the new avg reference time */ - process.setTime(avgTime); - /* Tell all other processes what to do in order to justify their times */ - sendJustifyRequests(avgTime); - /* Start "clean" next time */ - onServerReset(); - } - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerSchedule() - */ - public void onServerSchedule() { - } - - /** - * Calculate the new average time. - * - * @return the long - */ - private long calculateAverageTime() { - long sum = 0; - for (Integer processID : processTimes.keySet()) { - Long localTime = processTimes.get(processID); - Long recvTime = recvTimes.get(processID); - long rtt = recvTime.longValue() - requestTime; - long realProcessTime = localTime + (long) (rtt / 2); - realTimesRTT.put(processID, new Long(realProcessTime)); - sum += realProcessTime; - } - /* Include the time of the local process */ - sum += process.getTime(); - return (long) sum / (getVector("pids").size() + 1); - } - - /** - * Sends to all clients a value to justify their local clocks. - * - * @param avgTime the avg time - */ - private void sendJustifyRequests(long avgTime) { - for (Integer processID : processTimes.keySet()) { - long realProcessTime = realTimesRTT.get(processID).longValue(); - long diff = avgTime - realProcessTime; - VSMessage message = new VSMessage(); - message.setBoolean("isJustify", true); - message.setLong("timeDiff", diff); - message.setInteger("receiverProcessID", processID); - sendMessage(message); - } - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onClientInit() - */ - public void onClientInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientReset() - */ - public void onClientReset() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) - */ - public void onClientRecv(VSMessage recvMessage) { - if (recvMessage.getBoolean("isRequest")) { - VSMessage message = new VSMessage(); - message.setInteger("processID", process.getProcessID()); - message.setLong("time", process.getTime()); - message.setBoolean("isResponse", true); - sendMessage(message); - - } else if (recvMessage.getBoolean("isJustify")) { - /* Check if it's "my" justify message */ - if (recvMessage.getInteger("receiverProcessID") != process.getProcessID()) - return; - - long timeDiff = recvMessage.getLong("timeDiff"); - long recvTime = process.getTime(); - long newTime = process.getTime() + timeDiff; - logg("Neue Zeit: " + newTime); - - process.setTime(newTime); - } - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientSchedule() - */ - public void onClientSchedule() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#toString() - */ - public String toString() { - return super.toString(); - } -} diff --git a/sources/protocols/implementations/BroadcastSturmProtocol.java b/sources/protocols/implementations/BroadcastSturmProtocol.java deleted file mode 100644 index 6d49fad..0000000 --- a/sources/protocols/implementations/BroadcastSturmProtocol.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * VS is (c) 2008 by Paul C. Buetow - * vs@dev.buetow.org - */ -package protocols.implementations; - -import java.util.ArrayList; - -import core.VSMessage; -import protocols.VSAbstractProtocol; - -// TODO: Auto-generated Javadoc -/** - * The Class BroadcastSturmProtocol. - */ -public class BroadcastSturmProtocol extends VSAbstractProtocol { - private static final long serialVersionUID = 1L; - - /** The sent messages. */ - private ArrayList sentMessages; - - /** The broadcast count. */ - private static int broadcastCount; - - /** - * Instantiates a new broadcast sturm protocol. - */ - public BroadcastSturmProtocol() { - super(VSAbstractProtocol.HAS_ON_CLIENT_START); - setClassname(getClass().toString()); - sentMessages = new ArrayList(); - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onClientInit() - */ - public void onClientInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientReset() - */ - public void onClientReset() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientStart() - */ - public void onClientStart() { - VSMessage message = new VSMessage(); - message.setInteger("Broadcast", broadcastCount++); - sentMessages.add(message); - sendMessage(message); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) - */ - public void onClientRecv(VSMessage recvMessage) { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientSchedule() - */ - public void onClientSchedule() { - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onServerInit() - */ - public void onServerInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerReset() - */ - public void onServerReset() { - sentMessages.clear(); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerSchedule() - */ - public void onServerSchedule() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) - */ - public void onServerRecv(VSMessage recvMessage) { - if (!sentMessages.contains(recvMessage)) { - VSMessage message = new VSMessage(); - message.setInteger("Broadcast", recvMessage.getInteger("Broadcast")); - - sentMessages.add(message); - sendMessage(message); - } - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#toString() - */ - public String toString() { - return super.toString(); - } -} diff --git a/sources/protocols/implementations/DummyProtocol.java b/sources/protocols/implementations/DummyProtocol.java deleted file mode 100644 index dee873e..0000000 --- a/sources/protocols/implementations/DummyProtocol.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * VS is (c) 2008 by Paul C. Buetow - * vs@dev.buetow.org - */ -package protocols.implementations; - -import protocols.VSAbstractProtocol; -import core.VSMessage; - -/** - * The Class DummyProtocol. - */ -public class DummyProtocol extends VSAbstractProtocol { - private static final long serialVersionUID = 1L; - - /** - * Instantiates a new dummy protocol. - */ - public DummyProtocol() { - super(VSAbstractProtocol.HAS_ON_CLIENT_START); - setClassname(getClass().toString()); - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onClientInit() - */ - public void onClientInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientReset() - */ - public void onClientReset() { - logg("onClientReset()"); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientStart() - */ - public void onClientStart() { - logg("onClientStart()"); - - VSMessage message = new VSMessage(); - message.setString("Greeting", "Hello World!"); - message.setInteger("A number", 1); - message.setBoolean("A boolean", true); - message.setFloat("A float", 1.2f); - sendMessage(message); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) - */ - public void onClientRecv(VSMessage recvMessage) { - logg("onClientRecv("+recvMessage+")"); - - String s = recvMessage.getString("Greeting"); - int n = recvMessage.getInteger("A number"); - boolean b = recvMessage.getBoolean("A boolean"); - float f = recvMessage.getFloat("A float"); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientSchedule() - */ - public void onClientSchedule() { - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onServerInit() - */ - public void onServerInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerReset() - */ - public void onServerReset() { - logg("onClientReset()"); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) - */ - public void onServerRecv(VSMessage recvMessage) { - logg("onServerRecv("+recvMessage+")"); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerSchedule() - */ - public void onServerSchedule() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#toString() - */ - public String toString() { - return super.toString() + "; Dummy Test"; - } -} diff --git a/sources/protocols/implementations/ExternalTimeSyncProtocol.java b/sources/protocols/implementations/ExternalTimeSyncProtocol.java deleted file mode 100644 index 382ae1e..0000000 --- a/sources/protocols/implementations/ExternalTimeSyncProtocol.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * VS is (c) 2008 by Paul C. Buetow - * vs@dev.buetow.org - */ -package protocols.implementations; - -import core.VSMessage; -import protocols.VSAbstractProtocol; - -// TODO: Auto-generated Javadoc -/** - * The Class ExternalTimeSyncProtocol. - */ -public class ExternalTimeSyncProtocol extends VSAbstractProtocol { - private static final long serialVersionUID = 1L; - - /** The request time. */ - private long requestTime; - - /** The waiting for response. */ - private boolean waitingForResponse; - - /** - * Instantiates a new external time sync protocol. - */ - public ExternalTimeSyncProtocol() { - super(VSAbstractProtocol.HAS_ON_CLIENT_START); - setClassname(getClass().toString()); - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onClientInit() - */ - public void onClientInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientReset() - */ - public void onClientReset() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientStart() - */ - public void onClientStart() { - requestTime = process.getTime(); - waitingForResponse = true; - - /* Multicast message to all processes */ - VSMessage message = new VSMessage(); - message.setBoolean("isClientRequest", true); - sendMessage(message); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) - */ - public void onClientRecv(VSMessage recvMessage) { - if (!recvMessage.getBoolean("isServerResponse")) - return; - - if (waitingForResponse) - waitingForResponse = false; - else - return; - - long recvTime = process.getTime(); - long roundTripTime = recvTime - requestTime; - long serverTime = recvMessage.getLong("time"); - long newTime = serverTime + (long) (roundTripTime / 2); - - logg("Server Zeit: " + serverTime + "; RTT: " + roundTripTime + "; Alte Zeit: " + recvTime + "; Neue Zeit: " + newTime + "; Offset: " + (newTime - recvTime)); - process.setTime(newTime); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientSchedule() - */ - public void onClientSchedule() { - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onServerInit() - */ - public void onServerInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerReset() - */ - public void onServerReset() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) - */ - public void onServerRecv(VSMessage recvMessage) { - if (!recvMessage.getBoolean("isClientRequest")) - return; - - /* Multicast message to all processes */ - VSMessage message = new VSMessage(); - message.setLong("time", process.getTime()); - message.setBoolean("isServerResponse", true); - sendMessage(message); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerSchedule() - */ - public void onServerSchedule() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#toString() - */ - public String toString() { - return super.toString(); //+ "; " + prefs.getString("lang.requesttime") + ": " + requestTime; - } -} diff --git a/sources/protocols/implementations/InternalTimeSyncProtocol.java b/sources/protocols/implementations/InternalTimeSyncProtocol.java deleted file mode 100644 index 3c1d5d5..0000000 --- a/sources/protocols/implementations/InternalTimeSyncProtocol.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * VS is (c) 2008 by Paul C. Buetow - * vs@dev.buetow.org - */ -package protocols.implementations; - -import core.VSMessage; -import protocols.VSAbstractProtocol; - -// TODO: Auto-generated Javadoc -/** - * The Class InternalTimeSyncProtocol. - */ -public class InternalTimeSyncProtocol extends VSAbstractProtocol { - private static final long serialVersionUID = 1L; - - /** The waiting for response. */ - private boolean waitingForResponse; - - /** - * Instantiates a new internal time sync protocol. - */ - public InternalTimeSyncProtocol() { - super(VSAbstractProtocol.HAS_ON_CLIENT_START); - setClassname(getClass().toString()); - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onClientInit() - */ - public void onClientInit() { - /* Those prefs are editable through the VSAbstractProtocol VSAbstractEditor GUI. t_min and t_max in milliseconds */ - initLong("t_min", 2000, "Max. Übetragungszeit", "ms"); - initLong("t_max", 500, "Min. Übertragungszeit", "ms"); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientReset() - */ - public void onClientReset() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientStart() - */ - public void onClientStart() { - waitingForResponse = true; - - /* Multicast message to all processes */ - VSMessage message = new VSMessage(); - message.setBoolean("isClientRequest", true); - sendMessage(message); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) - */ - public void onClientRecv(VSMessage recvMessage) { - /* Ignore all protocol messages which are not a response message, e.g. itself */ - if (!recvMessage.getBoolean("isServerResponse")) - return; - - if (waitingForResponse) - waitingForResponse = false; - else - return; - - long tMax = getLong("t_max"); - long tMin = getLong("t_min"); - long serverTime = recvMessage.getLong("time"); - long newTime = serverTime + (long) ((tMax + tMin) / 2 ); - - logg("Server Zeit: " + serverTime + "; (t_min,t_max): (" + tMin + "," + tMax - + "); Alte Zeit: " + process.getTime() + "; Neue Zeit: " + newTime - + "; Offset: " + (process.getTime() - newTime)); - - process.setTime(newTime); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientSchedule() - */ - public void onClientSchedule() { - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onServerInit() - */ - public void onServerInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerReset() - */ - public void onServerReset() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) - */ - public void onServerRecv(VSMessage recvMessage) { - /* Ignore all protocol messages which are not a request message, e.g. itself */ - if (!recvMessage.getBoolean("isClientRequest")) - return; - - /* Multicast message to all processes */ - VSMessage message = new VSMessage(); - message.setLong("time", process.getTime()); - message.setBoolean("isServerResponse", true); - sendMessage(message); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerSchedule() - */ - public void onServerSchedule() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#toString() - */ - public String toString() { - return super.toString(); - } -} diff --git a/sources/protocols/implementations/OnePhaseCommitProtocol.java b/sources/protocols/implementations/OnePhaseCommitProtocol.java deleted file mode 100644 index fcb5499..0000000 --- a/sources/protocols/implementations/OnePhaseCommitProtocol.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * VS is (c) 2008 by Paul C. Buetow - * vs@dev.buetow.org - */ -package protocols.implementations; - -import java.util.ArrayList; -import java.util.Vector; - -import protocols.VSAbstractProtocol; -import core.VSMessage; - -/** - * The Class OnePhaseCommitProtocol. - */ -public class OnePhaseCommitProtocol extends VSAbstractProtocol { - private static final long serialVersionUID = 1L; - - /* Client variables, coordinator */ - private ArrayList pids; - - /* Server variables */ - private boolean ackSent; - - /** - * Instantiates a one phase commit protocol. - */ - public OnePhaseCommitProtocol() { - super(VSAbstractProtocol.HAS_ON_SERVER_START); - setClassname(getClass().toString()); - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onServerInit() - */ - public void onServerInit() { - /* Can be changed via GUI variables editor of each process */ - Vector vec = new Vector(); - vec.add(2); - vec.add(3); - - initVector("pids", vec, "PIDs beteilitger Prozesse"); - initLong("timeout", 2500, "Zeit bis erneuerter Anfrage", "ms"); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerReset() - */ - public void onServerReset() { - if (pids != null) { - pids.clear(); - pids.addAll(getVector("pids")); - } - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerStart() - */ - public void onServerStart() { - if (pids == null) { - pids = new ArrayList(); - pids.addAll(getVector("pids")); - } - - if (pids.size() != 0) { - long timeout = getLong("timeout") + process.getTime(); - scheduleAt(timeout); /* Will run onServerSchedule() at the specified local time */ - - VSMessage message = new VSMessage(); - message.setBoolean("wantAck", true); - sendMessage(message); - } - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) - */ - public void onServerRecv(VSMessage recvMessage) { - if (pids.size() == 0) - return; - - if (recvMessage.getBoolean("isAck")) { - Integer pid = recvMessage.getIntegerObj("pid"); - if (pids.contains(pid)) - pids.remove(pid); - else - return; - - logg("ACK von Prozess " + pid + " erhalten!"); - - if (pids.size() == 0) - logg("ACKs von allen beteiligten Prozessen erhalten! Festgeschrieben!"); - } - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerSchedule() - */ - public void onServerSchedule() { - onServerStart(); - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onClientInit() - */ - public void onClientInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientReset() - */ - public void onClientReset() { - ackSent = false; - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) - */ - public void onClientRecv(VSMessage recvMessage) { - if (ackSent) - return; - - VSMessage message = new VSMessage(); - message.setBoolean("isAck", true); - message.setInteger("pid", process.getProcessID()); - sendMessage(message); - ackSent = true; - logg("Festgeschrieben"); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientSchedule() - */ - public void onClientSchedule() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#toString() - */ - public String toString() { - return super.toString(); - } -} diff --git a/sources/protocols/implementations/PingPongProtocol.java b/sources/protocols/implementations/PingPongProtocol.java deleted file mode 100644 index d8d2013..0000000 --- a/sources/protocols/implementations/PingPongProtocol.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * VS is (c) 2008 by Paul C. Buetow - * vs@dev.buetow.org - */ -package protocols.implementations; - -import core.VSMessage; -import protocols.VSAbstractProtocol; - -// TODO: Auto-generated Javadoc -/** - * The Class PingPongProtocol. - */ -public class PingPongProtocol extends VSAbstractProtocol { - private static final long serialVersionUID = 1L; - - /** The client counter. */ - private int clientCounter; - - /** The server counter. */ - private int serverCounter; - - /** - * Instantiates a new ping pong protocol. - */ - public PingPongProtocol() { - super(VSAbstractProtocol.HAS_ON_CLIENT_START); - setClassname(getClass().toString()); - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onClientInit() - */ - public void onClientInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientReset() - */ - public void onClientReset() { - clientCounter = 0; - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientStart() - */ - public void onClientStart() { - VSMessage message = new VSMessage(); - message.setBoolean("fromClient", true); - message.setInteger("counter", ++clientCounter); - sendMessage(message); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) - */ - public void onClientRecv(VSMessage recvMessage) { - if (!recvMessage.getBoolean("fromServer")) - return; - - logg("message: " + recvMessage.getInteger("counter")); - - VSMessage message = new VSMessage(); - message.setBoolean("fromClient", true); - message.setInteger("counter", ++clientCounter); - sendMessage(message); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientSchedule() - */ - public void onClientSchedule() { - } - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onServerInit() - */ - public void onServerInit() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerReset() - */ - public void onServerReset() { - serverCounter = 0; - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) - */ - public void onServerRecv(VSMessage recvMessage) { - if (!recvMessage.getBoolean("fromClient")) - return; - - logg("message: " + recvMessage.getInteger("counter")); - - VSMessage message = new VSMessage(); - message.setBoolean("fromServer", true); - message.setInteger("counter", ++serverCounter); - sendMessage(message); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerSchedule() - */ - public void onServerSchedule() { - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#toString() - */ - public String toString() { - return super.toString(); - } -} diff --git a/sources/protocols/implementations/TwoPhaseCommitProtocol.java b/sources/protocols/implementations/TwoPhaseCommitProtocol.java deleted file mode 100644 index 8f6872d..0000000 --- a/sources/protocols/implementations/TwoPhaseCommitProtocol.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * VS is (c) 2008 by Paul C. Buetow - * vs@dev.buetow.org - */ -package protocols.implementations; - -import java.util.ArrayList; -import java.util.Vector; - -import protocols.VSAbstractProtocol; -import core.VSMessage; - -/** - * The Class TwoPhaseCommitProtocol. - */ -public class TwoPhaseCommitProtocol extends VSAbstractProtocol { - private static final long serialVersionUID = 1L; - - /** - * Instantiates a one phase commit protocol. - */ - public TwoPhaseCommitProtocol() { - super(VSAbstractProtocol.HAS_ON_SERVER_START); - setClassname(getClass().toString()); - } - - /** PIDs of all processes which still have to vote */ - private ArrayList votePids; - - /** PIDs of all processes which have to acknowledge that they recv the global vote result */ - private ArrayList ackPids; - - /** The gloal vote result */ - private boolean voteResult; - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onServerInit() - */ - public void onServerInit() { - Vector vec = new Vector(); - vec.add(2); - vec.add(3); - - initVector("pids", vec, "PIDs beteilitger Prozesse"); - initLong("timeout", 2500, "Zeit bis erneuerter Anfrage", "ms"); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerReset() - */ - public void onServerReset() { - if (votePids != null) { - voteResult = true; - votePids.clear(); - votePids.addAll(getVector("pids")); - ackPids.clear(); - ackPids.addAll(getVector("pids")); - } - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerStart() - */ - public void onServerStart() { - if (votePids == null) { - voteResult = true; - votePids = new ArrayList(); - votePids.addAll(getVector("pids")); - ackPids = new ArrayList(); - ackPids.addAll(getVector("pids")); - } - - if (votePids.size() != 0) { - long timeout = getLong("timeout") + process.getTime(); - scheduleAt(timeout); /* Will run onServerSchedule() at the specified local time */ - - VSMessage message = new VSMessage(); - message.setBoolean("wantVote", true); - sendMessage(message); - - } else if (ackPids.size() != 0) { - long timeout = getLong("timeout") + process.getTime(); - scheduleAt(timeout); /* Will run onServerSchedule() at the specified local time */ - - VSMessage message = new VSMessage(); - message.setBoolean("isVoteResult", true); - message.setBoolean("voteResult", voteResult); - sendMessage(message); - } - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) - */ - public void onServerRecv(VSMessage recvMessage) { - if (votePids.size() != 0 && recvMessage.getBoolean("isVote")) { - Integer pid = recvMessage.getIntegerObj("pid"); - if (votePids.contains(pid)) - votePids.remove(pid); - else - return; - - boolean vote = recvMessage.getBoolean("vote"); - logg("Abstimmung von Prozess " + pid + " erhalten! Ergebnis: " + vote); - - if (!vote) - voteResult = false; - - if (votePids.size() == 0) { - logg("Abstimmungen von allen beteiligten Prozessen erhalten! Globales Ergebnis: " + voteResult); - /* Remove the active schedule which has been created in the onServerStart method */ - removeSchedules(); - /* Create a new schedule and send the vote result */ - onServerStart(); - } - } else if (ackPids.size() != 0 && recvMessage.getBoolean("isAck")) { - Integer pid = recvMessage.getIntegerObj("pid"); - if (ackPids.contains(pid)) - ackPids.remove(pid); - else - return; - - if (ackPids.size() == 0) { - /* Remove the active schedule which has been created in the onServerStart method */ - removeSchedules(); - logg("Alle Teilnehmer haben die Abstimmung erhalten"); - } - } - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onServerSchedule() - */ - public void onServerSchedule() { - onServerStart(); - } - - /* Server variables */ - private boolean voteSent; - private boolean myVote; - - /* (non-Javadoc) - * @see events.VSAbstractProtocol#onClientInit() - */ - public void onClientInit() { - initInteger("ackProb", 50, "Festschreibw'keit", 0, 100, "%"); - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientReset() - */ - public void onClientReset() { - voteSent = false; - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) - */ - public void onClientRecv(VSMessage recvMessage) { - if (recvMessage.getBoolean("wantVote")) { - if (!voteSent) { - voteSent = true; - myVote = process.getRandomPercentage() <= getInteger("ackProb"); - } - - VSMessage message = new VSMessage(); - message.setBoolean("isVote", true); - message.setBoolean("vote", myVote); - message.setInteger("pid", process.getProcessID()); - sendMessage(message); - - logg("Abstimmung " + myVote + " versendet"); - - } else if (recvMessage.getBoolean("isVoteResult")) { - boolean voteResult = recvMessage.getBoolean("voteResult"); - logg("Globales Abstimmungsergebnis erhalten. Ergebnis: " + voteResult); - - VSMessage message = new VSMessage(); - message.setBoolean("isAck", true); - message.setInteger("pid", process.getProcessID()); - sendMessage(message); - } - } - - /* (non-Javadoc) - * @see protocols.VSAbstractProtocol#onClientSchedule() - */ - public void onClientSchedule() { - } -} diff --git a/sources/protocols/implementations/VSBerkelyTimeProtocol.java b/sources/protocols/implementations/VSBerkelyTimeProtocol.java new file mode 100644 index 0000000..1f13cbc --- /dev/null +++ b/sources/protocols/implementations/VSBerkelyTimeProtocol.java @@ -0,0 +1,200 @@ +/* + * VS is (c) 2008 by Paul C. Buetow + * vs@dev.buetow.org + */ +package protocols.implementations; + +import protocols.VSAbstractProtocol; +import core.VSMessage; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Vector; + +/** + * The Class VSBerkelyTimeProtocol. + */ +public class VSBerkelyTimeProtocol extends VSAbstractProtocol { + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new berkely time protocol. + */ + public VSBerkelyTimeProtocol() { + super(VSAbstractProtocol.HAS_ON_SERVER_START); + setClassname(getClass().toString()); + } + + /** Integer: Process ID, Long: Local time of the process */ + private HashMap processTimes = new HashMap(); + + /** Integer: Process ID, Long: Time of receiving the response from the process */ + private HashMap recvTimes = new HashMap(); + + /** Integer: Process ID, Long: Calculated process times (using the RTT) */ + private HashMap realTimesRTT = new HashMap(); + + /** Contains all process IDs of processes which want to justify their time */ + private ArrayList peers = new ArrayList(); + + /** Time the request/response has started */ + private long requestTime; + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onServerInit() + */ + public void onServerInit() { + /* Those prefs are editable through the VSAbstractProtocol VSAbstractEditor GUI. */ + Vector vec = new Vector(); + vec.add(2); + vec.add(3); + initVector("pids", vec, "PIDs beteiliger Prozesse"); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerReset() + */ + public void onServerReset() { + processTimes.clear(); + recvTimes.clear(); + realTimesRTT.clear(); + peers.clear(); + peers.addAll(getVector("pids")); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerStart() + */ + public void onServerStart() { + peers.addAll(getVector("pids")); + requestTime = process.getTime(); + VSMessage message = new VSMessage(); + message.setBoolean("isRequest", true); + sendMessage(message); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) + */ + public void onServerRecv(VSMessage recvMessage) { + /* Ignore all protocol messages which are not a response message, e.g. itself */ + if (!recvMessage.getBoolean("isResponse")) + return; + + Integer processID = recvMessage.getIntegerObj("processID"); + + if (peers.contains(processID)) + peers.remove(processID); + else + return; /* Process has been handled already or is not listed */ + + Long time = new Long(recvMessage.getLong("time")); + + processTimes.put(processID, time); + recvTimes.put(processID, new Long(process.getTime())); + + /* All peers have told their times */ + if (peers.size() == 0) { + long avgTime = calculateAverageTime(); + /* Set the local's process time to the new avg reference time */ + process.setTime(avgTime); + /* Tell all other processes what to do in order to justify their times */ + sendJustifyRequests(avgTime); + /* Start "clean" next time */ + onServerReset(); + } + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerSchedule() + */ + public void onServerSchedule() { + } + + /** + * Calculate the new average time. + * + * @return the long + */ + private long calculateAverageTime() { + long sum = 0; + for (Integer processID : processTimes.keySet()) { + Long localTime = processTimes.get(processID); + Long recvTime = recvTimes.get(processID); + long rtt = recvTime.longValue() - requestTime; + long realProcessTime = localTime + (long) (rtt / 2); + realTimesRTT.put(processID, new Long(realProcessTime)); + sum += realProcessTime; + } + /* Include the time of the local process */ + sum += process.getTime(); + return (long) sum / (getVector("pids").size() + 1); + } + + /** + * Sends to all clients a value to justify their local clocks. + * + * @param avgTime the avg time + */ + private void sendJustifyRequests(long avgTime) { + for (Integer processID : processTimes.keySet()) { + long realProcessTime = realTimesRTT.get(processID).longValue(); + long diff = avgTime - realProcessTime; + VSMessage message = new VSMessage(); + message.setBoolean("isJustify", true); + message.setLong("timeDiff", diff); + message.setInteger("receiverProcessID", processID); + sendMessage(message); + } + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onClientInit() + */ + public void onClientInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientReset() + */ + public void onClientReset() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) + */ + public void onClientRecv(VSMessage recvMessage) { + if (recvMessage.getBoolean("isRequest")) { + VSMessage message = new VSMessage(); + message.setInteger("processID", process.getProcessID()); + message.setLong("time", process.getTime()); + message.setBoolean("isResponse", true); + sendMessage(message); + + } else if (recvMessage.getBoolean("isJustify")) { + /* Check if it's "my" justify message */ + if (recvMessage.getInteger("receiverProcessID") != process.getProcessID()) + return; + + long timeDiff = recvMessage.getLong("timeDiff"); + long recvTime = process.getTime(); + long newTime = process.getTime() + timeDiff; + logg("Neue Zeit: " + newTime); + + process.setTime(newTime); + } + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientSchedule() + */ + public void onClientSchedule() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#toString() + */ + public String toString() { + return super.toString(); + } +} diff --git a/sources/protocols/implementations/VSBroadcastSturmProtocol.java b/sources/protocols/implementations/VSBroadcastSturmProtocol.java new file mode 100644 index 0000000..07d4130 --- /dev/null +++ b/sources/protocols/implementations/VSBroadcastSturmProtocol.java @@ -0,0 +1,106 @@ +/* + * VS is (c) 2008 by Paul C. Buetow + * vs@dev.buetow.org + */ +package protocols.implementations; + +import java.util.ArrayList; + +import core.VSMessage; +import protocols.VSAbstractProtocol; + +// TODO: Auto-generated Javadoc +/** + * The Class VSBroadcastSturmProtocol. + */ +public class VSBroadcastSturmProtocol extends VSAbstractProtocol { + private static final long serialVersionUID = 1L; + + /** The sent messages. */ + private ArrayList sentMessages; + + /** The broadcast count. */ + private static int broadcastCount; + + /** + * Instantiates a new broadcast sturm protocol. + */ + public VSBroadcastSturmProtocol() { + super(VSAbstractProtocol.HAS_ON_CLIENT_START); + setClassname(getClass().toString()); + sentMessages = new ArrayList(); + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onClientInit() + */ + public void onClientInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientReset() + */ + public void onClientReset() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientStart() + */ + public void onClientStart() { + VSMessage message = new VSMessage(); + message.setInteger("Broadcast", broadcastCount++); + sentMessages.add(message); + sendMessage(message); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) + */ + public void onClientRecv(VSMessage recvMessage) { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientSchedule() + */ + public void onClientSchedule() { + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onServerInit() + */ + public void onServerInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerReset() + */ + public void onServerReset() { + sentMessages.clear(); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerSchedule() + */ + public void onServerSchedule() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) + */ + public void onServerRecv(VSMessage recvMessage) { + if (!sentMessages.contains(recvMessage)) { + VSMessage message = new VSMessage(); + message.setInteger("Broadcast", recvMessage.getInteger("Broadcast")); + + sentMessages.add(message); + sendMessage(message); + } + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#toString() + */ + public String toString() { + return super.toString(); + } +} diff --git a/sources/protocols/implementations/VSDummyProtocol.java b/sources/protocols/implementations/VSDummyProtocol.java new file mode 100644 index 0000000..5797239 --- /dev/null +++ b/sources/protocols/implementations/VSDummyProtocol.java @@ -0,0 +1,101 @@ +/* + * VS is (c) 2008 by Paul C. Buetow + * vs@dev.buetow.org + */ +package protocols.implementations; + +import protocols.VSAbstractProtocol; +import core.VSMessage; + +/** + * The Class VSDummyProtocol. + */ +public class VSDummyProtocol extends VSAbstractProtocol { + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new dummy protocol. + */ + public VSDummyProtocol() { + super(VSAbstractProtocol.HAS_ON_CLIENT_START); + setClassname(getClass().toString()); + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onClientInit() + */ + public void onClientInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientReset() + */ + public void onClientReset() { + logg("onClientReset()"); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientStart() + */ + public void onClientStart() { + logg("onClientStart()"); + + VSMessage message = new VSMessage(); + message.setString("Greeting", "Hello World!"); + message.setInteger("A number", 1); + message.setBoolean("A boolean", true); + message.setFloat("A float", 1.2f); + sendMessage(message); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) + */ + public void onClientRecv(VSMessage recvMessage) { + logg("onClientRecv("+recvMessage+")"); + + String s = recvMessage.getString("Greeting"); + int n = recvMessage.getInteger("A number"); + boolean b = recvMessage.getBoolean("A boolean"); + float f = recvMessage.getFloat("A float"); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientSchedule() + */ + public void onClientSchedule() { + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onServerInit() + */ + public void onServerInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerReset() + */ + public void onServerReset() { + logg("onClientReset()"); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) + */ + public void onServerRecv(VSMessage recvMessage) { + logg("onServerRecv("+recvMessage+")"); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerSchedule() + */ + public void onServerSchedule() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#toString() + */ + public String toString() { + return super.toString() + "; Dummy Test"; + } +} diff --git a/sources/protocols/implementations/VSExternalTimeSyncProtocol.java b/sources/protocols/implementations/VSExternalTimeSyncProtocol.java new file mode 100644 index 0000000..28d312a --- /dev/null +++ b/sources/protocols/implementations/VSExternalTimeSyncProtocol.java @@ -0,0 +1,121 @@ +/* + * VS is (c) 2008 by Paul C. Buetow + * vs@dev.buetow.org + */ +package protocols.implementations; + +import core.VSMessage; +import protocols.VSAbstractProtocol; + +// TODO: Auto-generated Javadoc +/** + * The Class VSExternalTimeSyncProtocol. + */ +public class VSExternalTimeSyncProtocol extends VSAbstractProtocol { + private static final long serialVersionUID = 1L; + + /** The request time. */ + private long requestTime; + + /** The waiting for response. */ + private boolean waitingForResponse; + + /** + * Instantiates a new external time sync protocol. + */ + public VSExternalTimeSyncProtocol() { + super(VSAbstractProtocol.HAS_ON_CLIENT_START); + setClassname(getClass().toString()); + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onClientInit() + */ + public void onClientInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientReset() + */ + public void onClientReset() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientStart() + */ + public void onClientStart() { + requestTime = process.getTime(); + waitingForResponse = true; + + /* Multicast message to all processes */ + VSMessage message = new VSMessage(); + message.setBoolean("isClientRequest", true); + sendMessage(message); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) + */ + public void onClientRecv(VSMessage recvMessage) { + if (!recvMessage.getBoolean("isServerResponse")) + return; + + if (waitingForResponse) + waitingForResponse = false; + else + return; + + long recvTime = process.getTime(); + long roundTripTime = recvTime - requestTime; + long serverTime = recvMessage.getLong("time"); + long newTime = serverTime + (long) (roundTripTime / 2); + + logg("Server Zeit: " + serverTime + "; RTT: " + roundTripTime + "; Alte Zeit: " + recvTime + "; Neue Zeit: " + newTime + "; Offset: " + (newTime - recvTime)); + process.setTime(newTime); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientSchedule() + */ + public void onClientSchedule() { + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onServerInit() + */ + public void onServerInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerReset() + */ + public void onServerReset() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) + */ + public void onServerRecv(VSMessage recvMessage) { + if (!recvMessage.getBoolean("isClientRequest")) + return; + + /* Multicast message to all processes */ + VSMessage message = new VSMessage(); + message.setLong("time", process.getTime()); + message.setBoolean("isServerResponse", true); + sendMessage(message); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerSchedule() + */ + public void onServerSchedule() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#toString() + */ + public String toString() { + return super.toString(); //+ "; " + prefs.getString("lang.requesttime") + ": " + requestTime; + } +} diff --git a/sources/protocols/implementations/VSInternalTimeSyncProtocol.java b/sources/protocols/implementations/VSInternalTimeSyncProtocol.java new file mode 100644 index 0000000..9a7b0fe --- /dev/null +++ b/sources/protocols/implementations/VSInternalTimeSyncProtocol.java @@ -0,0 +1,125 @@ +/* + * VS is (c) 2008 by Paul C. Buetow + * vs@dev.buetow.org + */ +package protocols.implementations; + +import core.VSMessage; +import protocols.VSAbstractProtocol; + +// TODO: Auto-generated Javadoc +/** + * The Class VSInternalTimeSyncProtocol. + */ +public class VSInternalTimeSyncProtocol extends VSAbstractProtocol { + private static final long serialVersionUID = 1L; + + /** The waiting for response. */ + private boolean waitingForResponse; + + /** + * Instantiates a new internal time sync protocol. + */ + public VSInternalTimeSyncProtocol() { + super(VSAbstractProtocol.HAS_ON_CLIENT_START); + setClassname(getClass().toString()); + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onClientInit() + */ + public void onClientInit() { + /* Those prefs are editable through the VSAbstractProtocol VSAbstractEditor GUI. t_min and t_max in milliseconds */ + initLong("t_min", 2000, "Max. Übetragungszeit", "ms"); + initLong("t_max", 500, "Min. Übertragungszeit", "ms"); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientReset() + */ + public void onClientReset() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientStart() + */ + public void onClientStart() { + waitingForResponse = true; + + /* Multicast message to all processes */ + VSMessage message = new VSMessage(); + message.setBoolean("isClientRequest", true); + sendMessage(message); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) + */ + public void onClientRecv(VSMessage recvMessage) { + /* Ignore all protocol messages which are not a response message, e.g. itself */ + if (!recvMessage.getBoolean("isServerResponse")) + return; + + if (waitingForResponse) + waitingForResponse = false; + else + return; + + long tMax = getLong("t_max"); + long tMin = getLong("t_min"); + long serverTime = recvMessage.getLong("time"); + long newTime = serverTime + (long) ((tMax + tMin) / 2 ); + + logg("Server Zeit: " + serverTime + "; (t_min,t_max): (" + tMin + "," + tMax + + "); Alte Zeit: " + process.getTime() + "; Neue Zeit: " + newTime + + "; Offset: " + (process.getTime() - newTime)); + + process.setTime(newTime); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientSchedule() + */ + public void onClientSchedule() { + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onServerInit() + */ + public void onServerInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerReset() + */ + public void onServerReset() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) + */ + public void onServerRecv(VSMessage recvMessage) { + /* Ignore all protocol messages which are not a request message, e.g. itself */ + if (!recvMessage.getBoolean("isClientRequest")) + return; + + /* Multicast message to all processes */ + VSMessage message = new VSMessage(); + message.setLong("time", process.getTime()); + message.setBoolean("isServerResponse", true); + sendMessage(message); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerSchedule() + */ + public void onServerSchedule() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#toString() + */ + public String toString() { + return super.toString(); + } +} diff --git a/sources/protocols/implementations/VSOnePhaseCommitProtocol.java b/sources/protocols/implementations/VSOnePhaseCommitProtocol.java new file mode 100644 index 0000000..985378e --- /dev/null +++ b/sources/protocols/implementations/VSOnePhaseCommitProtocol.java @@ -0,0 +1,143 @@ +/* + * VS is (c) 2008 by Paul C. Buetow + * vs@dev.buetow.org + */ +package protocols.implementations; + +import java.util.ArrayList; +import java.util.Vector; + +import protocols.VSAbstractProtocol; +import core.VSMessage; + +/** + * The Class VSOnePhaseCommitProtocol. + */ +public class VSOnePhaseCommitProtocol extends VSAbstractProtocol { + private static final long serialVersionUID = 1L; + + /* Client variables, coordinator */ + private ArrayList pids; + + /* Server variables */ + private boolean ackSent; + + /** + * Instantiates a one phase commit protocol. + */ + public VSOnePhaseCommitProtocol() { + super(VSAbstractProtocol.HAS_ON_SERVER_START); + setClassname(getClass().toString()); + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onServerInit() + */ + public void onServerInit() { + /* Can be changed via GUI variables editor of each process */ + Vector vec = new Vector(); + vec.add(2); + vec.add(3); + + initVector("pids", vec, "PIDs beteilitger Prozesse"); + initLong("timeout", 2500, "Zeit bis erneuerter Anfrage", "ms"); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerReset() + */ + public void onServerReset() { + if (pids != null) { + pids.clear(); + pids.addAll(getVector("pids")); + } + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerStart() + */ + public void onServerStart() { + if (pids == null) { + pids = new ArrayList(); + pids.addAll(getVector("pids")); + } + + if (pids.size() != 0) { + long timeout = getLong("timeout") + process.getTime(); + scheduleAt(timeout); /* Will run onServerSchedule() at the specified local time */ + + VSMessage message = new VSMessage(); + message.setBoolean("wantAck", true); + sendMessage(message); + } + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) + */ + public void onServerRecv(VSMessage recvMessage) { + if (pids.size() == 0) + return; + + if (recvMessage.getBoolean("isAck")) { + Integer pid = recvMessage.getIntegerObj("pid"); + if (pids.contains(pid)) + pids.remove(pid); + else + return; + + logg("ACK von Prozess " + pid + " erhalten!"); + + if (pids.size() == 0) + logg("ACKs von allen beteiligten Prozessen erhalten! Festgeschrieben!"); + } + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerSchedule() + */ + public void onServerSchedule() { + onServerStart(); + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onClientInit() + */ + public void onClientInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientReset() + */ + public void onClientReset() { + ackSent = false; + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) + */ + public void onClientRecv(VSMessage recvMessage) { + if (ackSent) + return; + + VSMessage message = new VSMessage(); + message.setBoolean("isAck", true); + message.setInteger("pid", process.getProcessID()); + sendMessage(message); + ackSent = true; + logg("Festgeschrieben"); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientSchedule() + */ + public void onClientSchedule() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#toString() + */ + public String toString() { + return super.toString(); + } +} diff --git a/sources/protocols/implementations/VSPingPongProtocol.java b/sources/protocols/implementations/VSPingPongProtocol.java new file mode 100644 index 0000000..a932204 --- /dev/null +++ b/sources/protocols/implementations/VSPingPongProtocol.java @@ -0,0 +1,115 @@ +/* + * VS is (c) 2008 by Paul C. Buetow + * vs@dev.buetow.org + */ +package protocols.implementations; + +import core.VSMessage; +import protocols.VSAbstractProtocol; + +// TODO: Auto-generated Javadoc +/** + * The Class VSPingPongProtocol. + */ +public class VSPingPongProtocol extends VSAbstractProtocol { + private static final long serialVersionUID = 1L; + + /** The client counter. */ + private int clientCounter; + + /** The server counter. */ + private int serverCounter; + + /** + * Instantiates a new ping pong protocol. + */ + public VSPingPongProtocol() { + super(VSAbstractProtocol.HAS_ON_CLIENT_START); + setClassname(getClass().toString()); + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onClientInit() + */ + public void onClientInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientReset() + */ + public void onClientReset() { + clientCounter = 0; + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientStart() + */ + public void onClientStart() { + VSMessage message = new VSMessage(); + message.setBoolean("fromClient", true); + message.setInteger("counter", ++clientCounter); + sendMessage(message); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) + */ + public void onClientRecv(VSMessage recvMessage) { + if (!recvMessage.getBoolean("fromServer")) + return; + + logg("message: " + recvMessage.getInteger("counter")); + + VSMessage message = new VSMessage(); + message.setBoolean("fromClient", true); + message.setInteger("counter", ++clientCounter); + sendMessage(message); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientSchedule() + */ + public void onClientSchedule() { + } + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onServerInit() + */ + public void onServerInit() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerReset() + */ + public void onServerReset() { + serverCounter = 0; + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) + */ + public void onServerRecv(VSMessage recvMessage) { + if (!recvMessage.getBoolean("fromClient")) + return; + + logg("message: " + recvMessage.getInteger("counter")); + + VSMessage message = new VSMessage(); + message.setBoolean("fromServer", true); + message.setInteger("counter", ++serverCounter); + sendMessage(message); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerSchedule() + */ + public void onServerSchedule() { + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#toString() + */ + public String toString() { + return super.toString(); + } +} diff --git a/sources/protocols/implementations/VSTwoPhaseCommitProtocol.java b/sources/protocols/implementations/VSTwoPhaseCommitProtocol.java new file mode 100644 index 0000000..01a9be3 --- /dev/null +++ b/sources/protocols/implementations/VSTwoPhaseCommitProtocol.java @@ -0,0 +1,190 @@ +/* + * VS is (c) 2008 by Paul C. Buetow + * vs@dev.buetow.org + */ +package protocols.implementations; + +import java.util.ArrayList; +import java.util.Vector; + +import protocols.VSAbstractProtocol; +import core.VSMessage; + +/** + * The Class VSTwoPhaseCommitProtocol. + */ +public class VSTwoPhaseCommitProtocol extends VSAbstractProtocol { + private static final long serialVersionUID = 1L; + + /** + * Instantiates a one phase commit protocol. + */ + public VSTwoPhaseCommitProtocol() { + super(VSAbstractProtocol.HAS_ON_SERVER_START); + setClassname(getClass().toString()); + } + + /** PIDs of all processes which still have to vote */ + private ArrayList votePids; + + /** PIDs of all processes which have to acknowledge that they recv the global vote result */ + private ArrayList ackPids; + + /** The gloal vote result */ + private boolean voteResult; + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onServerInit() + */ + public void onServerInit() { + Vector vec = new Vector(); + vec.add(2); + vec.add(3); + + initVector("pids", vec, "PIDs beteilitger Prozesse"); + initLong("timeout", 2500, "Zeit bis erneuerter Anfrage", "ms"); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerReset() + */ + public void onServerReset() { + if (votePids != null) { + voteResult = true; + votePids.clear(); + votePids.addAll(getVector("pids")); + ackPids.clear(); + ackPids.addAll(getVector("pids")); + } + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerStart() + */ + public void onServerStart() { + if (votePids == null) { + voteResult = true; + votePids = new ArrayList(); + votePids.addAll(getVector("pids")); + ackPids = new ArrayList(); + ackPids.addAll(getVector("pids")); + } + + if (votePids.size() != 0) { + long timeout = getLong("timeout") + process.getTime(); + scheduleAt(timeout); /* Will run onServerSchedule() at the specified local time */ + + VSMessage message = new VSMessage(); + message.setBoolean("wantVote", true); + sendMessage(message); + + } else if (ackPids.size() != 0) { + long timeout = getLong("timeout") + process.getTime(); + scheduleAt(timeout); /* Will run onServerSchedule() at the specified local time */ + + VSMessage message = new VSMessage(); + message.setBoolean("isVoteResult", true); + message.setBoolean("voteResult", voteResult); + sendMessage(message); + } + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerRecv(core.VSMessage) + */ + public void onServerRecv(VSMessage recvMessage) { + if (votePids.size() != 0 && recvMessage.getBoolean("isVote")) { + Integer pid = recvMessage.getIntegerObj("pid"); + if (votePids.contains(pid)) + votePids.remove(pid); + else + return; + + boolean vote = recvMessage.getBoolean("vote"); + logg("Abstimmung von Prozess " + pid + " erhalten! Ergebnis: " + vote); + + if (!vote) + voteResult = false; + + if (votePids.size() == 0) { + logg("Abstimmungen von allen beteiligten Prozessen erhalten! Globales Ergebnis: " + voteResult); + /* Remove the active schedule which has been created in the onServerStart method */ + removeSchedules(); + /* Create a new schedule and send the vote result */ + onServerStart(); + } + } else if (ackPids.size() != 0 && recvMessage.getBoolean("isAck")) { + Integer pid = recvMessage.getIntegerObj("pid"); + if (ackPids.contains(pid)) + ackPids.remove(pid); + else + return; + + if (ackPids.size() == 0) { + /* Remove the active schedule which has been created in the onServerStart method */ + removeSchedules(); + logg("Alle Teilnehmer haben die Abstimmung erhalten"); + } + } + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onServerSchedule() + */ + public void onServerSchedule() { + onServerStart(); + } + + /* Server variables */ + private boolean voteSent; + private boolean myVote; + + /* (non-Javadoc) + * @see events.VSAbstractProtocol#onClientInit() + */ + public void onClientInit() { + initInteger("ackProb", 50, "Festschreibw'keit", 0, 100, "%"); + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientReset() + */ + public void onClientReset() { + voteSent = false; + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientRecv(core.VSMessage) + */ + public void onClientRecv(VSMessage recvMessage) { + if (recvMessage.getBoolean("wantVote")) { + if (!voteSent) { + voteSent = true; + myVote = process.getRandomPercentage() <= getInteger("ackProb"); + } + + VSMessage message = new VSMessage(); + message.setBoolean("isVote", true); + message.setBoolean("vote", myVote); + message.setInteger("pid", process.getProcessID()); + sendMessage(message); + + logg("Abstimmung " + myVote + " versendet"); + + } else if (recvMessage.getBoolean("isVoteResult")) { + boolean voteResult = recvMessage.getBoolean("voteResult"); + logg("Globales Abstimmungsergebnis erhalten. Ergebnis: " + voteResult); + + VSMessage message = new VSMessage(); + message.setBoolean("isAck", true); + message.setInteger("pid", process.getProcessID()); + sendMessage(message); + } + } + + /* (non-Javadoc) + * @see protocols.VSAbstractProtocol#onClientSchedule() + */ + public void onClientSchedule() { + } +} -- cgit v1.2.3