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);
}