Skip to content

Commit 5c00187

Browse files
authored
Merge pull request #10001 from Turbo87/async-version-metadata
controllers/version: Remove more `spawn_blocking()` fns
2 parents a1c02fd + 80e44a8 commit 5c00187

File tree

4 files changed

+68
-63
lines changed

4 files changed

+68
-63
lines changed

src/controllers/version/metadata.rs

Lines changed: 35 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,10 @@ use axum_extra::json;
1010
use axum_extra::response::ErasedJson;
1111
use crates_io_database::schema::{crates, dependencies};
1212
use crates_io_worker::BackgroundJob;
13-
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
1413
use diesel_async::AsyncPgConnection;
1514
use http::request::Parts;
1615
use http::StatusCode;
1716
use serde::Deserialize;
18-
use tokio::runtime::Handle;
1917

2018
use crate::app::AppState;
2119
use crate::auth::{AuthCheck, Authentication};
@@ -25,9 +23,7 @@ use crate::models::{
2523
};
2624
use crate::rate_limiter::LimitedAction;
2725
use crate::schema::versions;
28-
use crate::tasks::spawn_blocking;
2926
use crate::util::diesel::prelude::*;
30-
use crate::util::diesel::Conn;
3127
use crate::util::errors::{bad_request, custom, version_not_found, AppResult};
3228
use crate::views::{EncodableDependency, EncodableVersion};
3329
use crate::worker::jobs::{SyncToGitIndex, SyncToSparseIndex, UpdateDefaultVersion};
@@ -102,16 +98,11 @@ pub async fn show(
10298

10399
let mut conn = state.db_read().await?;
104100
let (version, krate) = version_and_crate(&mut conn, &crate_name, &version).await?;
105-
spawn_blocking(move || {
106-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
101+
let published_by = version.published_by(&mut conn).await?;
102+
let actions = VersionOwnerAction::by_version(&mut conn, &version).await?;
107103

108-
let published_by = version.published_by(conn)?;
109-
let actions = VersionOwnerAction::by_version(conn, &version)?;
110-
111-
let version = EncodableVersion::from(version, &krate.name, published_by, actions);
112-
Ok(json!({ "version": version }))
113-
})
114-
.await
104+
let version = EncodableVersion::from(version, &krate.name, published_by, actions);
105+
Ok(json!({ "version": version }))
115106
}
116107

117108
/// Handles the `PATCH /crates/:crate/:version` route.
@@ -137,25 +128,21 @@ pub async fn update(
137128
.check_rate_limit(auth.user_id(), LimitedAction::YankUnyank, &mut conn)
138129
.await?;
139130

140-
spawn_blocking(move || {
141-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
142-
143-
perform_version_yank_update(
144-
&state,
145-
conn,
146-
&mut version,
147-
&krate,
148-
&auth,
149-
update_request.version.yanked,
150-
update_request.version.yank_message,
151-
)?;
152-
153-
let published_by = version.published_by(conn)?;
154-
let actions = VersionOwnerAction::by_version(conn, &version)?;
155-
let updated_version = EncodableVersion::from(version, &krate.name, published_by, actions);
156-
Ok(json!({ "version": updated_version }))
157-
})
158-
.await
131+
perform_version_yank_update(
132+
&state,
133+
&mut conn,
134+
&mut version,
135+
&krate,
136+
&auth,
137+
update_request.version.yanked,
138+
update_request.version.yank_message,
139+
)
140+
.await?;
141+
142+
let published_by = version.published_by(&mut conn).await?;
143+
let actions = VersionOwnerAction::by_version(&mut conn, &version).await?;
144+
let updated_version = EncodableVersion::from(version, &krate.name, published_by, actions);
145+
Ok(json!({ "version": updated_version }))
159146
}
160147

