Ejemplo n.º 1
0
    def _validate_message_rep(self, msg: object) -> None:
        if msg is None:
            raise IncorrectMessageForHandlingException(
                msg, reason='received null', log_method=self._logger.debug)
        key = (msg.viewNo, msg.ppSeqNo)
        if key not in self.requested_messages:
            raise IncorrectMessageForHandlingException(
                msg,
                reason='Had either not requested this msg or already '
                'received the msg for {}'.format(key),
                log_method=self._logger.debug)
        if self._has_already_ordered(*key):
            raise IncorrectMessageForHandlingException(
                msg,
                reason='already ordered msg ({})'.format(self, key),
                log_method=self._logger.debug)
        # There still might be stashed msg but not checking that
        # it is expensive, also reception of msgs is idempotent
        stashed_data = self.requested_messages[key]
        curr_data = (msg.digest, msg.stateRootHash, msg.txnRootHash) \
            if isinstance(msg, PrePrepare) or isinstance(msg, Prepare) \
            else None
        if stashed_data is None or curr_data == stashed_data:
            return

        raise IncorrectMessageForHandlingException(
            msg,
            reason='{} does not have expected state {}'.format(
                THREE_PC_PREFIX, stashed_data),
            log_method=self._logger.warning)
Ejemplo n.º 2
0
    def extract_message(self, msg: MessageRep, frm: str):
        params = {}

        for field_name, type_name in self.fields.items():
            params[field_name] = msg.params.get(type_name)
        self._logger.debug('{} received requested msg ({}) from {}'.format(self, msg, frm))
        try:
            result = self._create(msg.msg, **params)
            self._validate_message_rep(result)
            return result, frm
        except TypeError:
            raise IncorrectMessageForHandlingException(msg, 'replied message has invalid structure',
                                                       self._logger.warning)
        except MismatchedMessageReplyException:
            raise IncorrectMessageForHandlingException(msg, 'replied message does not satisfy query criteria',
                                                       self._logger.warning)
Ejemplo n.º 3
0
 def _validate_message_rep(self, msg: object):
     super()._validate_message_rep(msg)
     key = (msg.viewNo, msg.ppSeqNo)
     for pp in self._data.preprepared:
         if (pp.view_no, pp.pp_seq_no) == key:
             raise IncorrectMessageForHandlingException(msg,
                                                        reason='already received msg ({})'.format(self, key),
                                                        log_method=self._logger.debug)
Ejemplo n.º 4
0
 def _validate_message_rep(self, msg: NewView) -> None:
     if msg is None:
         raise IncorrectMessageForHandlingException(msg,
                                                    reason='received null',
                                                    log_method=self._logger.debug)
     if self._data.new_view:
         raise IncorrectMessageForHandlingException(msg,
                                                    reason='already received msg ({})'.format(self, msg),
                                                    log_method=self._logger.debug)
     if msg.viewNo not in self.requested_messages:
         raise IncorrectMessageForHandlingException(msg,
                                                    reason='Had either not requested this msg or already '
                                                           'received the msg for view no {}'.format(msg.viewNo),
                                                    log_method=self._logger.debug)
     if msg.viewNo < self._data.view_no:
         raise IncorrectMessageForHandlingException(msg,
                                                    reason='View change for view {} is already '
                                                           'finished'.format(self, msg.viewNo),
                                                    log_method=self._logger.debug)
Ejemplo n.º 5
0
    def _validate_view_change(self, msg: ViewChange, frm: str, params):
        if msg is None:
            raise IncorrectMessageForHandlingException(msg,
                                                       reason='received null',
                                                       log_method=self._logger.debug)

        key = (params["name"], view_change_digest(msg))
        if key not in self.requested_messages:
            raise IncorrectMessageForHandlingException(msg,
                                                       reason='Had either not requested this msg or already '
                                                              'received the msg for {}'.format(key),
                                                       log_method=self._logger.debug)
        self._received_vc.setdefault(key, set())
        self._received_vc[key].add(frm)
        if not self._data.quorums.weak.is_reached(len(self._received_vc[key])) and frm != params["name"]:
            raise IncorrectMessageForHandlingException(msg,
                                                       reason='Count of VIEW_CHANGE messages {} '
                                                              'is not enough for quorum.'.format(msg),
                                                       log_method=self._logger.trace)
Ejemplo n.º 6
0
    def process_message_req(self, msg: MessageReq):
        params = {}

        for field_name, type_name in self.fields.items():
            params[field_name] = msg.params.get(type_name)

        if not self._validate_message_req(**params):
            raise IncorrectMessageForHandlingException(msg, 'cannot serve request',
                                                       self._logger.debug)

        return self._get_reply(params)
def raise_ex():
    raise IncorrectMessageForHandlingException(msg="",
                                               reason="",
                                               log_method=logger.info)