in squangle/mysql_client/AsyncConnectionPool.cpp [307:354]
void AsyncConnectionPool::reuseConnWithChangeUser(
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 changeUserOp = Connection::changeUser(
std::move(conn),
poolKey.connKey.user,
poolKey.connKey.password,
poolKey.connKey.db_name);
changeUserOp->setCallback(
[this, rawPoolOp, poolKey, poolPtr = getSelfWeakPointer()](
SpecialOperation& op, OperationResult result) {
rawPoolOp->resetPreOperation();
if (result == OperationResult::Failed) {
openNewConnection(rawPoolOp, poolKey);
return;
}
auto connection = op.releaseConnection();
auto mysqlConn = connection->stealMysqlConnectionHolder(true);
auto newMysqlConn = std::make_unique<MysqlConnectionHolder>(
std::move(mysqlConn), poolKey.getConnectionKey());
auto pooledConn = std::make_unique<MysqlPooledHolder>(
std::move(newMysqlConn), poolPtr, poolKey);
stats()->incrPoolHits();
stats()->incrPoolHitsChangeUser();
pooledConn->setReusable(true);
rawPoolOp->connectionCallback(std::move(pooledConn));
});
// Failing to set pre-operation means rawPoolOp already fails (times out, etc)
// and its pre-operation is already cancelled.
if (!rawPoolOp->setPreOperation(changeUserOp)) {
return;
}
getMysqlClient()->runInThread([changeUserOp = std::move(changeUserOp)]() {
changeUserOp->connection()->client()->addOperation(changeUserOp);
changeUserOp->run();
});
}