示例#1
0
    def _get_peers_list(self):
        """ To collect all peers' name in the same group (group name) from the redis. """
        if not self._peers_info_dict:
            raise PeersMissError(f"Cannot get {self._name}\'s peers.")

        for peer_type in self._peers_info_dict.keys():
            peer_hash_name, peer_number = self._peers_info_dict[peer_type]
            retry_number = 0
            expected_peers_name = []
            while retry_number < self._max_retries:
                if self._redis_connection.hlen(peer_hash_name) >= peer_number:
                    expected_peers_name = self._redis_connection.hkeys(
                        peer_hash_name)
                    expected_peers_name = [
                        peer.decode() for peer in expected_peers_name
                    ]
                    if len(expected_peers_name) > peer_number:
                        expected_peers_name = expected_peers_name[:peer_number]
                    self._logger.debug(
                        f"{self._name} successfully get all {peer_type}\'s name."
                    )
                    break
                else:
                    self._logger.debug(
                        f"{self._name} failed to get {peer_type}\'s name. Retrying in "
                        f"{self._retry_interval * (2**retry_number)} seconds.")
                    time.sleep(self._retry_interval * (2**retry_number))
                    retry_number += 1

            if not expected_peers_name:
                raise InformationUncompletedError(
                    f"{self._name} failure to get enough number of {peer_type} from redis."
                )

            self._onboard_peers_name_dict[peer_type] = expected_peers_name
示例#2
0
    def _get_request_message_number(self, unit_event: str) -> int:
        """To get the number of request messages by the given unit event."""
        component_type, _, number = unit_event.split(":")
        peers_number = len(self._get_peers(component_type))

        if peers_number == 0:
            raise PeersMissError(
                f"There is no target component in peer list! Required peer type {component_type}."
            )

        if number[-1] != "%":
            return int(number) if int(number) <= peers_number else peers_number
        else:
            request_message_number = np.floor(
                int(number[:-1]) * peers_number / 100)
            return int(request_message_number) if int(
                request_message_number) <= peers_number else peers_number
示例#3
0
    def _get_request_message_number(self, unit_event: str) -> int:
        """To get the number of request messages by the given unit event."""
        component_type, _, number = unit_event.split(":")
        peers_number = len(self._peers_name[component_type]) if component_type != "*" else \
            len(list(itertools.chain.from_iterable(self._peers_name.values())))

        if peers_number == 0:
            raise PeersMissError(
                f"There is no target component in peer list! Required peer type {component_type}."
            )

        if number[-1] != "%":
            return int(number) if int(number) <= peers_number else peers_number
        else:
            request_message_number = np.floor(
                int(number[:-1]) * peers_number / 100)
            return int(request_message_number) if int(
                request_message_number) <= peers_number else peers_number
示例#4
0
    def get_peers(self, component_type: str = "*") -> List[str]:
        """Return peers' name list depending on the component type.

        Args:
            component_type (str): The peers' type, if ``*``, return all peers' name in the proxy. Defaults to ``*``.

        Returns:
            List[str]: List of peers' name.
        """
        if component_type == "*":
            return list(
                itertools.chain.from_iterable(
                    self._onboard_peers_name_dict.values()))

        if component_type not in self._onboard_peers_name_dict.keys():
            raise PeersMissError(
                f"{component_type} not in current peers list!")

        return self._onboard_peers_name_dict[component_type]