private void call(HRegionLocation loc) {
    ClientService.Interface stub;
    try {
      stub = conn.getRegionServerStub(loc.getServerName());
    } catch (IOException e) {
      onError(e,
        () -> "Get async stub to " + loc.getServerName() + " for '" + Bytes.toStringBinary(row)
          + "' in " + loc.getRegion().getEncodedName() + " of " + tableName + " failed",
        err -> conn.getLocator().updateCachedLocationOnError(loc, err));
      return;
    }
    resetCallTimeout();
    addListener(callable.call(controller, loc, stub), (result, error) -> {
      if (error != null) {
        onError(error,
          () -> "Call to " + loc.getServerName() + " for '" + Bytes.toStringBinary(row) + "' in "
            + loc.getRegion().getEncodedName() + " of " + tableName + " failed",
          err -> conn.getLocator().updateCachedLocationOnError(loc, err));
        return;
      }
      future.complete(result);
    });
  }
Retry caller for a single request, such as get, put, delete, etc.
hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncSingleRequestRpcRetryingCaller.java