Skip to content

Commit 9866e32

Browse files
authored
Merge pull request #9652 from Turbo87/async-index
index: Convert `get_index_data()` fn to async
2 parents 340ba1d + 161c003 commit 9866e32

File tree

2 files changed

+39
-25
lines changed

2 files changed

+39
-25
lines changed

src/index.rs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,33 @@
44
55
use crate::models::{Crate, CrateVersions, Dependency, Version};
66
use crate::schema::{crates, dependencies};
7-
use crate::util::diesel::Conn;
87
use anyhow::Context;
98
use crates_io_index::features::split_features;
109
use diesel::prelude::*;
10+
use diesel_async::{AsyncPgConnection, RunQueryDsl};
1111
use sentry::Level;
1212

1313
#[instrument(skip_all, fields(krate.name = ?name))]
14-
pub fn get_index_data(name: &str, conn: &mut impl Conn) -> anyhow::Result<Option<String>> {
14+
pub async fn get_index_data(
15+
name: &str,
16+
conn: &mut AsyncPgConnection,
17+
) -> anyhow::Result<Option<String>> {
1518
debug!("Looking up crate by name");
16-
let Some(krate): Option<Crate> = Crate::by_exact_name(name).first(conn).optional()? else {
19+
let krate = crates::table
20+
.select(Crate::as_select())
21+
.filter(crates::name.eq(name))
22+
.first::<Crate>(conn)
23+
.await
24+
.optional();
25+
26+
let Some(krate) = krate? else {
1727
return Ok(None);
1828
};
1929

2030
debug!("Gathering remaining index data");
21-
let crates = index_metadata(&krate, conn).context("Failed to gather index metadata")?;
31+
let crates = index_metadata(&krate, conn)
32+
.await
33+
.context("Failed to gather index metadata")?;
2234

2335
// This can sometimes happen when we delete versions upon owner request
2436
// but don't realize that the crate is now left with no versions at all.
@@ -43,11 +55,11 @@ pub fn get_index_data(name: &str, conn: &mut impl Conn) -> anyhow::Result<Option
4355
}
4456

4557
/// Gather all the necessary data to write an index metadata file
46-
pub fn index_metadata(
58+
pub async fn index_metadata(
4759
krate: &Crate,
48-
conn: &mut impl Conn,
60+
conn: &mut AsyncPgConnection,
4961
) -> QueryResult<Vec<crates_io_index::Crate>> {
50-
let mut versions: Vec<Version> = krate.all_versions().load(conn)?;
62+
let mut versions: Vec<Version> = krate.all_versions().load(conn).await?;
5163

5264
// We sort by `created_at` by default, but since tests run within a
5365
// single database transaction the versions will all have the same
@@ -57,7 +69,8 @@ pub fn index_metadata(
5769
let deps: Vec<(Dependency, String)> = Dependency::belonging_to(&versions)
5870
.inner_join(crates::table)
5971
.select((dependencies::all_columns, crates::name))
60-
.load(conn)?;
72+
.load(conn)
73+
.await?;
6174

6275
let deps = deps.grouped_by(&versions);
6376

@@ -127,12 +140,14 @@ mod tests {
127140
use crate::tests::builders::{CrateBuilder, VersionBuilder};
128141
use chrono::{Days, Utc};
129142
use crates_io_test_db::TestDatabase;
143+
use diesel_async::AsyncConnection;
130144
use insta::assert_json_snapshot;
131145

132-
#[test]
133-
fn test_index_metadata() {
146+
#[tokio::test]
147+
async fn test_index_metadata() {
134148
let test_db = TestDatabase::new();
135149
let mut conn = test_db.connect();
150+
let mut async_conn = AsyncPgConnection::establish(test_db.url()).await.unwrap();
136151

137152
let user_id = diesel::insert_into(users::table)
138153
.values((
@@ -142,7 +157,8 @@ mod tests {
142157
users::gh_access_token.eq("some random token"),
143158
))
144159
.returning(users::id)
145-
.get_result::<i32>(&mut conn)
160+
.get_result::<i32>(&mut async_conn)
161+
.await
146162
.unwrap();
147163

148164
let created_at_1 = Utc::now()
@@ -159,7 +175,7 @@ mod tests {
159175
.version(VersionBuilder::new("0.1.0"))
160176
.expect_build(&mut conn);
161177

162-
let metadata = index_metadata(&fooo, &mut conn).unwrap();
178+
let metadata = index_metadata(&fooo, &mut async_conn).await.unwrap();
163179
assert_json_snapshot!(metadata);
164180

165181
let bar = CrateBuilder::new("bar", user_id)
@@ -177,7 +193,7 @@ mod tests {
177193
.version(VersionBuilder::new("1.0.1").checksum("0123456789abcdef"))
178194
.expect_build(&mut conn);
179195

180-
let metadata = index_metadata(&bar, &mut conn).unwrap();
196+
let metadata = index_metadata(&bar, &mut async_conn).await.unwrap();
181197
assert_json_snapshot!(metadata);
182198
}
183199
}

src/worker/jobs/index/sync.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use crate::worker::Environment;
44
use anyhow::Context;
55
use crates_io_index::Repository;
66
use crates_io_worker::BackgroundJob;
7-
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
87
use std::fs;
98
use std::fs::File;
109
use std::io::{ErrorKind, Write};
@@ -36,12 +35,13 @@ impl BackgroundJob for SyncToGitIndex {
3635
info!("Syncing to git index");
3736

3837
let crate_name = self.krate.clone();
39-
let conn = env.deadpool.get().await?;
40-
spawn_blocking(move || {
41-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
38+
let mut conn = env.deadpool.get().await?;
4239

43-
let new = get_index_data(&crate_name, conn).context("Failed to get index data")?;
40+
let new = get_index_data(&crate_name, &mut conn)
41+
.await
42+
.context("Failed to get index data")?;
4443

44+
spawn_blocking(move || {
4545
let repo = env.lock_index()?;
4646
let dst = repo.index_file(&crate_name);
4747

@@ -102,13 +102,11 @@ impl BackgroundJob for SyncToSparseIndex {
102102
info!("Syncing to sparse index");
103103

104104
let crate_name = self.krate.clone();
105-
let conn = env.deadpool.get().await?;
106-
let content = spawn_blocking(move || {
107-
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
108-
get_index_data(&crate_name, conn)
109-
})
110-
.await
111-
.context("Failed to get index data")?;
105+
let mut conn = env.deadpool.get().await?;
106+
107+
let content = get_index_data(&crate_name, &mut conn)
108+
.await
109+
.context("Failed to get index data")?;
112110

113111
let future = env.storage.sync_index(&self.krate, content);
114112
future.await.context("Failed to sync index data")?;

0 commit comments

Comments
 (0)