void AsyncConnectionPool::tryRequestNewConnection()

in squangle/mysql_client/AsyncConnectionPool.cpp [559:614]


void AsyncConnectionPool::tryRequestNewConnection(
    const PoolKey& pool_key,
    std::shared_ptr<db::ConnectionContextBase> context) {
  // Only called internally, this doesn't need to check if it's shutting
  // down
  DCHECK_EQ(std::this_thread::get_id(), mysql_client_->threadId());
  {
    std::unique_lock<std::mutex> lock(shutdown_mutex_);
    if (shutting_down_) {
      return;
    }
  }

  // Checking if limits allow creating more connections
  if (canCreateMoreConnections(pool_key)) {
    VLOG(11) << "Requesting new Connection";
    // get a shared pointer for operation

    auto connOp = mysql_client_->beginConnection(pool_key.connKey);
    connOp->setConnectionOptions(pool_key.connOptions);
    if (!context) {
      context = std::make_shared<db::ConnectionContextBase>();
    }
    connOp->setConnectionContext(std::move(context));
    auto pool_ptr = getSelfWeakPointer();

    // ADRIANA The attribute part we can do later :D time to do it
    connOp->setCallback([pool_key, pool_ptr](ConnectOperation& connOp) {
      auto locked_pool = pool_ptr.lock();
      if (!locked_pool) {
        return;
      }
      if (!connOp.ok()) {
        VLOG(2) << "Failed to create new connection";
        locked_pool->removeOpeningConn(pool_key);
        locked_pool->failedToConnect(pool_key, connOp);
        return;
      }
      auto conn = connOp.releaseConnection();
      auto mysql_conn = conn->stealMysqlConnectionHolder();
      // Now we got a connection from the client, it will become a pooled
      // connection
      auto pooled_conn = std::make_unique<MysqlPooledHolder>(
          std::move(mysql_conn), pool_ptr, pool_key);
      locked_pool->removeOpeningConn(pool_key);
      locked_pool->addConnection(std::move(pooled_conn), true);
    });

    try {
      addOpeningConn(pool_key);
      connOp->run();
    } catch (db::OperationStateException& e) {
      LOG(ERROR) << "Client is drain or dying, cannot ask for more connections";
    }
  }
}