@Override
    public RESPONSE call() throws Exception {
      boolean asyncMode = Client.isAsynchronousMode();
      long deadline = System.currentTimeMillis() + TIMEOUT;
      int numRetries = 0;
      long nextBackoffMs = BACKOFF_START;
      try {
        Client.setAsynchronousMode(true);
        boolean sent = false;
        while (!sent) {
          try {
            callInternal();
            sent = true;
          } catch (Exception ex) {
            if (ex instanceof ServiceException && ex.getCause() != null
                    && ex.getCause() instanceof AsyncCallLimitExceededException) {
              numRetries++;
              if (numRetries >= FAST_RETRIES) {
                Thread.sleep(nextBackoffMs);
                if (System.currentTimeMillis() > deadline) {
                  throw new HiveException("Async request timed out in  " + TIMEOUT + " ms.", ex.getCause());
                }
                numRetries = 0;
                nextBackoffMs = nextBackoffMs * 2;
              }
              LOG.trace("Async call limit exceeded", ex);
            } else {
              throw ex;
            }
          }
        }
        responseFuture = ProtobufRpcEngine.getAsyncReturnMessage();
        return null;
      } finally {
        Client.setAsynchronousMode(asyncMode);
      }
    }
Asynchronous request to a node. The request must override {@link #callInternal()}
@param <REQUEST>
@param <RESPONSE>
llap-common/src/java/org/apache/hadoop/hive/llap/AsyncPbRpcProxy.java