def test_acceptor_should_not_accept_before_grant(): acceptor = Acceptor(SuggestionId(0, '0'), None) assert acceptor.last_value is None assert acceptor.grant_id is None sug = SuggestionId(0, '0') with pytest.raises(Exception): assert acceptor.should_accept(sug)
async def propose(self, key, value): loop = asyncio.get_running_loop() serial = self.table.wid sug_id = SuggestionId(serial, self.name) proposer = Proposer( self.peers, sug_id, [key, value], ) tasks = [] for peer in self.peers: task = loop.create_task(self.peer_protocols[peer].permission(str(sug_id))) tasks.append(task) for name, result in await asyncio.gather(*tasks): if result: proposer.grant(name) tasks = [] if not proposer.can_propose: raise Exception("Unable to propose value") for peer in self.peers: task = loop.create_task(self.peer_protocols[peer].propose(str(sug_id), [key, value])) tasks.append(task) for name, result in await asyncio.gather(*tasks): if result: proposer.accept(name) if not proposer.value_accepted: raise Exception("Value not accepted") tasks = [] for peer in self.peers: task = loop.create_task(self.peer_protocols[peer].learn([key, value])) tasks.append(task) for name, result in await asyncio.gather(*tasks): log.debug("Learner response %s %r", name, result) return str(sug_id), value
def test_proposer_grant(): config = { 'a': ('127.0.0.1', 55501), 'b': ('127.0.0.1', 55502), 'c': ('127.0.0.1', 55503), } sug_id = SuggestionId(1, 'a') proposer = Proposer(config, sug_id, 'test value') assert proposer.can_propose == False proposer.grant('a') proposer.grant('b') assert proposer.can_propose == True
def test_proposer_accept(): config = { 'a': ('127.0.0.1', 55501), 'b': ('127.0.0.1', 55502), 'c': ('127.0.0.1', 55503), } sug_id = SuggestionId(1, 'a') proposer = Proposer(config, sug_id, 'test value') assert proposer.value_accepted is False proposer.accept('a') proposer.accept('b') assert proposer.value_accepted is True
def test_paxos(): config = { 'a': ('127.0.0.1', 55501), 'b': ('127.0.0.1', 55502), 'c': ('127.0.0.1', 55503), } sug_id = SuggestionId(0, '0') acceptors = {k: Acceptor(sug_id, None) for k in config} sug_id = SuggestionId(1, 'a') value = 'meh' proposer = Proposer( config, sug_id, value, ) learner = Learner() for a in proposer.peers: assert acceptors[a].should_grant(sug_id) acceptors[a].grant(sug_id) for a in proposer.peers: assert acceptors[a].should_accept(sug_id) acceptors[a].accept(sug_id, value) learner.learn(value) assert learner.value == value
def test_acceptor_grant(): acceptor = Acceptor(SuggestionId(0, '0'), None) sug = SuggestionId(0, 'a') acceptor.grant(sug) acceptor.grant_id == sug
def test_acceptor_should_not_accept_after_grant(): acceptor = Acceptor(SuggestionId(0, '0'), None, SuggestionId(0, 'b')) # Grant id is grater than id to be accepted sug = SuggestionId(0, 'a') assert acceptor.should_accept(sug) is False
def test_acceptor_should_accept(): acceptor = Acceptor(SuggestionId(0, '0'), None, SuggestionId(0, 'a')) sug = SuggestionId(0, 'a') assert acceptor.should_accept(sug) is True
def test_acceptor_should_not_grant(): acceptor = Acceptor(SuggestionId(0, '0'), None) sug = SuggestionId(0, '0') assert acceptor.should_grant(sug) is False
def test_suggestion_id_parse(): sug = SuggestionId.parse('1,a') assert sug.uid == 1 assert sug.node == 'a'
def test_suggestion_id_to_str(): assert str(SuggestionId('1', 'a')) == '1,a'