view src/main/java/alice/topology/manager/IncomingHosts.java @ 641:646f705e65b1

setkey on remote
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 31 Dec 2017 01:08:52 +0900
parents 8d9f35701fdb
children e321c5ec9b58
line wrap: on
line source

package alice.topology.manager;

import java.util.HashMap;
import java.util.LinkedList;

import org.apache.log4j.Logger;
import org.msgpack.type.ValueFactory;

import alice.codesegment.CodeSegment;
import alice.datasegment.CommandType;
import alice.datasegment.DataSegment;
import alice.datasegment.Receiver;
import alice.topology.HostMessage;

public class IncomingHosts extends CodeSegment {

    private Receiver topology = ids.create(CommandType.TAKE);  // Topology from parse file
    private Receiver nodeNames = ids.create(CommandType.TAKE); // nodeName list
    private Receiver host = ids.create(CommandType.TAKE);      // new coming host info
    private Receiver absCookieTable = ids.create(CommandType.TAKE); // cookie, AbsName HashMap
    private Receiver cookie = ids.create(CommandType.TAKE);    // MD5
    private Logger log = Logger.getLogger(IncomingHosts.class);

    public IncomingHosts() {
        this.topology.setKey("resultParse");
        this.nodeNames.setKey("nodeNames");
        this.host.setKey("newHost");
        this.absCookieTable.setKey("absCookieTable");
        this.cookie.setKey("MD5");
    }

    @Override
    public void run() {
        HostMessage host = this.host.asClass(HostMessage.class);
        @SuppressWarnings("unchecked")
        HashMap<String, String> absCookieTable = this.absCookieTable.asClass(HashMap.class);
        @SuppressWarnings("unchecked")
        HashMap<String, LinkedList<NodeInfo>> topology = this.topology.asClass(HashMap.class);
        @SuppressWarnings("unchecked")
        LinkedList<String> nodeNames = this.nodeNames.asClass(LinkedList.class);

        // not have or match cookie
        String nodeName = nodeNames.poll();
        // Manager connect to Node
        DataSegment.connect(nodeName, "", host.name, host.port);
        ods.put(nodeName, "host", nodeName);

        String cookie = this.cookie.asString();
        absCookieTable.put(cookie, nodeName);
        ods.put(this.absCookieTable.key, absCookieTable);

        ods.put(nodeName, "cookie", cookie);
        log.info( "toplology manager connected from " + nodeName);

        LinkedList<NodeInfo> nodes = topology.get(nodeName);
        for (NodeInfo nodeInfo : nodes) {
            HostMessage newHost = new HostMessage(host.name, host.port,
                    nodeInfo.connectionName, nodeInfo.reverseName);
            newHost.absName = nodeName;
            newHost.remoteAbsName = nodeInfo.sourceNodeName;

            ods.put("nodeInfo", newHost);
            ods.put(nodeInfo.sourceNodeName, newHost);
            new RecordTopology();
        }

        if (nodeNames.isEmpty()) {
            // configuration finish
            for (String key : topology.keySet()) {
                ods.put("local", key, ValueFactory.createNilValue());
            }
        }

        ods.put(this.nodeNames.key, nodeNames);
        ods.put(this.topology.key, topology);

        new IncomingHosts();
    }
}