public void sendAsyncRequest(
      final AsyncRequestContext<?, ?, RequestType, NodeLocation> requestContext,
      final int retryNum,
      final Long timeoutInMs,
      final boolean keepSilent) {
    if (requestContext.getRequestIndices().isEmpty()) {
      return;
    }

    final RequestType requestType = requestContext.getRequestType();
    for (int retry = 0; retry < retryNum; retry++) {
      // Always Reset CountDownLatch first
      requestContext.resetCountDownLatch();

      // Send requests to all targetNodes
      final int finalRetry = retry;
      requestContext
          .getNodeLocationMap()
          .forEach(
              (requestId, nodeLocation) ->
                  sendAsyncRequest(requestContext, requestId, nodeLocation, finalRetry));

      // Wait for this batch of asynchronous RPC requests finish
      try {
        if (timeoutInMs == null) {
          requestContext.getCountDownLatch().await();
        } else {
          if (!requestContext.getCountDownLatch().await(timeoutInMs, TimeUnit.MILLISECONDS)) {
            LOGGER.warn("Timeout during {}. Retry: {}/{}", requestType, retry, retryNum);
          }
        }
      } catch (final InterruptedException e) {
        LOGGER.error("Interrupted during {}. Retry: {}/{}", requestType, retry, retryNum);
        Thread.currentThread().interrupt();
      }

      // Check if there is a Node that fails to execute the request, and retry if there exists
      if (requestContext.getRequestIndices().isEmpty()) {
        return;
      }
    }

    if (!requestContext.getRequestIndices().isEmpty() && !keepSilent) {
      LOGGER.warn(
          "Failed to {} after {} retries, requestIndices: {}",
          requestType,
          retryNum,
          requestContext.getRequestIndices());
    }
  }
Send asynchronous requests to the specified Nodes with default retry num

<p>Notice: The Nodes that failed to receive the requests will be reconnected

@param requestContext <RequestType, ResponseType> which will also contain the result
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/client/request/AsyncRequestManager.java