Пример #1
0
    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)
Пример #4
0
 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))
Пример #6
0
 def _propose_view_change(self):
     self._bus.send(
         VoteForViewChange(suspicion=Suspicions.PRIMARY_DISCONNECTED))
Пример #7
0
def send_test_instance_change(node):
    node.master_replica.internal_bus.send(VoteForViewChange(Suspicions.DEBUG_FORCE_VIEW_CHANGE))
Пример #8
0
 def _propose_view_change(self, suspicion: Suspicion):
     self._bus.send(VoteForViewChange(suspicion))
Пример #9
0
 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))