diff --git a/services/blob/src/http/handlers/blob.rs b/services/blob/src/http/handlers/blob.rs --- a/services/blob/src/http/handlers/blob.rs +++ b/services/blob/src/http/handlers/blob.rs @@ -182,6 +182,10 @@ pub struct RemoveHolderPayload { holder: String, blob_hash: String, + /// If true, the blob will be deleted intantly + /// after the last holder is revoked. + #[serde(default)] + instant_delete: bool, } #[instrument(name = "remove_holder", skip(service))] @@ -190,10 +194,16 @@ payload: web::Json, ) -> actix_web::Result { info!("Revoke holder request"); - let RemoveHolderPayload { holder, blob_hash } = payload.into_inner(); + let RemoveHolderPayload { + holder, + blob_hash, + instant_delete, + } = payload.into_inner(); validate_identifier!(holder); validate_identifier!(blob_hash); - service.revoke_holder(blob_hash, holder).await?; + service + .revoke_holder(blob_hash, holder, instant_delete) + .await?; Ok(HttpResponse::NoContent().finish()) } diff --git a/services/blob/src/service.rs b/services/blob/src/service.rs --- a/services/blob/src/service.rs +++ b/services/blob/src/service.rs @@ -192,6 +192,7 @@ &self, blob_hash: impl Into, holder: impl Into, + instant_delete: bool, ) -> BlobServiceResult<()> { let blob_hash: String = blob_hash.into(); let holder: String = holder.into(); @@ -199,7 +200,7 @@ trace!(blob_hash, holder, "Attempting to revoke holder"); self.db.delete_holder_assignment(&blob_hash, holder).await?; - if self.config.instant_delete_orphaned_blobs { + if instant_delete || self.config.instant_delete_orphaned_blobs { trace!("Instant orphan deletion enabled. Looking for holders"); let is_orphan = self .db