Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge pull request #1 from mquinson/master
[simgrid.git] / contrib / psg / src / example / chord / ChordInitializer.java
1 package example.chord;\r
2 \r
3 import java.math.BigInteger;\r
4 import java.util.Random;\r
5 import peersim.config.Configuration;\r
6 import peersim.core.CommonState;\r
7 import peersim.core.Network;\r
8 import peersim.core.Node;\r
9 import peersim.dynamics.NodeInitializer;\r
10 \r
11 public class ChordInitializer implements NodeInitializer {\r
12 \r
13         private static final String PAR_PROT = "protocol";\r
14 \r
15         private int pid = 0;\r
16 \r
17         private ChordProtocol cp;\r
18 \r
19         public ChordInitializer(String prefix) {\r
20                 pid = Configuration.getPid(prefix + "." + PAR_PROT);\r
21         }\r
22 \r
23         public void initialize(Node n) {\r
24                 cp = (ChordProtocol) n.getProtocol(pid);\r
25                 join(n);\r
26         }\r
27 \r
28         public void join(Node myNode) {\r
29                 Random generator = new Random();\r
30                 //Random generator = new Random(1234567890);\r
31                 cp.predecessor = null;\r
32                 // search a node to join\r
33                 Node n;\r
34                 do {\r
35                         n = Network.get(generator.nextInt(Network.size()));\r
36                 } while (n == null || n.isUp() == false);\r
37                 cp.m = ((ChordProtocol) n.getProtocol(pid)).m;\r
38                 cp.chordId = new BigInteger(cp.m, CommonState.r);\r
39                 ChordProtocol cpRemote = (ChordProtocol) n.getProtocol(pid);\r
40 \r
41                 Node successor = cpRemote.find_successor(cp.chordId);\r
42                 cp.fails = 0;\r
43                 cp.stabilizations = 0;\r
44                 cp.varSuccList = cpRemote.varSuccList;\r
45                 cp.varSuccList = 0;\r
46                 cp.succLSize = cpRemote.succLSize;\r
47                 cp.successorList = new Node[cp.succLSize];\r
48                 cp.successorList[0] = successor;\r
49                 cp.fingerTable = new Node[cp.m];\r
50                 long succId = 0;\r
51                 BigInteger lastId = ((ChordProtocol) Network.get(Network.size() - 1)\r
52                                 .getProtocol(pid)).chordId;\r
53                 do {\r
54                         cp.stabilizations++;\r
55                         succId = cp.successorList[0].getID();\r
56                         cp.stabilize(myNode);\r
57                         if (((ChordProtocol) cp.successorList[0].getProtocol(pid)).chordId\r
58                                         .compareTo(cp.chordId) < 0) {\r
59                                 cp.successorList[0] = ((ChordProtocol) cp.successorList[0]\r
60                                                 .getProtocol(pid)).find_successor(cp.chordId);\r
61                         }\r
62                         // controllo di non essere l'ultimo elemento della rete\r
63                         if (cp.chordId.compareTo(lastId) > 0) {\r
64                                 cp.successorList[0] = Network.get(0);\r
65                                 break;\r
66                         }\r
67                 } while (cp.successorList[0].getID() != succId\r
68                                 || ((ChordProtocol) cp.successorList[0].getProtocol(pid)).chordId\r
69                                                 .compareTo(cp.chordId) < 0);\r
70                 cp.fixFingers();\r
71         }\r
72 }\r