Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
peersimgrid release 1.0
[simgrid.git] / contrib / psg / src / example / chord / ChordInitializer.java
diff --git a/contrib/psg/src/example/chord/ChordInitializer.java b/contrib/psg/src/example/chord/ChordInitializer.java
new file mode 100644 (file)
index 0000000..799b0d7
--- /dev/null
@@ -0,0 +1,72 @@
+package example.chord;\r
+\r
+import java.math.BigInteger;\r
+import java.util.Random;\r
+import peersim.config.Configuration;\r
+import peersim.core.CommonState;\r
+import peersim.core.Network;\r
+import peersim.core.Node;\r
+import peersim.dynamics.NodeInitializer;\r
+\r
+public class ChordInitializer implements NodeInitializer {\r
+\r
+       private static final String PAR_PROT = "protocol";\r
+\r
+       private int pid = 0;\r
+\r
+       private ChordProtocol cp;\r
+\r
+       public ChordInitializer(String prefix) {\r
+               pid = Configuration.getPid(prefix + "." + PAR_PROT);\r
+       }\r
+\r
+       public void initialize(Node n) {\r
+               cp = (ChordProtocol) n.getProtocol(pid);\r
+               join(n);\r
+       }\r
+\r
+       public void join(Node myNode) {\r
+               Random generator = new Random();\r
+               //Random generator = new Random(1234567890);\r
+               cp.predecessor = null;\r
+               // search a node to join\r
+               Node n;\r
+               do {\r
+                       n = Network.get(generator.nextInt(Network.size()));\r
+               } while (n == null || n.isUp() == false);\r
+               cp.m = ((ChordProtocol) n.getProtocol(pid)).m;\r
+               cp.chordId = new BigInteger(cp.m, CommonState.r);\r
+               ChordProtocol cpRemote = (ChordProtocol) n.getProtocol(pid);\r
+\r
+               Node successor = cpRemote.find_successor(cp.chordId);\r
+               cp.fails = 0;\r
+               cp.stabilizations = 0;\r
+               cp.varSuccList = cpRemote.varSuccList;\r
+               cp.varSuccList = 0;\r
+               cp.succLSize = cpRemote.succLSize;\r
+               cp.successorList = new Node[cp.succLSize];\r
+               cp.successorList[0] = successor;\r
+               cp.fingerTable = new Node[cp.m];\r
+               long succId = 0;\r
+               BigInteger lastId = ((ChordProtocol) Network.get(Network.size() - 1)\r
+                               .getProtocol(pid)).chordId;\r
+               do {\r
+                       cp.stabilizations++;\r
+                       succId = cp.successorList[0].getID();\r
+                       cp.stabilize(myNode);\r
+                       if (((ChordProtocol) cp.successorList[0].getProtocol(pid)).chordId\r
+                                       .compareTo(cp.chordId) < 0) {\r
+                               cp.successorList[0] = ((ChordProtocol) cp.successorList[0]\r
+                                               .getProtocol(pid)).find_successor(cp.chordId);\r
+                       }\r
+                       // controllo di non essere l'ultimo elemento della rete\r
+                       if (cp.chordId.compareTo(lastId) > 0) {\r
+                               cp.successorList[0] = Network.get(0);\r
+                               break;\r
+                       }\r
+               } while (cp.successorList[0].getID() != succId\r
+                               || ((ChordProtocol) cp.successorList[0].getProtocol(pid)).chordId\r
+                                               .compareTo(cp.chordId) < 0);\r
+               cp.fixFingers();\r
+       }\r
+}\r