void AsyncConnectionPool::reuseConnWithChangeUser()

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