Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
peersimgrid release 1.0
[simgrid.git] / contrib / psg / src / example / symphony / RingRouteTest.java
diff --git a/contrib/psg/src/example/symphony/RingRouteTest.java b/contrib/psg/src/example/symphony/RingRouteTest.java
new file mode 100644 (file)
index 0000000..06262cb
--- /dev/null
@@ -0,0 +1,150 @@
+package example.symphony;\r
+\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.HashSet;\r
+import java.util.LinkedList;\r
+import java.util.logging.Level;\r
+import java.util.logging.Logger;\r
+\r
+import example.symphony.SymphonyProtocol.BootstrapStatus;\r
+import peersim.config.Configuration;\r
+import peersim.core.Control;\r
+import peersim.core.Network;\r
+import peersim.core.Node;\r
+\r
+/**\r
+ *\r
+ * @author Andrea Esposito <and1989@gmail.com>\r
+ */\r
+public class RingRouteTest implements Control, Handler {\r
+\r
+    private static final String PAR_SYMPHONY = "symphony";\r
+    private static final String PAR_STARTNODE = "startnode";\r
+    private final int symphonyID;\r
+    private final int indexStartNode;\r
+    private Node start;\r
+    private boolean finished;\r
+    private boolean flagTimeout;\r
+    private HashSet<Node> antiLoopSet;\r
+\r
+    public RingRouteTest(String prefix) {\r
+        symphonyID = Configuration.getPid(prefix + "." + PAR_SYMPHONY);\r
+        indexStartNode = Configuration.getInt(prefix + "." + PAR_STARTNODE, 0);\r
+\r
+        finished = true;\r
+        flagTimeout = false;\r
+        antiLoopSet = new HashSet<Node>();\r
+    }\r
+\r
+    public boolean execute() {\r
+\r
+        if (!finished && flagTimeout) {\r
+\r
+            Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Sent msg but no aswer. Timeout. Ring Route Test terminated for Timeout.");\r
+\r
+            finished = true;\r
+            flagTimeout = false;\r
+        }\r
+\r
+        if (finished) {\r
+\r
+            flagTimeout = true;\r
+            antiLoopSet.clear();\r
+\r
+            int indexRealStartNode = indexStartNode;\r
+            Node realStartNode = Network.get(indexStartNode);\r
+            SymphonyProtocol symphony = (SymphonyProtocol) realStartNode.getProtocol(symphonyID);\r
+\r
+            while (!symphony.isBootstrapped() || !realStartNode.isUp()) {\r
+                indexRealStartNode = (indexRealStartNode + 1) % Network.size();\r
+                realStartNode = Network.get(indexRealStartNode);\r
+                symphony = (SymphonyProtocol) realStartNode.getProtocol(symphonyID);\r
+\r
+                if (indexRealStartNode == indexStartNode) {\r
+                    Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "No ONLINE nodes. The ring is vanished. Ring Route Terminated.");\r
+                    finished = true;\r
+                    flagTimeout = false;\r
+                    return false;\r
+                }\r
+            }\r
+\r
+            start = realStartNode;\r
+            finished = false;\r
+\r
+            Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "RingRoute started.");\r
+\r
+            doRoute(start, true);\r
+        }\r
+\r
+        return false;\r
+    }\r
+\r
+    public void handle(SymphonyProtocol symphony, Tuple<Node, Double> tuple) {\r
+\r
+        if (tuple == null) {\r
+            Logger.getLogger(RingRouteTest.class.getName()).log(Level.SEVERE, "FAIL RING ROUTING");\r
+            finished = true;\r
+            return;\r
+        }\r
+\r
+        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
+\r
+        doRoute(tuple.x, false);\r
+    }\r
+\r
+    private void doRoute(Node node, boolean firstTime) {\r
+\r
+        SymphonyProtocol symphonyStartNode = (SymphonyProtocol) start.getProtocol(symphonyID);\r
+\r
+        if (!symphonyStartNode.isBootstrapped()) {\r
+            Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "The node i started from left. Ring Route Terminated.");\r
+            finished = true;\r
+            return;\r
+        }\r
+\r
+        if (!firstTime && node.equals(start)) {\r
+            Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "RingRoute Terminated");\r
+            finished = true;\r
+            return;\r
+        }\r
+\r
+        if (antiLoopSet.contains(node)) {\r
+            Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "Not able to reach the node that i started from. Ring Route Terminated.");\r
+            finished = true;\r
+            return;\r
+        } else {\r
+            antiLoopSet.add(node);\r
+        }\r
+\r
+        SymphonyProtocol symphony = (SymphonyProtocol) node.getProtocol(symphonyID);\r
+        AdapterSymphonyNodeComparator adapterSymphonyNodeComparator = new AdapterSymphonyNodeComparator(new SymphonyNodeComparator(symphonyID, node));\r
+\r
+        Collection<Tuple<Node, BootstrapStatus>> collection = (Collection<Tuple<Node, BootstrapStatus>>) symphony.leftShortRangeLinks.clone();\r
+        LinkedList<Tuple<Node, BootstrapStatus>> list = new LinkedList<Tuple<Node, BootstrapStatus>>(collection);\r
+        Collections.sort(list, adapterSymphonyNodeComparator);\r
+\r
+        Node targetNode = null;\r
+        for (Tuple<Node, BootstrapStatus> tuple : list) {\r
+            if (tuple.y == BootstrapStatus.ONLINE) {\r
+                targetNode = tuple.x;\r
+                break;\r
+            }\r
+        }\r
+\r
+        if (targetNode == null || !targetNode.isUp()) {\r
+            Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Terminated Ring Route but not done completely");\r
+            finished = true;\r
+            return;\r
+        }\r
+\r
+        SymphonyProtocol symphonyTarget = (SymphonyProtocol) targetNode.getProtocol(symphonyID);\r
+        try {\r
+            symphony.route(node, symphonyTarget.getIdentifier(), this);\r
+            Logger.getLogger(RingRouteTest.class.getName()).log(Level.FINEST, "Ring from: " + symphony.getIdentifier() + " to " + symphonyTarget.getIdentifier());\r
+        } catch (RoutingException ex) {\r
+            Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Finito AnelloRoute MA NON FATTO TUTTO");\r
+            finished = true;\r
+        }\r
+    }\r
+}\r