From 4da2e391e4cc72a7285233abd16b7f68701958ca Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Fri, 4 Oct 2024 17:02:20 +0200 Subject: [PATCH 1/2] admin/populate: Use `StdRng` instead of `ThreadRng` `ThreadRng` is not `Send` which is required to be able to use it across await-points with `tokio`. --- src/admin/populate.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/admin/populate.rs b/src/admin/populate.rs index fa81b75bd37..509d56b52bb 100644 --- a/src/admin/populate.rs +++ b/src/admin/populate.rs @@ -2,7 +2,8 @@ use crate::{db, schema::version_downloads}; use crate::tasks::spawn_blocking; use diesel::prelude::*; -use rand::{thread_rng, Rng}; +use rand::rngs::StdRng; +use rand::{Rng, SeedableRng}; #[derive(clap::Parser, Debug)] #[command( @@ -27,7 +28,7 @@ fn update(opts: Opts, conn: &mut PgConnection) -> QueryResult<()> { use diesel::dsl::*; for id in opts.version_ids { - let mut rng = thread_rng(); + let mut rng = StdRng::from_entropy(); let mut dls = rng.gen_range(5_000i32..10_000); for day in 0..90 { From 7512308b3b867ab59eb3478895bc3d15ac45c2fd Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Fri, 4 Oct 2024 17:03:06 +0200 Subject: [PATCH 2/2] admin/populate: Convert to async --- src/admin/populate.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/admin/populate.rs b/src/admin/populate.rs index 509d56b52bb..bea2c061383 100644 --- a/src/admin/populate.rs +++ b/src/admin/populate.rs @@ -1,7 +1,8 @@ use crate::{db, schema::version_downloads}; -use crate::tasks::spawn_blocking; use diesel::prelude::*; +use diesel_async::scoped_futures::ScopedFutureExt; +use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl}; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; @@ -16,15 +17,13 @@ pub struct Opts { } pub async fn run(opts: Opts) -> anyhow::Result<()> { - spawn_blocking(move || { - let mut conn = db::oneoff_connection()?; - conn.transaction(|conn| update(opts, conn))?; - Ok(()) - }) - .await + let mut conn = db::oneoff_async_connection().await?; + conn.transaction(|conn| update(opts, conn).scope_boxed()) + .await?; + Ok(()) } -fn update(opts: Opts, conn: &mut PgConnection) -> QueryResult<()> { +async fn update(opts: Opts, conn: &mut AsyncPgConnection) -> QueryResult<()> { use diesel::dsl::*; for id in opts.version_ids { @@ -40,7 +39,8 @@ fn update(opts: Opts, conn: &mut PgConnection) -> QueryResult<()> { version_downloads::downloads.eq(dls), version_downloads::date.eq(date(now - day.days())), )) - .execute(conn)?; + .execute(conn) + .await?; } } Ok(())