protected <V extends Response> TFuture<V> sendRequest(
      Request request, InetAddress host, int port) {
    OutRequest<V> outRequest = new OutRequest<V>(this, request);
    if (host != null) {
      Connection conn = peerManager.findOrNew(new InetSocketAddress(host, port));
      // No retry for direct connections
      outRequest.disableRetry();
      if (!sendOutRequest(outRequest, conn)) {
        outRequest.setFuture();
      }
    } else if (peers.size() == 0) {
      outRequest.setLastError(ErrorType.BadRequest, new TChannelNoPeerAvailable());
      outRequest.setFuture();
    } else {
      sendOutRequest(outRequest);
    }

    return outRequest.getFuture();
  }