3

我无法在 Linux(Ubuntu 18 Bionic Beaver)上编译以下内容。我已经尝试过 Docker 和 VirtualBox VM,但rustc最终都耗尽了内存。该代码在 macOS 上编译没有问题,直到大约 5 天前才在 Linux 上编译。

use {
    actix_web::{
        get,
        web::{self},
        App, HttpResponse, HttpServer,
    },
    mongodb::{
        options::{ClientOptions, StreamAddress},
        Client, Database,
    },
};

#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    let options = ClientOptions::builder()
        .hosts(vec![StreamAddress {
            hostname: "localhost".into(),
            port: Some(27017),
        }])
        .build();
    let client = Client::with_options(options).unwrap();

    HttpServer::new(move || {
        App::new()
            .data(AppState {
                db: client.database("mydb"),
            })
            .service(hi)
    })
    .bind("localhost:3000")
    .unwrap()
    .run()
    .await;

    Ok(())
}

#[get("/hi")]
async fn hi(state: web::Data<AppState>) -> actix_web::Result<HttpResponse> {
    state.db.collection("mycoll").find(None, None).await;

    HttpResponse::Ok().await
}

struct AppState {
    db: Database,
}

Cargo.toml 中的依赖项:

[dependencies]
actix-rt = "1.1.1"
actix-web = "2.0.0"
mongodb = "1.1.0"

在最后一个成功的 CI 构建和第一个开始失败的 CI 构建之间唯一改变的是向服务器添加一个端点(本质上是现有端点的复制/粘贴),以及时间箱上的一个小版本碰撞(间接依赖)。检查最后一个工作提交并尝试构建它不起作用。

如果我删除awaiton调用,它将在 Linux 上编译,但如果我将该调用(带有)放在非 Actix 中find(),它也会编译。findawaitasync fn

如果我使用syncmongo 的功能,它也可以工作,这并不理想。

降级到 Rust 1.45 允许它编译,所以显然 1.46 版本中的某些东西以某种方式破坏了 actix 或 mongo crate。

因为这段代码在 macOS 上运行,并且上周在 Linux 上运行,所以我假设在这样的 Actix-web 路由处理程序中使用 Mongo 没有根本问题。我错过了什么吗?

4

0 回答 0