class_docstr: Manages a list of grpc connections.
  
  :param logger: the logger to use
  :param compression: The compression algorithm to be used by this GRPCConnectionPool when sending data to GRPC
code: def _send_discover_endpoint(
      self,
      connection_list: _ReplicaList,
      timeout: Optional[float] = None,
      retries: Optional[int] = -1,
  ):
      # this wraps the awaitable object from grpc as a coroutine so it can be used as a task
      # the grpc call function is not a coroutine but some _AioCall
      async def task_coroutine():
          tried_addresses = set()
          if retries is None or retries < 0:
              total_num_tries = (
                  max(
                      DEFAULT_MINIMUM_RETRIES,
                      len(connection_list.get_all_connections()),
                  )
                  + 1
              )
          else:
              total_num_tries = (
                  1 + retries
              )  # try once, then do all the retries
          for i in range(total_num_tries):
              connection = await connection_list.get_next_connection(
                  num_retries=total_num_tries
              )
              tried_addresses.add(connection.address)
              try:
                  return await connection.send_discover_endpoint(
                      timeout=timeout,
                  )
              except AioRpcError as e:
                  error = await self._handle_aiorpcerror(
                      error=e,
                      retry_i=i,
                      tried_addresses=tried_addresses,
                      current_address=connection.address,
                      current_deployment=connection.deployment_name,
                      connection_list=connection_list,
                      total_num_tries=total_num_tries,
                      task_type="EndpointDiscovery",
                  )
                  if error:
                      raise error
              except AttributeError:
                  return default_endpoints_proto, None
  
      return task_coroutine()
  
imports: import asyncio
  from typing import TYPE_CHECKING, Dict, List, Optional, Sequence, Set, Tuple, Union, AsyncGenerator
  import grpc
  from grpc.aio import AioRpcError
  from jina.constants import __default_endpoint__
  from jina.enums import PollingType
  from jina.excepts import InternalNetworkError
  from jina.importer import ImportExtensions
  from jina.logging.logger import JinaLogger
  from jina.proto import jina_pb2
  from jina.serve.helper import format_grpc_error
  from jina.serve.networking.connection_pool_map import _ConnectionPoolMap
  from jina.serve.networking.connection_stub import create_async_channel_stub
  from jina.serve.networking.instrumentation import _NetworkingHistograms, _NetworkingMetrics
  from jina.serve.networking.replica_list import _ReplicaList
  from jina.serve.networking.utils import DEFAULT_MINIMUM_RETRIES
  from jina.types.request import Request
  from jina.types.request.data import SingleDocumentRequest
label_desc: Use image node_id 9 for calling the GrpcConnectionPool obj's underlying member method code with example usage: obj._send_discover_endpoint(connection_list, timeout, retries) and returns: task_coroutine, unknown, default_endpoints_proto,  None