161148
fn validate_yank_update(update_data: &VersionUpdate, version: &Version) -> AppResult<()> {
@@ -186,24 +173,24 @@ pub async fn authenticate(
186173
.await
187174
}
188175

189-
pub fn perform_version_yank_update(
176+
pub async fn perform_version_yank_update(
190177
state: &AppState,
191-
conn: &mut impl Conn,
178+
conn: &mut AsyncPgConnection,
192179
version: &mut Version,
193180
krate: &Crate,
194181
auth: &Authentication,
195182
yanked: Option<bool>,
196183
yank_message: Option<String>,
197184
) -> AppResult<()> {
198-
use diesel::RunQueryDsl;
185+
use diesel_async::RunQueryDsl;
199186

200187
let api_token_id = auth.api_token_id();
201188
let user = auth.user();
202-
let owners = krate.owners(conn)?;
189+
let owners = krate.async_owners(conn).await?;
203190

204191
let yanked = yanked.unwrap_or(version.yanked);
205192

206-
if Handle::current().block_on(user.rights(state, &owners))? < Rights::Publish {
193+
if user.rights(state, &owners).await? < Rights::Publish {
207194
if user.is_admin {
208195
let action = if yanked { "yanking" } else { "unyanking" };
209196
warn!(
@@ -230,7 +217,8 @@ pub fn perform_version_yank_update(
230217
versions::yanked.eq(yanked),
231218
versions::yank_message.eq(&yank_message),
232219
))
233-
.execute(conn)?;
220+
.execute(conn)
221+
.await?;
234222

235223
// If no rows were updated, return early
236224
if updated_cnt == 0 {
@@ -252,11 +240,16 @@ pub fn perform_version_yank_update(
252240
.maybe_api_token_id(api_token_id)
253241
.action(action)
254242
.build()
255-
.insert(conn)?;
243+
.async_insert(conn)
244+
.await?;
256245

257-
SyncToGitIndex::new(&krate.name).enqueue(conn)?;
258-
SyncToSparseIndex::new(&krate.name).enqueue(conn)?;
259-
UpdateDefaultVersion::new(krate.id).enqueue(conn)?;
246+
SyncToGitIndex::new(&krate.name).async_enqueue(conn).await?;
247+
SyncToSparseIndex::new(&krate.name)
248+
.async_enqueue(conn)
249+
.await?;
250+
UpdateDefaultVersion::new(krate.id)
251+
.async_enqueue(conn)
252+
.await?;
260253

261254
Ok(())
262255
}

src/controllers/version/yank.rs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@ use super::version_and_crate;
55
use crate::app::AppState;
66
use crate::controllers::helpers::ok_true;
77
use crate::rate_limiter::LimitedAction;
8-
use crate::tasks::spawn_blocking;
98
use crate::util::errors::{version_not_found, AppResult};
109
use axum::extract::Path;
1110
use axum::response::Response;
12-
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
1311
use http::request::Parts;
1412

1513
/// Handles the `DELETE /crates/:crate_id/:version/yank` route.
@@ -62,18 +60,16 @@ async fn modify_yank(
6260
.check_rate_limit(auth.user_id(), LimitedAction::YankUnyank, &mut conn)
6361
.await?;
6462

65-
spawn_blocking(move || {
66-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
67-
perform_version_yank_update(
68-
&state,
69-
conn,
70-
&mut version,
71-
&krate,
72-
&auth,
73-
Some(yanked),
74-
None,
75-
)?;
76-
ok_true()
77-
})
78-
.await
63+
perform_version_yank_update(
64+
&state,
65+
&mut conn,
66+
&mut version,
67+
&krate,
68+
&auth,
69+
Some(yanked),
70+
None,
71+
)
72+
.await?;
73+
74+
ok_true()
7975
}

src/models/action.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,19 @@ impl VersionOwnerAction {
5757
version_owner_actions::table.load(conn)
5858
}
5959

60-
pub fn by_version(conn: &mut impl Conn, version: &Version) -> QueryResult<Vec<(Self, User)>> {
61-
use diesel::RunQueryDsl;
60+
pub async fn by_version(
61+
conn: &mut AsyncPgConnection,
62+
version: &Version,
63+
) -> QueryResult<Vec<(Self, User)>> {
64+
use diesel_async::RunQueryDsl;
6265
use version_owner_actions::dsl::version_id;
6366

6467
version_owner_actions::table
6568
.filter(version_id.eq(version.id))
6669
.inner_join(users::table)
6770
.order(version_owner_actions::dsl::id)
6871
.load(conn)
72+
.await
6973
}
7074

7175
pub fn for_versions(
@@ -114,4 +118,16 @@ impl NewVersionOwnerAction {
114118
.values(self)
115119
.get_result(conn)
116120
}
121+
122+
pub async fn async_insert(
123+
&self,
124+
conn: &mut AsyncPgConnection,
125+
) -> QueryResult<VersionOwnerAction> {
126+
use diesel_async::RunQueryDsl;
127+
128+
diesel::insert_into(version_owner_actions::table)
129+
.values(self)
130+
.get_result(conn)
131+
.await
132+
}
117133
}

src/models/version.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ impl Version {
5555

5656
/// Gets the User who ran `cargo publish` for this version, if recorded.
5757
/// Not for use when you have a group of versions you need the publishers for.
58-
pub fn published_by(&self, conn: &mut impl Conn) -> QueryResult<Option<User>> {
59-
use diesel::RunQueryDsl;
58+
pub async fn published_by(&self, conn: &mut AsyncPgConnection) -> QueryResult<Option<User>> {
59+
use diesel_async::RunQueryDsl;
6060

6161
match self.published_by {
62-
Some(pb) => users::table.find(pb).first(conn).optional(),
62+
Some(pb) => users::table.find(pb).first(conn).await.optional(),
6363
None => Ok(None),
6464
}
6565
}

0 commit comments

Comments
 (0)