view src/main/java/christie/test/topology/paxos/proposer/ReceivePromiseCodeGear.java @ 191:3a4f77778d90

fix receivepromisecg
author akahori
date Tue, 12 Feb 2019 16:10:57 +0900
parents 9b0a7f8dde81
children dd3c0ba6a0a6
line wrap: on
line source

package christie.test.topology.paxos.proposer;

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

public class ReceivePromiseCodeGear extends CodeGear{
    //@Take
    Proposal sendedProposal;

    @Take
    Proposal receivePromise;

    //@Take
    int promiseCount;

    int maxRecvProposalNumber;

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


    public ReceivePromiseCodeGear(Proposal sendedProposal){
        this(0, sendedProposal, 0);
    }

    public ReceivePromiseCodeGear(int promiseCount, Proposal sendedProposal, int maxRecvProposalNumber){
        this.promiseCount = promiseCount;
        this.sendedProposal = sendedProposal;
        this.maxRecvProposalNumber = maxRecvProposalNumber;
    }


    @Override
    protected void run(CodeGearManager cgm) {
        promiseCount++;

        if(receivePromise.getNumber() > sendedProposal.getNumber()){
            cgm.setup(new SendPrepareRequestCodeGear(sendedProposal));
        }else{
            if(receivePromise.isAccepted()){
                int recvProposalNumber = receivePromise.getNumber();
                if(maxRecvProposalNumber < recvProposalNumber) {
                    maxRecvProposalNumber = recvProposalNumber;
                    sendedProposal.setValue(receivePromise.getValue());
                }
            }
        }

        if(promiseCount > sendedProposal.getAcceptorNum()/2){

            cgm.setup(new SendAcceptRequestCodeGear(sendedProposal));
        }else {
            cgm.setup(new ReceivePromiseCodeGear(promiseCount, sendedProposal, maxRecvProposalNumber));
        }
    }
}