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
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
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
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]