diff options
-rw-r--r-- | src/api/s3_put.rs | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/api/s3_put.rs b/src/api/s3_put.rs index e6130af6..084af916 100644 --- a/src/api/s3_put.rs +++ b/src/api/s3_put.rs @@ -155,26 +155,30 @@ impl BodyChunker { } pub async fn handle_delete(garage: Arc<Garage>, bucket: &str, key: &str) -> Result<UUID, Error> { - let exists = match garage + let object = match garage .object_table .get(&bucket.to_string(), &key.to_string()) .await? { - None => false, - Some(o) => { - let mut has_active_version = false; - for v in o.versions().iter() { - if v.data != ObjectVersionData::DeleteMarker { - has_active_version = true; - break; - } - } - has_active_version + None => { + // No need to delete + return Ok([0u8; 32].into()); } + Some(o) => o, }; - if !exists { - // No need to delete + let interesting_versions = object.versions().iter().filter(|v| { + v.data != ObjectVersionData::DeleteMarker && v.state != ObjectVersionState::Aborted + }); + + let mut must_delete = false; + let mut timestamp = now_msec(); + for v in interesting_versions { + must_delete = true; + timestamp = std::cmp::max(timestamp, v.timestamp + 1); + } + + if !must_delete { return Ok([0u8; 32].into()); } |