Exemple #1
0
    def test_receive_paxos_message_try(self):
        # try message
        try_msg = PaxosMessage('TRY', 1)
        try_msg.last_committed_block = GENESIS.block_id

        b = Block(1, GENESIS.block_id, ['a'], 1)
        b.depth = 1
        try_msg.new_block = b.block_id

        self.node.respond = MagicMock()
        self.node.blocktree.nodes.update({b.block_id: b})

        self.node.receive_paxos_message(try_msg, 1)
        assert self.node.respond.called
        assert self.node.s_max_block_depth == b.depth
Exemple #2
0
    def start_commit_process(self):
        """Commit `self.current_committable_block`."""
        self.retry_commit_timeout_queued = False

        if self.c_current_committable_block.block_id in self.blocktree.committed_blocks:
            # this block has already been committed
            return

        #  if quick node then start a new instance of paxos
        if self.state == QUICK and not self.c_commit_running:
            logger.debug('start an new instance of paxos')
            self.c_commit_running = True
            self.c_votes = 0
            self.c_request_seq += 1
            self.c_supp_block = None
            self.c_prop_block = None

            # set commit_running to False if after expected time needed for commit process still equals True
            deferLater(self.reactor, 2 * self.expected_rtt + MAX_COMMIT_TIME,
                       self.commit_timeout, self.c_request_seq)

            if not self.c_quick_proposing:
                self.c_new_block = self.c_current_committable_block

                # create try message
                try_msg = PaxosMessage('TRY', self.c_request_seq)
                try_msg.last_committed_block = self.blocktree.committed_block.block_id
                try_msg.new_block = self.c_new_block.block_id
                self.broadcast(try_msg, 'TRY')
                self.receive_paxos_message(try_msg, None)
            else:
                logger.debug('quick proposing')
                # create propose message directly
                propose = PaxosMessage('PROPOSE', self.c_request_seq)
                propose.com_block = self.c_current_committable_block.block_id
                propose.new_block = GENESIS.block_id
                self.broadcast(propose, 'PROPOSE')
                self.receive_paxos_message(propose, None)

        elif self.state == QUICK and self.c_commit_running:
            # try to commit block later
            logger.debug('commit is already running, try to commit later')
            if not self.retry_commit_timeout_queued:
                self.retry_commit_timeout_queued = True
                deferLater(self.reactor,
                           2 * self.expected_rtt + MAX_COMMIT_TIME,
                           self.start_commit_process)
Exemple #3
0
    def test_pam(self):
        """Test receipt of a PaxosMessage.
        """
        self.node.receive_paxos_message = MagicMock()

        txn1 = Transaction(0, 'command1', 1)
        txn2 = Transaction(0, 'command2', 2)
        block = Block(0, 0, [txn1, txn2], 1)

        txn3 = Transaction(0, 'command3', 3)
        block2 = Block(1, 1, [txn1, txn3], 2)

        pam = PaxosMessage('TRY', 2)
        pam.new_block = block.block_id
        pam.last_committed_block = block2.block_id

        s = pam.serialize()
        self.proto.stringReceived(s)

        self.assertTrue(self.node.receive_paxos_message.called)
        obj = self.node.receive_paxos_message.call_args[0][0]
        self.assertEqual(type(obj), PaxosMessage)
        self.assertEqual(obj.new_block, block.block_id)
        self.assertEqual(obj.last_committed_block, block2.block_id)