void AsyncConnectionPool::resetConnection()

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