コード例 #1
0
ファイル: test_proposer.py プロジェクト: dgkimura/pypaxos
    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)
コード例 #2
0
ファイル: learner.py プロジェクト: dgkimura/pypaxos
    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]
コード例 #3
0
ファイル: basic.py プロジェクト: dgkimura/pypaxos
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)
コード例 #4
0
ファイル: test_proposer.py プロジェクト: dgkimura/pypaxos
    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)
コード例 #5
0
ファイル: test_proposer.py プロジェクト: dgkimura/pypaxos
 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)
コード例 #6
0
ファイル: protocol.py プロジェクト: dgkimura/pypaxos
 def update(self, name, obj):
     val = "{0}={1}".format(name, repr(self._serialize(obj)))
     self._channel.loopback(Request.create(value=val))
コード例 #7
0
ファイル: protocol.py プロジェクト: dgkimura/pypaxos
 def sync(self, name):
     val = "READ({0})".format(name)
     self._channel.loopback(Request.create(value=val))