djc / bb8

Full-featured async (tokio-based) postgres connection pool (like r2d2)
MIT License
753 stars 110 forks source link

Migrate to (std::)futures 0.3 and tokio 0.2 #31

Closed ohmyarch closed 4 years ago

ohmyarch commented 5 years ago

https://github.com/rust-lang/rust/pull/63209#issuecomment-523113079 https://tokio.rs/blog/2019-08-alphas/

ohmyarch commented 5 years ago

https://github.com/sfackler/rust-postgres/tree/std-futures/tokio-postgres

pimeys commented 5 years ago

Could we also change the interface a bit to the direction of how r2d2 works, could it be possible now with std::future, async/await and Pin?

So we could be able to use it in a more synchronous-looking manner:

impl AsyncConnector for MyTestPostgresConnector {
    fn run(&self, query: String) -> FutureObj<'static, crate::Result<serde_json::Value>> {
    let fut = async move {
            let mut client = self.pool.get().await?;
            let stmt = client.prepare(query.as_str()).await?;
            let rows = client.query(&stmt, &[]).collect().await?;

            Ok(rows.into_json()?)
        };

        FutureObj::new(Box::new(fut))
    }
}
githubaccount624 commented 5 years ago

Any updates for this? In my app server grabbing the connection each request adds a lot of overhead. I'd like to use this with Rocket, but currently they're incompatible because async Rocket is already on std::future.

khuey commented 5 years ago

Not really much we can do here until tokio-postgres at least supports these things, since we're heavily dependent on it.

githubaccount624 commented 5 years ago

What is tokio-postgres still missing? I've been using its std-futures branch without any real issues for a couple weeks now.

khuey commented 5 years ago

Maybe it's not missing anything in git, I haven't looked in a while. tokio-postgres doesn't really do releases unfortunately so it's hard to know when it's reached usable points.

githubaccount624 commented 5 years ago

Ah okay. Well I can give a bit of an endorsement here I think. I've been using the Rocket futures branch and the tokio-postgres futures branch in my project for the past month or so and haven't run into any issues yet.

I was talking to the Rocket developers just now and they're interested in using bb8 to implement an async connection pool for postgres in Rocket, but were just waiting on this crate to also update to std-futures. What do you think? :D

Unfortunately I have no idea what the effort required is to update from futures 0.1 to 0.3 since I'm still a Rust noob. Is it very hard?

khuey commented 5 years ago

Alright, I'll take a look at where things stand but that's unlikely to happen before Sunday at the earliest.

I don't think futures 0.1->0.3 is going to be that painful.

githubaccount624 commented 5 years ago

What! That's amazing news! Thanks so much!

githubaccount624 commented 5 years ago

Hi @khuey I was wondering if you ever got a chance to check out tokio-postgres's futures branch and if it could work with bb8.

djc commented 5 years ago

I've got an initial attempt in #37 that's most of the way there.

ohmyarch commented 4 years ago

tokio-postgres v0.5.0-alpha.1 which uses std::futures::Future and async/await syntax is out.

ohmyarch commented 4 years ago

async/await syntax stabilized in 1.39.

djc commented 4 years ago

This is done.