Mercurial > hg > FederatedLinda
diff src/fdl/test/debug2/ConfigurationManagerEngine.java @ 92:ea4ee892baf5
commit
author | kazz <kazz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 22 Apr 2010 16:13:03 +0900 |
parents | |
children | 0ea086f0e96f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fdl/test/debug2/ConfigurationManagerEngine.java Thu Apr 22 16:13:03 2010 +0900 @@ -0,0 +1,173 @@ +package fdl.test.debug2; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import fdl.*; + +public class ConfigurationManagerEngine implements MetaEngine { + public static final int DEFAULTPORT = 10000; + + private int nodeNum = 0; + private int relayNum = 0; + private int relaySize = 1; + private MetaLinda ml; + private NodeInfo[] nodes; + private boolean running = true; + + private class AcceptNewNode implements PSXCallback { + int count = 0; + public void callback(ByteBuffer reply) { + String[] hostData = new String(reply.array()).split(":"); + String hostName = hostData[0]; + int port = DEFAULTPORT; + if (hostData.length > 1) + port = Integer.parseInt(hostData[1]); + nodes[count] = new NodeInfo(hostName, port); + try { + nodes[count].linda = ml.open(hostName, port); + } catch (IOException e) { + e.printStackTrace(); + } + if (++count < nodeNum) { + ml.in(TupleId.MANAGE.id, this); + } else { + linkNodes(); + ml.in(TupleId.MANAGE.id, new ConfirmConnectionNode()); + } + } + } + + private class ConfirmConnectionNode implements PSXCallback { + int count = 0; + public void callback(ByteBuffer reply) { + if (++count < nodeNum) { + ml.in(TupleId.MANAGE.id, this); + } else { + routingNodes(); + ml.in(TupleId.MANAGE.id, new ConfirmRoutingNode()); + } + } + + } + + private class ConfirmRoutingNode implements PSXCallback { + int count = 0; + public void callback(ByteBuffer reply) { + if (++count < nodeNum) { + ml.in(TupleId.MANAGE.id, this); + } else { + print("All link configured!"); + // TREE実験開始を通知 + nodes[0].linda.out(TupleId.START.id, ByteBuffer.wrap("0".getBytes())); + // DebugRing 開始を通知 + //nodes[0].linda.out(DEBUGSTART, ByteBuffer.wrap(("print," + BODY + ",").getBytes())); + ml.in(TupleId.START.id, new ConfirmFinish()); + } + } + + } + + private class ConfirmFinish implements PSXCallback { + public void callback(ByteBuffer reply) { + System.out.println(new String(reply.array())); + nodes[0].linda.out(TupleId.DEBUGSTART.id, ByteBuffer.wrap("shutdown".getBytes())); + print("Finish token"); + try { + nodes[0].linda.sync(1); + } catch (IOException e) { + e.printStackTrace(); + } + running = false; + } + + } + + private class RingLoop implements PSXCallback { + int counter = 0; + public void callback(ByteBuffer reply) { + nodes[0].linda.out(TupleId.DEBUGSTART.id, ByteBuffer.wrap(("print," + TupleId.BODY.id + ",").getBytes())); + print("ring=" + counter + ": \n" + new String(reply.array())); + counter++; + ml.in(TupleId.DEBUG.id, this); + } + + } + + public ConfigurationManagerEngine(MetaLinda metaLinda, int nodeNum, int relayNum, int relaySize) { + // initialize + this.ml = metaLinda; + this.nodeNum = nodeNum; + this.relayNum = relayNum; + this.relaySize = relaySize; + nodes = new NodeInfo[nodeNum]; + } + + public void mainLoop() { + // resist poll tuple id + ml.in(TupleId.MANAGE.id, new AcceptNewNode()); + ml.in(TupleId.DEBUG.id, new RingLoop()); + while (running) + ml.sync(); + } + + private void linkNodes() { + for (int i = 0; i < nodes.length; i++) { + // XML for Tree Topology + ConnectionXMLBuilder tree = new ConnectionXMLBuilder(i); + int k; + if (i != 0) { // TOP + k = (i-1)/2; + tree.appendConnection(TupleId.TREETOP, nodes[k].host, nodes[k].port, (i%2 == 0) ? TupleId.TREERIGHT : TupleId.TREELEFT); + } + if ((k = 2*i+1) < nodes.length) // LEFT + tree.appendConnection(TupleId.TREELEFT, nodes[k].host, nodes[k].port, TupleId.TREETOP); + if ((k = 2*i+2) < nodes.length) // RIGHT + tree.appendConnection(TupleId.TREERIGHT, nodes[k].host, nodes[k].port, TupleId.TREETOP); + nodes[i].connectionXML = tree.createXML(); + nodes[i].linda.out(TupleId.MANAGE.id, ByteBuffer.wrap(nodes[i].connectionXML.getBytes())); + print(nodes[i].connectionXML); + + // XML for Ring Debug Topology + ConnectionXMLBuilder debug = new ConnectionXMLBuilder(i); + int left = (nodes.length + i - 1) % nodes.length; + int right = (i + 1) % nodes.length; + debug.appendConnection(TupleId.RINGLEFT, nodes[left].host, nodes[left].port, TupleId.RINGRIGHT); + debug.appendConnection(TupleId.RINGRIGHT, nodes[right].host, nodes[right].port, TupleId.RINGLEFT); + nodes[i].debugConnectionXML = debug.createXML(); + nodes[i].linda.out(TupleId.DEBUG.id, ByteBuffer.wrap(nodes[i].debugConnectionXML.getBytes())); + print(nodes[i].debugConnectionXML); + } + } + + private void routingNodes() { + for (int i = 0; i < nodes.length; i++) { + RoutingXMLBuilder tree = new RoutingXMLBuilder(); + if (i != 0) { // TOP + if (2*i+1 < nodes.length) { // LEFT + tree.appendRoutingTable(TupleId.TREETOP, TupleId.TREELEFT); + tree.appendRoutingTable(TupleId.TREELEFT, TupleId.TREETOP); + } + if (2*i+2 < nodes.length) { // RIGHT + tree.appendRoutingTable(TupleId.TREETOP, TupleId.TREERIGHT); + tree.appendRoutingTable(TupleId.TREERIGHT, TupleId.TREETOP); + } + } + nodes[i].routingXML = tree.createXML(); + nodes[i].linda.out(TupleId.MANAGE.id, ByteBuffer.wrap(nodes[i].routingXML.getBytes())); + print(nodes[i].routingXML); + + RoutingXMLBuilder debug = new RoutingXMLBuilder(); + debug.appendRoutingTable(TupleId.RINGLEFT, TupleId.RINGRIGHT); + debug.appendRoutingTable(TupleId.RINGRIGHT, TupleId.RINGLEFT); + nodes[i].debugRoutingXML = debug.createXML(); + nodes[i].linda.out(TupleId.DEBUG.id, ByteBuffer.wrap(nodes[i].debugRoutingXML.getBytes())); + print(nodes[i].debugRoutingXML); + } + } + + void print(String str) { + System.err.println("[DEBUG] ConfigurationManager: " + str); + } + +}