Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge pull request #1 from mquinson/master
[simgrid.git] / contrib / psg / src / example / symphony / SymphonyNetworkChecker.java
1 package example.symphony;\r
2 \r
3 import java.util.Collections;\r
4 import java.util.HashSet;\r
5 import java.util.Set;\r
6 import java.util.logging.Level;\r
7 import java.util.logging.Logger;\r
8 \r
9 import example.symphony.SymphonyProtocol.BootstrapStatus;\r
10 import peersim.config.Configuration;\r
11 import peersim.core.Control;\r
12 import peersim.core.Network;\r
13 import peersim.core.Node;\r
14 \r
15 /**\r
16  *\r
17  * @author Andrea Esposito <and1989@gmail.com>\r
18  */\r
19 public class SymphonyNetworkChecker implements Control {\r
20 \r
21     private static final String PAR_SYMHONY = "symphony";\r
22     private static final String PAR_NETSIZE = "networkestimator";\r
23     private final int symphonyID;\r
24     private final int networkEstimatorID;\r
25 \r
26     public SymphonyNetworkChecker(String prefix) {\r
27         symphonyID = Configuration.getPid(prefix + "." + PAR_SYMHONY);\r
28         networkEstimatorID = Configuration.getPid(prefix + "." + PAR_NETSIZE);\r
29     }\r
30 \r
31     public boolean execute() {\r
32 \r
33         boolean isNotOK = false;\r
34 \r
35         Set<Double> idSet = new HashSet<Double>();\r
36         Iterable<Node> coll = new AdapterIterableNetwork();\r
37 \r
38         int countOnline = 0;\r
39         int count = 0;\r
40         int notBootstrapped = 0;\r
41         int countKO = 0;\r
42         int disconnected = 0;\r
43 \r
44         for (Node node : coll) {\r
45             SymphonyProtocol symphony = (SymphonyProtocol) node.getProtocol(symphonyID);\r
46 \r
47             if (!node.isUp()) {\r
48                 disconnected++;\r
49             } else {\r
50                 count++;\r
51             }\r
52 \r
53             if (symphony.loggedIntoNetwork == SymphonyProtocol.BootstrapStatus.ONLINE) {\r
54 \r
55                 countOnline++;\r
56 \r
57                 NetworkSizeEstimatorProtocolInterface networkEstimator = (NetworkSizeEstimatorProtocolInterface) node.getProtocol(networkEstimatorID);\r
58                 int k = (int) Math.ceil(Math.log(networkEstimator.getNetworkSize(node)) / Math.log(2));\r
59 \r
60                 boolean checkLeftShortRangeLinks = symphony.leftShortRangeLinks.size() > 0 && symphony.leftShortRangeLinks.size() <= symphony.numberShortRangeLinksPerSide;\r
61                 boolean checkRightShortRangeLinks = symphony.rightShortRangeLinks.size() > 0 && symphony.rightShortRangeLinks.size() <= symphony.numberShortRangeLinksPerSide;\r
62 \r
63                 boolean oneNeighborOnline = false;\r
64                 for (Tuple<Node, BootstrapStatus> leftTuple : symphony.leftShortRangeLinks) {\r
65                     if (leftTuple.y != BootstrapStatus.ONLINE && leftTuple.y != BootstrapStatus.OFFLINE) {\r
66                         notBootstrapped++;\r
67                     } else {\r
68                         oneNeighborOnline = true;\r
69                         checkLeftShortRangeLinks = checkLeftShortRangeLinks && SymphonyProtocol.isLeftNeighbour(node, leftTuple.x);\r
70                     }\r
71                 }\r
72                 checkLeftShortRangeLinks = checkLeftShortRangeLinks && oneNeighborOnline;\r
73 \r
74                 oneNeighborOnline = false;\r
75                 for (Tuple<Node, BootstrapStatus> rightTuple : symphony.rightShortRangeLinks) {\r
76                     if (rightTuple.y != BootstrapStatus.ONLINE && rightTuple.y != BootstrapStatus.OFFLINE) {\r
77                         notBootstrapped++;\r
78                     } else {\r
79                         oneNeighborOnline = true;\r
80                         checkRightShortRangeLinks = checkRightShortRangeLinks && !SymphonyProtocol.isLeftNeighbour(node, rightTuple.x);\r
81                     }\r
82                 }\r
83                 checkRightShortRangeLinks = checkRightShortRangeLinks && oneNeighborOnline;\r
84 \r
85                 // Check if the node is in its neighbours\r
86                 if (checkLeftShortRangeLinks) {\r
87                     AdapterSymphonyNodeComparator comparator = new AdapterSymphonyNodeComparator(new SymphonyNodeComparator(symphonyID, node));\r
88                     checkLeftShortRangeLinks = checkLeftShortRangeLinks && !Collections.min(symphony.leftShortRangeLinks, comparator).x.equals(node);\r
89                 }\r
90 \r
91                 if (checkRightShortRangeLinks) {\r
92                     AdapterSymphonyNodeComparator comparator = new AdapterSymphonyNodeComparator(new SymphonyNodeComparator(symphonyID, node));\r
93                     checkRightShortRangeLinks = checkRightShortRangeLinks && !Collections.min(symphony.rightShortRangeLinks, comparator).x.equals(node);\r
94                 }\r
95 \r
96                 boolean checkLongRangeLinksOutgoing = !symphony.longRangeLinksOutgoing.contains(node);\r
97                 boolean checkLongRangeLinksIncoming = /*\r
98                          * symphony.longRangeLinksIncoming.size() <= (2 * k) &&\r
99                          */ !symphony.longRangeLinksIncoming.contains(node);\r
100 \r
101                 boolean checkUniqueID = !idSet.contains(symphony.getIdentifier());\r
102                 idSet.add(symphony.getIdentifier());\r
103 \r
104                 boolean nextIsNotOK = !(checkUniqueID && checkLeftShortRangeLinks && checkRightShortRangeLinks && checkLongRangeLinksOutgoing && checkLongRangeLinksIncoming);\r
105 \r
106                 if (nextIsNotOK) {\r
107                     countKO++;\r
108                     Logger.getLogger(SymphonyNetworkChecker.class.getName()).log(Level.SEVERE, "OPS");\r
109                 }\r
110 \r
111                 isNotOK = isNotOK || nextIsNotOK;\r
112             }\r
113         }\r
114 \r
115         System.out.println("Error: " + countKO);\r
116         System.out.println("Online: " + countOnline + "/" + count);\r
117         System.out.println("Not Bootstrapped: " + notBootstrapped);\r
118         System.out.println("Disconnected: " + disconnected);\r
119         System.out.println("Network Size: " + Network.size());\r
120 \r
121         return isNotOK;\r
122     }\r
123 }\r