void ConnectOperation::timeoutHandler()

in squangle/mysql_client/Operation.cpp [748:793]


void ConnectOperation::timeoutHandler(
    bool isTcpTimeout,
    bool isPoolConnection) {
  auto delta = std::chrono::duration_cast<std::chrono::milliseconds>(
      chrono::steady_clock::now() - start_time_);

  std::string timeoutStage = "N/A";
  if (!isPoolConnection) {
    // mysql_get_connect_stage is a non-standard fb specific to get the
    // current internal stage of the nonblocking connection
    enum connect_stage stage = mysql_get_connect_stage(conn()->mysql());
    timeoutStage = connectStageString(stage);
  }
  // Check for an overloaded EventBase
  auto cbDelayUs = client()->callbackDelayMicrosAvg();
  if (cbDelayUs < kCallbackDelayStallThresholdUs) {
    auto msg = fmt::format(
        "[{}]({}) Connect{} to {}:{} timed out at stage {} (took {} ms). TcpTimeout:{}",
        static_cast<uint16_t>(SquangleErrno::SQ_ERRNO_CONN_TIMEOUT),
        kErrorPrefix,
        isPoolConnection ? "Pool" : "",
        host(),
        port(),
        timeoutStage,
        delta.count(),
        (isTcpTimeout ? 1 : 0));
    setAsyncClientError(CR_SERVER_LOST, msg, "Connect timed out");
  } else {
    auto msg = fmt::format(
        "[{}]({}) Connect{} to {}:{} timed out at stage {} (took {} ms)"
        " ({}). TcpTimeout:{}",
        static_cast<uint16_t>(
            SquangleErrno::SQ_ERRNO_CONN_TIMEOUT_LOOP_STALLED),
        kErrorPrefix,
        isPoolConnection ? "Pool" : "",
        host(),
        port(),
        timeoutStage,
        delta.count(),
        threadOverloadMessage(cbDelayUs),
        (isTcpTimeout ? 1 : 0));
    setAsyncClientError(
        CR_SERVER_LOST, msg, "Connect timed out (loop stalled)");
  }
  attemptFailed(OperationResult::TimedOut);
}