def test_proposer_uses_one_proposal_at_a_time(self): self.role.receive(Request.create(value="myval_1"), self.channel) self.role.receive(Request.create(value="myval_2"), self.channel) self.role.receive(Request.create(value="myval_3"), self.channel) sent_message = self.channel.broadcast_messages[-1] self.assertEqual(sent_message.proposal.number, 0)
def _(self, message, channel, create_reply=Response.create): """Learn Phase. To learn that a value has been chosen, a learner must find out that a proposal has been accepted by a majority of acceptors. """ LOG.debug("RECEIVED message {0}".format(message)) self.accepted_proposals.setdefault(message.proposal, set()) \ .add(message.sender) minimum_quorum = len(channel.replicas) // 2 + 1 accepted_quorum = len(self.accepted_proposals.get(message.proposal)) if accepted_quorum == minimum_quorum: # Here we reset for the next round. self.state.write(Role.PROPOSED, self.state.read(Role.PROPOSED) \ .next()) self.state.write(Role.VALUE, None) channel.unicast(Request.create(receiver=message.receiver, sender=message.receiver)) self.notification.send(create_reply(proposal=message.proposal)) if accepted_quorum >= minimum_quorum: self._ledger.append(LedgerEntry(number=message.proposal.number, value=message.value)) reply = create_reply(proposal=message.proposal) channel.unicast(reply) if accepted_quorum == len(channel.replicas): del self.accepted_proposals[message.proposal]
def send_requests(channel, host, interval=1): for v in ["a", "b", "c", "d", "e", "f", "g", "z"]: for n in range(1): val = v + str(n) channel.unicast(Request.create(sender=host, receiver=host, value=val)) time.sleep(interval)
def test_proposer_sends_initial_prepare(self): self.role.receive(Request.create(value="myval"), self.channel) sent_message = self.channel.broadcast_messages[-1] self.assertTrue(type(sent_message) is Prepare) self.assertEqual(sent_message.proposal.number, 0)
def test_proposer_doesnt_send_prepare_if_no_value_in_request(self): self.role.receive(Request.create(), self.channel) self.assertEqual(len(self.channel.broadcast_messages), 0)
def update(self, name, obj): val = "{0}={1}".format(name, repr(self._serialize(obj))) self._channel.loopback(Request.create(value=val))
def sync(self, name): val = "READ({0})".format(name) self._channel.loopback(Request.create(value=val))