Skip to content

Commit 2550dee

Browse files
authored
models/version: Convert record_readme_rendering() to async fn (#9871)
... which allows us to remove a `spawn_blocking()` call from the `RenderAndUploadReadme` background job :)
1 parent 40d1afb commit 2550dee

File tree

4 files changed

+28
-17
lines changed

4 files changed

+28
-17
lines changed

src/bin/crates-admin/render_readmes.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ pub async fn run(opts: Opts) -> anyhow::Result<()> {
115115

116116
let mut tasks = Vec::with_capacity(page_size);
117117
for (version, krate_name) in versions {
118-
Version::record_readme_rendering(version.id, &mut conn)
118+
Handle::current()
119+
.block_on(Version::record_readme_rendering(version.id, &mut conn))
119120
.context("Couldn't record rendering time")?;
120121

121122
let client = client.clone();

src/models/version.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::collections::BTreeMap;
33
use bon::Builder;
44
use chrono::NaiveDateTime;
55
use crates_io_index::features::FeaturesMap;
6+
use diesel_async::AsyncPgConnection;
67
use serde::Deserialize;
78

89
use crate::models::{Crate, User};
@@ -35,16 +36,20 @@ pub struct Version {
3536
}
3637

3738
impl Version {
38-
pub fn record_readme_rendering(version_id: i32, conn: &mut impl Conn) -> QueryResult<usize> {
39+
pub async fn record_readme_rendering(
40+
version_id: i32,
41+
conn: &mut AsyncPgConnection,
42+
) -> QueryResult<usize> {
3943
use diesel::dsl::now;
40-
use diesel::RunQueryDsl;
44+
use diesel_async::RunQueryDsl;
4145

4246
diesel::insert_into(readme_renderings::table)
4347
.values(readme_renderings::version_id.eq(version_id))
4448
.on_conflict(readme_renderings::version_id)
4549
.do_update()
4650
.set(readme_renderings::rendered_at.eq(now))
4751
.execute(conn)
52+
.await
4853
}
4954

5055
/// Gets the User who ran `cargo publish` for this version, if recorded.

src/tests/version.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ async fn record_rerendered_readme_time() {
1111
let c = CrateBuilder::new("foo_authors", user.id).expect_build(&mut conn);
1212
let version = VersionBuilder::new("1.0.0").expect_build(c.id, user.id, &mut conn);
1313

14-
Version::record_readme_rendering(version.id, &mut conn).unwrap();
15-
Version::record_readme_rendering(version.id, &mut conn).unwrap();
14+
let mut conn = app.async_db_conn().await;
15+
Version::record_readme_rendering(version.id, &mut conn)
16+
.await
17+
.unwrap();
18+
Version::record_readme_rendering(version.id, &mut conn)
19+
.await
20+
.unwrap();
1621
}

src/worker/jobs/readmes.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ use crate::tasks::spawn_blocking;
55
use crate::worker::Environment;
66
use crates_io_markdown::text_to_html;
77
use crates_io_worker::BackgroundJob;
8-
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
8+
use diesel_async::scoped_futures::ScopedFutureExt;
9+
use diesel_async::AsyncConnection;
910
use std::sync::Arc;
10-
use tokio::runtime::Handle;
1111

1212
#[derive(Clone, Serialize, Deserialize)]
1313
pub struct RenderAndUploadReadme {
@@ -46,6 +46,7 @@ impl BackgroundJob for RenderAndUploadReadme {
4646
async fn run(&self, env: Self::Context) -> anyhow::Result<()> {
4747
use crate::schema::*;
4848
use diesel::prelude::*;
49+
use diesel_async::RunQueryDsl;
4950

5051
info!(version_id = ?self.version_id, "Rendering README");
5152

@@ -64,26 +65,25 @@ impl BackgroundJob for RenderAndUploadReadme {
6465
return Ok(());
6566
}
6667

67-
let conn = env.deadpool.get().await?;
68-
spawn_blocking(move || {
69-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
70-
71-
conn.transaction(|conn| {
72-
Version::record_readme_rendering(job.version_id, conn)?;
68+
let mut conn = env.deadpool.get().await?;
69+
conn.transaction(|conn| {
70+
async move {
71+
Version::record_readme_rendering(job.version_id, conn).await?;
7372
let (crate_name, vers): (String, String) = versions::table
7473
.find(job.version_id)
7574
.inner_join(crates::table)
7675
.select((crates::name, versions::num))
77-
.first(conn)?;
76+
.first(conn)
77+
.await?;
7878

7979
tracing::Span::current().record("krate.name", tracing::field::display(&crate_name));
8080

8181
let bytes = rendered.into();
82-
let future = env.storage.upload_readme(&crate_name, &vers, bytes);
83-
Handle::current().block_on(future)?;
82+
env.storage.upload_readme(&crate_name, &vers, bytes).await?;
8483

8584
Ok(())
86-
})
85+
}
86+
.scope_boxed()
8787
})
8888
.await
8989
}

0 commit comments

Comments
 (0)