Skip to content

Commit f4a22e5

Browse files
committed
index-watcher: handle deletion requests when the crate is only queued
1 parent 97823e2 commit f4a22e5

File tree

2 files changed

+54
-31
lines changed

2 files changed

+54
-31
lines changed

src/build_queue.rs

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,39 @@ impl AsyncBuildQueue {
245245
.await?
246246
.is_some())
247247
}
248+
249+
async fn remove_crate_from_queue(&self, name: &str) -> Result<()> {
250+
let mut conn = self.db.get_async().await?;
251+
sqlx::query!(
252+
"DELETE
253+
FROM queue
254+
WHERE name = $1
255+
",
256+
name
257+
)
258+
.execute(&mut *conn)
259+
.await?;
260+
261+
Ok(())
262+
}
263+
264+
async fn remove_version_from_queue(&self, name: &str, version: &Version) -> Result<()> {
265+
let mut conn = self.db.get_async().await?;
266+
sqlx::query!(
267+
"DELETE
268+
FROM queue
269+
WHERE
270+
name = $1 AND
271+
version = $2
272+
",
273+
name,
274+
version as _,
275+
)
276+
.execute(&mut *conn)
277+
.await?;
278+
279+
Ok(())
280+
}
248281
}
249282

250283
/// Locking functions.
@@ -331,19 +364,22 @@ impl AsyncBuildQueue {
331364
}
332365

333366
self.queue_crate_invalidation(&mut conn, krate).await;
367+
self.remove_crate_from_queue(krate).await?;
334368
continue;
335369
}
336370

337371
if let Some(release) = change.version_deleted() {
372+
let version: Version = release
373+
.version
374+
.parse()
375+
.context("couldn't parse release version as semver")?;
376+
338377
match delete_version(
339378
&mut conn,
340379
&self.storage,
341380
&self.config,
342381
&release.name,
343-
&release
344-
.version
345-
.parse()
346-
.context("couldn't parse release version as semver")?,
382+
&version,
347383
)
348384
.await
349385
.with_context(|| {
@@ -361,6 +397,8 @@ impl AsyncBuildQueue {
361397

362398
self.queue_crate_invalidation(&mut conn, &release.name)
363399
.await;
400+
self.remove_version_from_queue(&release.name, &version)
401+
.await?;
364402
continue;
365403
}
366404

src/db/delete.rs

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,17 @@ use super::{CrateId, update_latest_version_id};
1515
static LIBRARY_STORAGE_PATHS_TO_DELETE: &[&str] = &["rustdoc", "rustdoc-json", "sources"];
1616
static OTHER_STORAGE_PATHS_TO_DELETE: &[&str] = &["sources"];
1717

18-
#[derive(Debug, thiserror::Error)]
19-
enum CrateDeletionError {
20-
#[error("crate is missing: {0}")]
21-
MissingCrate(String),
22-
}
23-
2418
#[context("error trying to delete crate {name} from database")]
2519
pub async fn delete_crate(
2620
conn: &mut sqlx::PgConnection,
2721
storage: &AsyncStorage,
2822
config: &Config,
2923
name: &str,
3024
) -> Result<()> {
31-
let crate_id = get_id(conn, name).await?;
25+
let Some(crate_id) = get_id(conn, name).await? else {
26+
return Ok(());
27+
};
28+
3229
let is_library = delete_crate_from_database(conn, name, crate_id).await?;
3330
// #899
3431
let paths = if is_library {
@@ -68,7 +65,11 @@ pub async fn delete_version(
6865
name: &str,
6966
version: &Version,
7067
) -> Result<()> {
71-
let is_library = delete_version_from_database(conn, name, version).await?;
68+
let Some(crate_id) = get_id(conn, name).await? else {
69+
return Ok(());
70+
};
71+
72+
let is_library = delete_version_from_database(conn, crate_id, version).await?;
7273
let paths = if is_library {
7374
LIBRARY_STORAGE_PATHS_TO_DELETE
7475
} else {
@@ -105,7 +106,7 @@ pub async fn delete_version(
105106
Ok(())
106107
}
107108

108-
async fn get_id(conn: &mut sqlx::PgConnection, name: &str) -> Result<CrateId> {
109+
async fn get_id(conn: &mut sqlx::PgConnection, name: &str) -> Result<Option<CrateId>> {
109110
Ok(sqlx::query_scalar!(
110111
r#"
111112
SELECT id as "id: CrateId"
@@ -115,8 +116,7 @@ async fn get_id(conn: &mut sqlx::PgConnection, name: &str) -> Result<CrateId> {
115116
name
116117
)
117118
.fetch_optional(&mut *conn)
118-
.await?
119-
.ok_or_else(|| CrateDeletionError::MissingCrate(name.into()))?)
119+
.await?)
120120
}
121121

122122
// metaprogramming!
@@ -131,10 +131,9 @@ const METADATA: &[(&str, &str)] = &[
131131
/// Returns whether this release was a library
132132
async fn delete_version_from_database(
133133
conn: &mut sqlx::PgConnection,
134-
name: &str,
134+
crate_id: CrateId,
135135
version: &Version,
136136
) -> Result<bool> {
137-
let crate_id = get_id(conn, name).await?;
138137
let mut transaction = conn.begin().await?;
139138
for &(table, column) in METADATA {
140139
sqlx::query(
@@ -152,20 +151,6 @@ async fn delete_version_from_database(
152151

153152
update_latest_version_id(&mut transaction, crate_id).await?;
154153

155-
let paths = if is_library {
156-
LIBRARY_STORAGE_PATHS_TO_DELETE
157-
} else {
158-
OTHER_STORAGE_PATHS_TO_DELETE
159-
};
160-
for prefix in paths {
161-
sqlx::query!(
162-
"DELETE FROM files WHERE path LIKE $1;",
163-
format!("{prefix}/{name}/{version}/%"),
164-
)
165-
.execute(&mut *transaction)
166-
.await?;
167-
}
168-
169154
transaction.commit().await?;
170155
Ok(is_library)
171156
}

0 commit comments

Comments
 (0)