def spawn_scout(self): assert not self.scout self.ballot_num = Ballot(self.viewid, self.ballot_num.n, self.ballot_num.leader) sct = self.scout = self.scout_cls(self.member, self, self.ballot_num, self.peers) sct.start()
def test_accept_old_ballot(self): proposal = Proposal('cli', 123, 'INC') cmdid = CommanderId(address='CMD', slot=33, proposal=proposal) self.ac.ballot_num = Ballot(10, 10) self.node.fake_message('ACCEPT', commander_id=cmdid, ballot_num=Ballot(5, 5), slot=33, proposal=proposal) self.assertMessage( ['CMD'], 'ACCEPTED', commander_id=cmdid, acceptor='F999', # replies with newer ballot_num ballot_num=Ballot(10, 10)) # and doesn't accept the proposal self.assertState(Ballot(10, 10), {})
def test_accept_new_ballot(self): proposal = Proposal('cli', 123, 'INC') cmdid = CommanderId(address='CMD', slot=33, proposal=proposal) self.ac.ballot_num = Ballot(10, 10) self.node.fake_message('ACCEPT', commander_id=cmdid, ballot_num=Ballot(19, 19), slot=33, proposal=proposal) self.assertMessage( ['CMD'], 'ACCEPTED', commander_id=cmdid, acceptor='F999', # replies with updated ballot_num ballot_num=Ballot(19, 19)) # and state records acceptance of proposal self.assertState(Ballot(19, 19), {(Ballot(19, 19), 33): proposal})
def __init__(self, member, unique_id, commander_cls=Commander, scout_cls=Scout): super(Leader, self).__init__(member) self.ballot_num = Ballot(0, unique_id) self.active = False self.proposals = defaultlist() self.commander_cls = commander_cls self.commanders = {} self.scout_cls = scout_cls self.scout = None self.peers = None
def preempted(self, ballot_num): # ballot_num is None when we are preempted by a view change if ballot_num: self.logger.info("leader preempted by %s" % (ballot_num.leader,)) else: self.logger.info("leader preempted by view change") self.active = False self.ballot_num = Ballot( (ballot_num if ballot_num else self.ballot_num).n + 1, self.ballot_num.leader) # if we're the primary for this view, re-scout immediately if not self.scout and self.is_primary: self.logger.info("re-scouting as the primary for this view") self.spawn_scout()
def test_prepare_new_ballot(self): proposal = Proposal('cli', 123, 'INC') self.ac.accepted = {(Ballot(19, 19), 33): proposal} self.ac.ballot_num = Ballot(10, 10) self.node.fake_message( 'PREPARE', scout_id=ScoutId(address='SC', ballot_num=Ballot(19, 19)), # newer than the acceptor's ballot_num ballot_num=Ballot(19, 19)) self.assertMessage( ['SC'], 'PROMISE', scout_id=ScoutId(address='SC', ballot_num=Ballot(19, 19)), acceptor='F999', # replies with updated ballot_num ballot_num=Ballot(19, 19), # including accepted ballots accepted={(Ballot(19, 19), 33): proposal}) self.assertState(Ballot(19, 19), {(Ballot(19, 19), 33): proposal})
def test_prepare_old_ballot(self): self.ac.ballot_num = Ballot(10, 10) self.node.fake_message( 'PREPARE', scout_id=ScoutId(address='SC', ballot_num=Ballot(5, 10)), # older than the acceptor's ballot_num ballot_num=Ballot(5, 10)) self.assertMessage( ['SC'], 'PROMISE', scout_id=ScoutId(address='SC', ballot_num=Ballot(5, 10)), acceptor='F999', # replies with newer ballot_num ballot_num=Ballot(10, 10), accepted={}) self.assertState(Ballot(10, 10), {})
def __init__(self, member): super(Acceptor, self).__init__(member) self.ballot_num = Ballot(-1, -1, -1) self.accepted = defaultdict() # { (b,s) : p }