示例#1
0
 def post_batch_applied(self,
                        three_pc_batch: ThreePcBatch,
                        prev_handler_result=None):
     node_reg = list(self.node.nodeReg.keys())
     number_of_inst = getMaxFailures(len(node_reg)) + 1
     view_no = self.node.viewNo if three_pc_batch.original_view_no is None else three_pc_batch.original_view_no
     validators = TxnPoolManager.calc_node_names_ordered_by_rank(
         node_reg, copy.deepcopy(self.node.nodeIds))
     three_pc_batch.primaries = self.node.primaries_selector.select_primaries(
         view_no=view_no,
         instance_count=number_of_inst,
         validators=validators)
     return three_pc_batch.primaries
示例#2
0
    def post_batch_applied(self,
                           three_pc_batch: ThreePcBatch,
                           prev_handler_result=None):
        view_no = self.node.viewNo if three_pc_batch.original_view_no is None else three_pc_batch.original_view_no
        primaries = self.get_primaries(view_no)
        if primaries is None:
            # In case of reordering after view_change
            # we can trust for list of primaries from PrePrepare
            # because this PrePrepare was validated on all the nodes
            primaries = three_pc_batch.primaries
            self.set_primaries(view_no, primaries)

        three_pc_batch.primaries = primaries
        return three_pc_batch.primaries
    def post_batch_applied(self,
                           three_pc_batch: ThreePcBatch,
                           prev_handler_result=None):
        node_txn_count = 0
        last_state = None
        if len(self.node_states) == 0:
            last_state = self.create_node_state_from_current_node()
        else:
            last_state = copy.deepcopy(self.node_states[-1])

        for digest in three_pc_batch.valid_digests:
            if digest not in self.node.requests:
                raise LogicError('Request is absent when it is applying')
            request = self.node.requests[digest].request
            if request.operation.get(TXN_TYPE) == NODE \
                    and request.operation.get(DATA).get(SERVICES) is not None:
                node_txn_count += 1
                node_nym = request.operation.get(TARGET_NYM)
                node_name = request.operation.get(DATA).get(ALIAS)
                curName = last_state.node_ids.get(node_nym)
                if curName is None:
                    last_state.node_ids[node_nym] = node_name
                elif curName != node_name:
                    raise LogicError("Alias inconsistency")

                serv = request.operation.get(DATA).get(SERVICES)
                if VALIDATOR in serv and node_name not in last_state.node_reg:
                    last_state.node_reg.append(node_name)
                elif serv == [] and node_name in last_state.node_reg:
                    last_state.node_reg.remove(node_name)

                count = self.get_required_number_of_instances(
                    len(last_state.node_reg))
                if last_state.number_of_inst != count:
                    last_state.number_of_inst = count
                    new_validators = TxnPoolManager.calc_node_names_ordered_by_rank(
                        last_state.node_reg, last_state.node_ids)
                    last_state.primaries = self.node.primaries_selector.select_primaries(
                        view_no=self.node.viewNo,
                        instance_count=last_state.number_of_inst,
                        validators=new_validators)

        # We will save node state at every pool batch, so we could revert it correctly
        self.node_states.append(last_state)
        three_pc_batch.primaries = last_state.primaries
        return last_state.primaries
示例#4
0
 def post_batch_applied(self,
                        three_pc_batch: ThreePcBatch,
                        prev_handler_result=None):
     view_no = three_pc_batch.original_view_no if three_pc_batch.original_view_no is not None else three_pc_batch.view_no
     three_pc_batch.primaries = self.primaries_selector.select_primaries(
         view_no)