-/* Copyright (c) 2006-2014. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2006-2018. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
protected Comm commReceive;
///Last time I changed a finger or my predecessor
protected double lastChangeDate;
- int[] fingers;
+ private int[] fingers;
public Node(Host host, String name, String[] args) {
super(host,name,args);
double nextCheckPredecessorDate = initTime + Common.PERIODIC_CHECK_PREDECESSOR_DELAY;
double nextLookupDate = initTime + Common.PERIODIC_LOOKUP_DELAY;
- id = Integer.valueOf(args[0]);
- mailbox = Integer.toString(id);
+ mailbox = args[0];
+ id = Integer.parseInt(args[0]);
fingers = new int[Common.NB_BITS];
for (i = 0; i < Common.NB_BITS; i++) {
create();
joinSuccess = true;
} else {
- int knownId = Integer.valueOf(args[1]);
- deadline = Integer.valueOf(args[3]);
- //Msg.info("Hey! Let's join the system with the id " + id + ".");
+ int knownId = Integer.parseInt(args[1]);
+ deadline = Integer.parseInt(args[3]);
+ Msg.debug("Hey! Let's join the system with the id " + id + ".");
joinSuccess = join(knownId);
}
- if (joinSuccess) {
- double currentClock = Msg.getClock();
- while (currentClock < (initTime + deadline) && currentClock < Common.MAX_SIMULATION_TIME) {
- if (commReceive == null) {
- commReceive = Task.irecv(this.mailbox);
- }
- try {
- if (!commReceive.test()) {
- if (currentClock >= nextStabilizeDate) {
- stabilize();
- nextStabilizeDate = Msg.getClock() + Common.PERIODIC_STABILIZE_DELAY;
- } else if (currentClock >= nextFixFingersDate) {
- fixFingers();
- nextFixFingersDate = Msg.getClock() + Common.PERIODIC_FIX_FINGERS_DELAY;
- } else if (currentClock >= nextCheckPredecessorDate) {
- this.checkPredecessor();
- nextCheckPredecessorDate = Msg.getClock() + Common.PERIODIC_CHECK_PREDECESSOR_DELAY;
- } else if (currentClock >= nextLookupDate) {
- this.randomLookup();
- nextLookupDate = Msg.getClock() + Common.PERIODIC_LOOKUP_DELAY;
- } else {
- waitFor(5);
- }
- currentClock = Msg.getClock();
+
+ if (!joinSuccess) {
+ Msg.info("I couldn't join the ring");
+ return;
+ }
+
+ double currentClock = Msg.getClock();
+ while (currentClock < (initTime + deadline) && currentClock < Common.MAX_SIMULATION_TIME) {
+ if (commReceive == null) {
+ commReceive = Task.irecv(this.mailbox);
+ }
+ try {
+ if (!commReceive.test()) {
+ if (currentClock >= nextStabilizeDate) {
+ stabilize();
+ nextStabilizeDate = Msg.getClock() + Common.PERIODIC_STABILIZE_DELAY;
+ } else if (currentClock >= nextFixFingersDate) {
+ fixFingers();
+ nextFixFingersDate = Msg.getClock() + Common.PERIODIC_FIX_FINGERS_DELAY;
+ } else if (currentClock >= nextCheckPredecessorDate) {
+ this.checkPredecessor();
+ nextCheckPredecessorDate = Msg.getClock() + Common.PERIODIC_CHECK_PREDECESSOR_DELAY;
+ } else if (currentClock >= nextLookupDate) {
+ this.randomLookup();
+ nextLookupDate = Msg.getClock() + Common.PERIODIC_LOOKUP_DELAY;
} else {
- handleTask(commReceive.getTask());
- currentClock = Msg.getClock();
- commReceive = null;
+ waitFor(5);
}
- }
- catch (Exception e) {
+ currentClock = Msg.getClock();
+ } else {
+ handleTask(commReceive.getTask());
currentClock = Msg.getClock();
commReceive = null;
}
}
- leave();
- if (commReceive != null) {
+ catch (Exception e) {
+ currentClock = Msg.getClock();
commReceive = null;
}
- } else {
- Msg.info("I couldn't join the ring");
+ }
+ leave();
+ if (commReceive != null) {
+ commReceive = null;
}
}
- void handleTask(Task task) {
+ private void handleTask(Task task) {
if (task instanceof FindSuccessorTask) {
FindSuccessorTask fTask = (FindSuccessorTask)task;
- Msg.debug("Receiving a 'Find Successor' request from " + fTask.issuerHostName + " for id " + fTask.requestId);
+ Msg.debug("Receiving a 'Find Successor' request from " + fTask.getIssuerHostName() + " for id " +
+ fTask.getRequestId());
// is my successor the successor?
- if (isInInterval(fTask.requestId, this.id + 1, fingers[0])) {
- Msg.debug("Send the request to " + fTask.answerTo + " with answer " + fingers[0]);
+ if (isInInterval(fTask.getRequestId(), this.id + 1, fingers[0])) {
+ Msg.debug("Send the request to " + fTask.getAnswerTo() + " with answer " + fingers[0]);
FindSuccessorAnswerTask answer = new FindSuccessorAnswerTask(getHost().getName(), mailbox, fingers[0]);
- answer.dsend(fTask.answerTo);
+ answer.dsend(fTask.getAnswerTo());
} else {
// otherwise, forward the request to the closest preceding finger in my table
- int closest = closestPrecedingNode(fTask.requestId);
+ int closest = closestPrecedingNode(fTask.getRequestId());
Msg.debug("Forward the request to " + closest);
fTask.dsend(Integer.toString(closest));
}
} else if (task instanceof GetPredecessorTask) {
GetPredecessorTask gTask = (GetPredecessorTask)(task);
- Msg.debug("Receiving a 'Get Predecessor' request from " + gTask.issuerHostName);
+ Msg.debug("Receiving a 'Get Predecessor' request from " + gTask.getIssuerHostName());
GetPredecessorAnswerTask answer = new GetPredecessorAnswerTask(getHost().getName(), mailbox, predId);
- answer.dsend(gTask.answerTo);
+ answer.dsend(gTask.getAnswerTo());
} else if (task instanceof NotifyTask) {
NotifyTask nTask = (NotifyTask)task;
- notify(nTask.requestId);
+ notify(nTask.getRequestId());
} else {
Msg.debug("Ignoring unexpected task of type:" + task);
}
}
- void leave() {
+ private void leave() {
Msg.debug("Well Guys! I Think it's time for me to quit ;)");
- quitNotify(1); //Notify my successor
- quitNotify(-1); //Notify my predecessor.
+ // TODO: Notify my successor and predecessor.
}
- /**
- * @brief Notifies the successor or the predecessor of the current node of the departure
- * @param to 1 to notify the successor, -1 to notify the predecessor
- */
- static void quitNotify( int to) {
- //TODO
- }
-
- /**
- * @brief Initializes the current node as the first one of the system.
- */
- void create() {
+ /** @brief Initializes the current node as the first one of the system */
+ private void create() {
Msg.debug("Create a new Chord ring...");
setPredecessor(-1);
}
// Makes the current node join the ring, knowing the id of a node already in the ring
- boolean join(int knownId) {
+ private boolean join(int knownId) {
Msg.info("Joining the ring with id " + this.id + " knowing node " + knownId);
setPredecessor(-1);
int successorId = remoteFindSuccessor(knownId, this.id);
return successorId != -1;
}
- void setPredecessor(int predecessorId) {
+ private void setPredecessor(int predecessorId) {
if (predecessorId != predId) {
predId = predecessorId;
if (predecessorId != -1) {
* @param askTo the node to ask to
* @return the id of its predecessor node, or -1 if the request failed(or if the node does not know its predecessor)
*/
- int remoteGetPredecessor(int askTo) {
+ private int remoteGetPredecessor(int askTo) {
int predecessorId = -1;
boolean stop = false;
Msg.debug("Sending a 'Get Predecessor' request to " + askTo);
commReceive.waitCompletion(Common.TIMEOUT);
Task taskReceived = commReceive.getTask();
if (taskReceived instanceof GetPredecessorAnswerTask) {
- predecessorId = ((GetPredecessorAnswerTask) taskReceived).answerId;
+ predecessorId = ((GetPredecessorAnswerTask) taskReceived).getAnswerId();
stop = true;
} else {
handleTask(taskReceived);
}
catch (MsgException e) {
commReceive = null;
- stop = true;
}
}
catch (MsgException e) {
* @param id the id to find
* @return the id of the successor node, or -1 if the request failed
*/
- int findSuccessor(int id) {
+ private int findSuccessor(int id) {
if (isInInterval(id, this.id + 1, fingers[0])) {
return fingers[0];
}
}
// Asks another node the successor node of an id.
- int remoteFindSuccessor(int askTo, int id) {
+ private int remoteFindSuccessor(int askTo, int id) {
int successor = -1;
boolean stop = false;
String askToMailbox = Integer.toString(askTo);
//TODO: Check if this this our answer.
FindSuccessorAnswerTask fTask = (FindSuccessorAnswerTask) task;
stop = true;
- successor = fTask.answerId;
+ successor = fTask.getAnswerId();
} else {
handleTask(task);
}
}
// This function is called periodically. It checks the immediate successor of the current node.
- void stabilize() {
+ private void stabilize() {
Msg.debug("Stabilizing node");
int candidateId;
int successorId = fingers[0];
* @brief Notifies the current node that its predecessor may have changed.
* @param candidate_id the possible new predecessor
*/
- void notify(int predecessorCandidateId) {
+ private void notify(int predecessorCandidateId) {
if (predId == -1 || isInInterval(predecessorCandidateId, predId + 1, this.id - 1 )) {
setPredecessor(predecessorCandidateId);
}
* @param notify_id id of the node to notify
* @param candidate_id the possible new predecessor
*/
- void remoteNotify(int notifyId, int predecessorCandidateId) {
+ private void remoteNotify(int notifyId, int predecessorCandidateId) {
Msg.debug("Sending a 'Notify' request to " + notifyId);
Task sentTask = new NotifyTask(getHost().getName(), this.mailbox, predecessorCandidateId);
sentTask.dsend(Integer.toString(notifyId));
// This function is called periodically.
// It refreshes the finger table of the current node.
- void fixFingers() {
+ private void fixFingers() {
Msg.debug("Fixing fingers");
int i = this.nextFingerToFix;
int successorId = this.findSuccessor(this.id + (int)Math.pow(2,i)); //FIXME: SLOW
// This function is called periodically.
// It checks whether the predecessor has failed
- void checkPredecessor() {
+ private void checkPredecessor() {
//TODO
}
// Performs a find successor request to a random id.
- void randomLookup() {
- int id = 1337;
- //Msg.info("Making a lookup request for id " + id);
- findSuccessor(id);
+ private void randomLookup() {
+ int dest = 1337;
+ findSuccessor(dest);
}
/**
* @param id the id to find
* @return the closest preceding finger of that id
*/
- int closestPrecedingNode(int id) {
+ private int closestPrecedingNode(int id) {
for (int i = Common.NB_BITS - 1; i >= 0; i--) {
if (isInInterval(fingers[i], this.id + 1, id - 1)) {
return fingers[i];
* @param end upper bound
* @return a non-zero value if id in in [start, end]
*/
- static boolean isInInterval(int id, int start, int end) {
+ private static boolean isInInterval(int id, int start, int end) {
int normId = normalize(id);
int normStart = normalize(start);
int normEnd = normalize(end);
* @param id an id
* @return the corresponding normalized id
*/
- static int normalize(int id) {
+ private static int normalize(int id) {
return id & (Common.NB_KEYS - 1);
}
* @param finger_index index of the finger to set (0 to nb_bits - 1)
* @param id the id to set for this finger
*/
- void setFinger(int fingerIndex, int id) {
+ private void setFinger(int fingerIndex, int id) {
if (id != fingers[fingerIndex]) {
fingers[fingerIndex] = id;
lastChangeDate = Msg.getClock();