def commit_batch(self, three_pc_batch: ThreePcBatch, prev_handler_result=None): # 1. Update node_reg_at_beginning_of_view first (to match the node reg at the end of last view) three_pc_batch_view_no = three_pc_batch.view_no if three_pc_batch.original_view_no is None else three_pc_batch.original_view_no if three_pc_batch_view_no > self._committed_view_no: self.committed_node_reg_at_beginning_of_view[ three_pc_batch_view_no] = list(self.committed_node_reg) self._committed_view_no = three_pc_batch_view_no self._gc_node_reg_at_beginning_of_view( self.committed_node_reg_at_beginning_of_view) self._gc_node_reg_at_beginning_of_view( self.uncommitted_node_reg_at_beginning_of_view) # 2. update committed node reg prev_committed = self.committed_node_reg self.committed_node_reg = self._uncommitted.popleft( ).uncommitted_node_reg # trigger view change if nodes count changed # TODO: create a new message to pass Suspicious events and make ViewChangeTriggerService the only place for # view change triggering if self.internal_bus and len(prev_committed) != len( self.committed_node_reg): self.internal_bus.send( VoteForViewChange(Suspicions.NODE_COUNT_CHANGED, three_pc_batch_view_no + 1)) if prev_committed != self.committed_node_reg: logger.info("Committed node registry: {}".format( self.committed_node_reg)) logger.info( "Current committed node registry for previous views: {}". format( sorted( self.committed_node_reg_at_beginning_of_view.items()))) logger.info( "Current uncommitted node registry for previous views: {}". format( sorted(self.uncommitted_node_reg_at_beginning_of_view. items()))) logger.info("Current active node registry: {}".format( self.active_node_reg)) else: logger.debug("Committed node registry: {}".format( self.committed_node_reg)) logger.debug( "Current committed node registry for previous views: {}". format( sorted( self.committed_node_reg_at_beginning_of_view.items()))) logger.debug( "Current uncommitted node registry for previous views: {}". format( sorted(self.uncommitted_node_reg_at_beginning_of_view. items()))) logger.debug("Current active node registry: {}".format( self.active_node_reg))
def _check_freshness(self): if self._is_state_fresh_enough(): logger.debug( "{} not sending instance change because found state to be fresh enough" .format(self)) return self._bus.send(VoteForViewChange( Suspicions.STATE_SIGS_ARE_NOT_UPDATED))
def do_order_and_vc(pool, random, initial_view_no): # Step 1. Start requests ordering random_interval = random.float(1.0, 2.0) RepeatingTimer(pool.timer, random_interval, partial(order_requests, pool)) # Step 2. Initiate view change process during request's ordering for node in pool.nodes: pool.timer.schedule( random_interval + 1.0, partial(node._internal_bus.send, VoteForViewChange(Suspicions.DEBUG_FORCE_VIEW_CHANGE))) # Step 3. Wait for VC completing pool.timer.wait_for(lambda: all(not node._data.waiting_for_new_view and node._data.view_no > initial_view_no for node in pool.nodes), max_iterations=100000)
def propose_view_change(self, suspicion: Suspicion): self._node.master_replica.internal_bus.send( VoteForViewChange(suspicion))
def _force_view_change(self): self._bus.send(VoteForViewChange(Suspicions.DEBUG_FORCE_VIEW_CHANGE))
def _propose_view_change(self): self._bus.send( VoteForViewChange(suspicion=Suspicions.PRIMARY_DISCONNECTED))
def send_test_instance_change(node): node.master_replica.internal_bus.send(VoteForViewChange(Suspicions.DEBUG_FORCE_VIEW_CHANGE))
def _propose_view_change(self, suspicion: Suspicion): self._bus.send(VoteForViewChange(suspicion))
def node_about_to_be_disconnected(self, nodeName): if self.node.master_primary_name == nodeName: self.node.master_replica.internal_bus.send( VoteForViewChange(Suspicions.PRIMARY_ABOUT_TO_BE_DISCONNECTED))