1 package example.symphony;
\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
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
17 * @author Andrea Esposito <and1989@gmail.com>
\r
19 public class SymphonyNetworkChecker implements Control {
\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
26 public SymphonyNetworkChecker(String prefix) {
\r
27 symphonyID = Configuration.getPid(prefix + "." + PAR_SYMHONY);
\r
28 networkEstimatorID = Configuration.getPid(prefix + "." + PAR_NETSIZE);
\r
31 public boolean execute() {
\r
33 boolean isNotOK = false;
\r
35 Set<Double> idSet = new HashSet<Double>();
\r
36 Iterable<Node> coll = new AdapterIterableNetwork();
\r
38 int countOnline = 0;
\r
40 int notBootstrapped = 0;
\r
42 int disconnected = 0;
\r
44 for (Node node : coll) {
\r
45 SymphonyProtocol symphony = (SymphonyProtocol) node.getProtocol(symphonyID);
\r
53 if (symphony.loggedIntoNetwork == SymphonyProtocol.BootstrapStatus.ONLINE) {
\r
57 NetworkSizeEstimatorProtocolInterface networkEstimator = (NetworkSizeEstimatorProtocolInterface) node.getProtocol(networkEstimatorID);
\r
58 int k = (int) Math.ceil(Math.log(networkEstimator.getNetworkSize(node)) / Math.log(2));
\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
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
68 oneNeighborOnline = true;
\r
69 checkLeftShortRangeLinks = checkLeftShortRangeLinks && SymphonyProtocol.isLeftNeighbour(node, leftTuple.x);
\r
72 checkLeftShortRangeLinks = checkLeftShortRangeLinks && oneNeighborOnline;
\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
79 oneNeighborOnline = true;
\r
80 checkRightShortRangeLinks = checkRightShortRangeLinks && !SymphonyProtocol.isLeftNeighbour(node, rightTuple.x);
\r
83 checkRightShortRangeLinks = checkRightShortRangeLinks && oneNeighborOnline;
\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
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
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
101 boolean checkUniqueID = !idSet.contains(symphony.getIdentifier());
\r
102 idSet.add(symphony.getIdentifier());
\r
104 boolean nextIsNotOK = !(checkUniqueID && checkLeftShortRangeLinks && checkRightShortRangeLinks && checkLongRangeLinksOutgoing && checkLongRangeLinksIncoming);
\r
108 Logger.getLogger(SymphonyNetworkChecker.class.getName()).log(Level.SEVERE, "OPS");
\r
111 isNotOK = isNotOK || nextIsNotOK;
\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