Mercurial > hg > Database > Alice
view src/main/java/alice/topology/fix/FixTopology.java @ 474:6a71732cd3ee dispose
add topology fix package
author | sugi |
---|---|
date | Sun, 30 Nov 2014 00:01:35 +0900 |
parents | |
children | 8968b24c1ce3 |
line wrap: on
line source
package alice.topology.fix; import java.util.HashMap; import java.util.LinkedList; import alice.codesegment.CodeSegment; import alice.daemon.ConnectionInfo; import alice.datasegment.CommandType; import alice.datasegment.Receiver; import alice.topology.HostMessage; public class FixTopology extends CodeSegment { private Receiver info = ids.create(CommandType.TAKE); // disconnection nodeInfo private Receiver info1 = ids.create(CommandType.TAKE); // all connection Info private Receiver info2 = ids.create(CommandType.TAKE); // node count private Receiver info3 = ids.create(CommandType.TAKE); // need to search parent node public FixTopology() { info.setKey("_DISCONNECT"); info1.setKey("topology"); info2.setKey("hostCount"); info3.setKey("nodeConnectionInfo"); } @SuppressWarnings("unchecked") @Override public void run() { ConnectionInfo disconnect = info.asClass(ConnectionInfo.class); HashMap<String, HostMessage> nodeInfo = info3.asClass(HashMap.class); // check if (nodeInfo.containsKey(disconnect.nodeName)) { HostMessage registered = nodeInfo.get(disconnect.nodeName); // if information not match, FixTopology was change Information before. if ((registered.name.equals(disconnect.addr)||registered.name.equals(disconnect.hostname)) && (registered.port == disconnect.port)) { int nodeNum = info2.asInteger() - 1; // get last joined node String nodeName = "node"+nodeNum; if (nodeName.equals(disconnect.nodeName)) { // if disconnect node equal last joined node, only do update topology information. } else { // move last joined node to disconnect node position. HashMap<String, LinkedList<HostMessage>> topology = info1.asClass(HashMap.class); // send disconnect Message which connected to last joined node. LinkedList<HostMessage> list = topology.get(nodeName); // last joined node's list has only one node (parent) HostMessage host = list.getFirst(); ods.put(host.absName, "_DISCONNECTREQUEST", "DISCONNECT"); // remove last joined node information from parent and children list list = topology.get(host.absName); // parent list for (HostMessage node : list) { if (node.absName.equals(host.absName)) { list.remove(node); break; } } /* * children node * child node list has only last joined node. so list clear. */ int child1 = nodeNum * 2 + 1; int child2 = child1; String[] children = {"node"+child1, "node"+child2}; for (String name: children) { if (topology.containsKey(name)) topology.get(name).clear(); } // this list can see who connected disconnect node. //LinkedList<HostMessage> list = topology.get(disconnect.nodeName); } } else { } } else { // in this case. Key was deleted by FixTopology } } }