From 5ac8e2c69f2edcba002cadbfa3d6cab662aecc6a Mon Sep 17 00:00:00 2001 From: Yoh Deadfall Date: Tue, 8 Jul 2025 23:05:19 +0300 Subject: [PATCH] Use crate's id for deletion from S3, part 1 --- src/bin/crates-admin/delete_crate.rs | 58 +++++++++++++++++----------- src/controllers/krate/delete.rs | 2 +- src/worker/jobs/delete_crate.rs | 8 +++- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/bin/crates-admin/delete_crate.rs b/src/bin/crates-admin/delete_crate.rs index 85aeb123cdd..169404ae087 100644 --- a/src/bin/crates-admin/delete_crate.rs +++ b/src/bin/crates-admin/delete_crate.rs @@ -83,38 +83,50 @@ pub async fn run(opts: Opts) -> anyhow::Result<()> { let available_at = now + chrono::TimeDelta::hours(opts.availability_delay); for name in &crate_names { - if let Some(crate_info) = existing_crates.iter().find(|info| info.name == *name) { - let id = crate_info.id; - - let deleted_crate = NewDeletedCrate::builder(name) - .created_at(&crate_info.created_at) - .deleted_at(&now) - .deleted_by(deleted_by.id) - .maybe_message(opts.message.as_deref()) - .available_at(&available_at) - .build(); - - info!("{name}: Deleting crate from the database…"); - let result = conn - .transaction(|conn| delete_from_database(conn, id, deleted_crate).scope_boxed()) - .await; - - if let Err(error) = result { - warn!(%id, "{name}: Failed to delete crate from the database: {error}"); + let crate_id = + if let Some(crate_info) = existing_crates.iter().find(|info| info.name == *name) { + let id = crate_info.id; + + let deleted_crate = NewDeletedCrate::builder(name) + .created_at(&crate_info.created_at) + .deleted_at(&now) + .deleted_by(deleted_by.id) + .maybe_message(opts.message.as_deref()) + .available_at(&available_at) + .build(); + + info!("{name}: Deleting crate from the database…"); + let result = conn + .transaction(|conn| delete_from_database(conn, id, deleted_crate).scope_boxed()) + .await; + + if let Err(error) = result { + warn!(%id, "{name}: Failed to delete crate from the database: {error}"); + }; + + Some(id) + } else { + info!("{name}: Skipped missing crate"); + + None }; - } else { - info!("{name}: Skipped missing crate"); - }; info!("{name}: Enqueuing background jobs…"); let git_index_job = jobs::SyncToGitIndex::new(name); let sparse_index_job = jobs::SyncToSparseIndex::new(name); - let delete_from_storage_job = jobs::DeleteCrateFromStorage::new(name.into()); + let delete_from_storage_job = async |conn: &mut AsyncPgConnection| { + if let Some(crate_id) = crate_id { + jobs::DeleteCrateFromStorage::new(name.into(), crate_id) + .enqueue(conn) + .await?; + } + Ok(()) + }; if let Err(error) = tokio::try_join!( git_index_job.enqueue(&mut conn), sparse_index_job.enqueue(&mut conn), - delete_from_storage_job.enqueue(&mut conn), + delete_from_storage_job(&mut conn), ) { warn!("{name}: Failed to enqueue background job: {error}"); } diff --git a/src/controllers/krate/delete.rs b/src/controllers/krate/delete.rs index 9beeb0811f1..06c7fd2cc0a 100644 --- a/src/controllers/krate/delete.rs +++ b/src/controllers/krate/delete.rs @@ -134,7 +134,7 @@ pub async fn delete_crate( let git_index_job = jobs::SyncToGitIndex::new(&krate.name); let sparse_index_job = jobs::SyncToSparseIndex::new(&krate.name); - let delete_from_storage_job = jobs::DeleteCrateFromStorage::new(path.name); + let delete_from_storage_job = jobs::DeleteCrateFromStorage::new(path.name, krate.id); tokio::try_join!( git_index_job.enqueue(conn), diff --git a/src/worker/jobs/delete_crate.rs b/src/worker/jobs/delete_crate.rs index 0d907582dbf..b5f19f2ac0d 100644 --- a/src/worker/jobs/delete_crate.rs +++ b/src/worker/jobs/delete_crate.rs @@ -12,11 +12,15 @@ use tracing::info; #[derive(Serialize, Deserialize)] pub struct DeleteCrateFromStorage { name: String, + crate_id: Option, } impl DeleteCrateFromStorage { - pub fn new(name: String) -> Self { - Self { name } + pub fn new(name: String, crate_id: i32) -> Self { + Self { + name, + crate_id: Some(crate_id), + } } }