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
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)
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)