in squangle/mysql_client/AsyncConnectionPool.cpp [356:395]
void AsyncConnectionPool::resetConnection(
ConnectPoolOperation* rawPoolOp,
const PoolKey& poolKey,
std::unique_ptr<MysqlPooledHolder> mysqlConn) {
auto conn = std::make_unique<AsyncConnection>(
getMysqlClient().get(),
rawPoolOp->getConnectionKey(),
std::move(mysqlConn));
conn->needToCloneConnection_ = false;
auto resetOp = Connection::resetConn(std::move(conn));
resetOp->setCallback(
[this, rawPoolOp, poolKey](SpecialOperation& op, OperationResult result) {
rawPoolOp->resetPreOperation();
if (result == OperationResult::Failed) {
openNewConnection(rawPoolOp, poolKey);
return;
}
auto connection = op.releaseConnection();
auto mysqlConnHolder = connection->stealMysqlConnectionHolder(true);
auto pmysqlConn = mysqlConnHolder.release();
std::unique_ptr<MysqlPooledHolder> mysqlConnection(
static_cast<MysqlPooledHolder*>(pmysqlConn));
stats()->incrPoolHits();
mysqlConnection->setReusable(true);
rawPoolOp->connectionCallback(std::move(mysqlConnection));
});
// Failing to set pre-operation means rawPoolOp already fails
if (!rawPoolOp->setPreOperation(resetOp)) {
return;
}
getMysqlClient()->runInThread([resetOp = std::move(resetOp)]() {
resetOp->connection()->client()->addOperation(resetOp);
resetOp->run();
});
}