Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
peersimgrid release 1.0
[simgrid.git] / contrib / psg / src / example / symphony / RingRouteTest.java
1 package example.symphony;\r
2 \r
3 import java.util.Collection;\r
4 import java.util.Collections;\r
5 import java.util.HashSet;\r
6 import java.util.LinkedList;\r
7 import java.util.logging.Level;\r
8 import java.util.logging.Logger;\r
9 \r
10 import example.symphony.SymphonyProtocol.BootstrapStatus;\r
11 import peersim.config.Configuration;\r
12 import peersim.core.Control;\r
13 import peersim.core.Network;\r
14 import peersim.core.Node;\r
15 \r
16 /**\r
17  *\r
18  * @author Andrea Esposito <and1989@gmail.com>\r
19  */\r
20 public class RingRouteTest implements Control, Handler {\r
21 \r
22     private static final String PAR_SYMPHONY = "symphony";\r
23     private static final String PAR_STARTNODE = "startnode";\r
24     private final int symphonyID;\r
25     private final int indexStartNode;\r
26     private Node start;\r
27     private boolean finished;\r
28     private boolean flagTimeout;\r
29     private HashSet<Node> antiLoopSet;\r
30 \r
31     public RingRouteTest(String prefix) {\r
32         symphonyID = Configuration.getPid(prefix + "." + PAR_SYMPHONY);\r
33         indexStartNode = Configuration.getInt(prefix + "." + PAR_STARTNODE, 0);\r
34 \r
35         finished = true;\r
36         flagTimeout = false;\r
37         antiLoopSet = new HashSet<Node>();\r
38     }\r
39 \r
40     public boolean execute() {\r
41 \r
42         if (!finished && flagTimeout) {\r
43 \r
44             Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Sent msg but no aswer. Timeout. Ring Route Test terminated for Timeout.");\r
45 \r
46             finished = true;\r
47             flagTimeout = false;\r
48         }\r
49 \r
50         if (finished) {\r
51 \r
52             flagTimeout = true;\r
53             antiLoopSet.clear();\r
54 \r
55             int indexRealStartNode = indexStartNode;\r
56             Node realStartNode = Network.get(indexStartNode);\r
57             SymphonyProtocol symphony = (SymphonyProtocol) realStartNode.getProtocol(symphonyID);\r
58 \r
59             while (!symphony.isBootstrapped() || !realStartNode.isUp()) {\r
60                 indexRealStartNode = (indexRealStartNode + 1) % Network.size();\r
61                 realStartNode = Network.get(indexRealStartNode);\r
62                 symphony = (SymphonyProtocol) realStartNode.getProtocol(symphonyID);\r
63 \r
64                 if (indexRealStartNode == indexStartNode) {\r
65                     Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "No ONLINE nodes. The ring is vanished. Ring Route Terminated.");\r
66                     finished = true;\r
67                     flagTimeout = false;\r
68                     return false;\r
69                 }\r
70             }\r
71 \r
72             start = realStartNode;\r
73             finished = false;\r
74 \r
75             Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "RingRoute started.");\r
76 \r
77             doRoute(start, true);\r
78         }\r
79 \r
80         return false;\r
81     }\r
82 \r
83     public void handle(SymphonyProtocol symphony, Tuple<Node, Double> tuple) {\r
84 \r
85         if (tuple == null) {\r
86             Logger.getLogger(RingRouteTest.class.getName()).log(Level.SEVERE, "FAIL RING ROUTING");\r
87             finished = true;\r
88             return;\r
89         }\r
90 \r
91         Logger.getLogger(RingRouteTest.class.getName()).log(Level.FINER, symphony.getIdentifier() + " source find the manager of " + tuple.y + " and it is " + ((SymphonyProtocol) tuple.x.getProtocol(symphonyID)).getIdentifier());\r
92 \r
93         doRoute(tuple.x, false);\r
94     }\r
95 \r
96     private void doRoute(Node node, boolean firstTime) {\r
97 \r
98         SymphonyProtocol symphonyStartNode = (SymphonyProtocol) start.getProtocol(symphonyID);\r
99 \r
100         if (!symphonyStartNode.isBootstrapped()) {\r
101             Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "The node i started from left. Ring Route Terminated.");\r
102             finished = true;\r
103             return;\r
104         }\r
105 \r
106         if (!firstTime && node.equals(start)) {\r
107             Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "RingRoute Terminated");\r
108             finished = true;\r
109             return;\r
110         }\r
111 \r
112         if (antiLoopSet.contains(node)) {\r
113             Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "Not able to reach the node that i started from. Ring Route Terminated.");\r
114             finished = true;\r
115             return;\r
116         } else {\r
117             antiLoopSet.add(node);\r
118         }\r
119 \r
120         SymphonyProtocol symphony = (SymphonyProtocol) node.getProtocol(symphonyID);\r
121         AdapterSymphonyNodeComparator adapterSymphonyNodeComparator = new AdapterSymphonyNodeComparator(new SymphonyNodeComparator(symphonyID, node));\r
122 \r
123         Collection<Tuple<Node, BootstrapStatus>> collection = (Collection<Tuple<Node, BootstrapStatus>>) symphony.leftShortRangeLinks.clone();\r
124         LinkedList<Tuple<Node, BootstrapStatus>> list = new LinkedList<Tuple<Node, BootstrapStatus>>(collection);\r
125         Collections.sort(list, adapterSymphonyNodeComparator);\r
126 \r
127         Node targetNode = null;\r
128         for (Tuple<Node, BootstrapStatus> tuple : list) {\r
129             if (tuple.y == BootstrapStatus.ONLINE) {\r
130                 targetNode = tuple.x;\r
131                 break;\r
132             }\r
133         }\r
134 \r
135         if (targetNode == null || !targetNode.isUp()) {\r
136             Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Terminated Ring Route but not done completely");\r
137             finished = true;\r
138             return;\r
139         }\r
140 \r
141         SymphonyProtocol symphonyTarget = (SymphonyProtocol) targetNode.getProtocol(symphonyID);\r
142         try {\r
143             symphony.route(node, symphonyTarget.getIdentifier(), this);\r
144             Logger.getLogger(RingRouteTest.class.getName()).log(Level.FINEST, "Ring from: " + symphony.getIdentifier() + " to " + symphonyTarget.getIdentifier());\r
145         } catch (RoutingException ex) {\r
146             Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Finito AnelloRoute MA NON FATTO TUTTO");\r
147             finished = true;\r
148         }\r
149     }\r
150 }\r