view src/main/java/alice/topology/manager/CreateTreeTopology.java @ 647:e321c5ec9b58

fix toplogy manager; ring worked
author suruga
date Sun, 31 Dec 2017 19:32:27 +0900
parents 8d9f35701fdb
children
line wrap: on
line source

package alice.topology.manager;

import java.util.HashMap;

import alice.datasegment.DataSegmentManager;
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 CreateTreeTopology extends CodeSegment{

    private Receiver info = ids.create(CommandType.TAKE);
    private Receiver info1 = ids.create(CommandType.TAKE);
    private Receiver info2 = ids.create(CommandType.TAKE); // HashMap
    private Receiver info3 = ids.create(CommandType.TAKE); // MD5
    private Receiver info4 = ids.create(CommandType.TAKE);
    private Receiver info6 = ids.create(CommandType.TAKE);
    private Receiver info7 = ids.create(CommandType.PEEK);

    public CreateTreeTopology(){
        info.setKey("newHost");
        info1.setKey("hostCount");
        info2.setKey("nameTable");
        info3.setKey("MD5");
        info4.setKey("absCookieTable");
        info6.setKey("parentManager");
        info7.setKey("config");
    }

    @SuppressWarnings("unchecked")
    @Override
    public void run() {
        String cookie = info3.asString();
        System.out.println("cookie:" + cookie);
        HostMessage host = info.asClass(HostMessage.class);
        int comingHostCount = info1.asInteger();
        ParentManager manager = info6.asClass(ParentManager.class);
        TopologyManagerConfig topologyManagerConfig = info7.asClass(TopologyManagerConfig.class);
        HashMap<String, HostMessage> nameTable = info2.asClass(HashMap.class);
        HashMap<String, String> absCookieTable = info4.asClass(HashMap.class);

        String nodeName = "node"+comingHostCount;
        // Manager connect to Node
        if (host.port == 0) {
            // local test mode
            DataSegmentManager dsm = DataSegment.get(host.name);
            DataSegment.register(nodeName, dsm);
        } else {
            DataSegment.connect(nodeName, nodeName, host.name, host.port);
        }
        ods.put(nodeName, "host", nodeName);
        ods.put(nodeName, "cookie", cookie);

        absCookieTable.put(cookie, nodeName);
        ods.put(info4.key, absCookieTable);
        ods.put(info1.key, comingHostCount+1);
        host.alive = true;
        nameTable.put(nodeName, host);
        manager.register(nodeName);

        if (comingHostCount!=0) {
            // put parent information own
            String parentAbsName = manager.getMyParent();
            HostMessage parent = nameTable.get(parentAbsName);
            int num = manager.getMyNumber();

            HostMessage newHost = new HostMessage(parent.name, parent.port, "parent", "child"+num);
            newHost.absName = parentAbsName;
            newHost.remoteAbsName = nodeName; // address
            ods.put(newHost.remoteAbsName, newHost);

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

            // put own information parent
            newHost = new HostMessage(host.name, host.port, "child"+num, "parent");
            newHost.absName = nodeName;
            newHost.remoteAbsName = parentAbsName;

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

        }

        ods.put(info2.key, nameTable);
        ods.put(info6.key, manager);
        ods.put(nodeName, new HostMessage("",0,"","") );
        if (comingHostCount==0)
            ods.put("start", ValueFactory.createNilValue());
    }
}