view src/main/java/christie/test/topology/paxos/acceptor/AcceptCodeGear.java @ 190:2d0d41b648fa

add PromiseProposal and refactor acceptor
author akahori
date Tue, 12 Feb 2019 16:10:15 +0900
parents 1bffd8151c6a
children f4343de364da
line wrap: on
line source

package christie.test.topology.paxos.acceptor;

import christie.annotation.Peek;
import christie.annotation.Take;
import christie.codegear.CodeGear;
import christie.codegear.CodeGearManager;
import christie.test.topology.paxos.Proposal;
import christie.topology.TopologyDataGear;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.List;

public class AcceptCodeGear extends CodeGear {

    @Peek
    TopologyDataGear topoDG;

    @Take
    Proposal acceptProposal;


    //PromiseProposal promiseProposal;

    //@Take
    //Proposal promisedProposal;

    Logger logger = LogManager.getLogger(AcceptCodeGear.class);


    @Override
    protected void run(CodeGearManager cgm) {
        List<String> _CLIST = topoDG.getConnectionList();

        // promise codegearでも使うので, lock
        PromiseProposal.getInstance().lock();
        PromiseProposal promiseProposal = PromiseProposal.getInstance();
        Proposal promisedProposal = promiseProposal.getPromiseProposal();

        if(acceptProposal.getNumber() >= promisedProposal.getNumber()) {
            logger.debug(acceptProposal + " >= " + promisedProposal);
            acceptProposal.setAccepted(true);
            acceptProposal.setAcceptorName(topoDG.getNodeName());

            promisedProposal = acceptProposal;

            for (String connectionNodeName : _CLIST){
                if(connectionNodeName.matches("learner" + ".*")) {
                    //logger.debug("send " + topoDG.getNodeName() + " to "
                    // + connectionNodeName + " " + promisedProposal);
                    getDGM(connectionNodeName).put("acceptedProposal", promisedProposal);
                }
            }
        }
        promiseProposal.setPromiseProposal(promisedProposal);
        promiseProposal.unLock();
        logger.debug("accept " + topoDG.getNodeName() + " " + promisedProposal);
        put(acceptProposal.getProposerName(), "acceptedProposal", promisedProposal);
        put("promisedProposal", promisedProposal);

        cgm.setup(new AcceptCodeGear());
    }


}