From 1999c0ae5152917625558c588e71b27f63950f41 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sun, 26 Apr 2020 19:11:19 +0000 Subject: Update delete code --- src/api/s3_put.rs | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'src') 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, bucket: &str, key: &str) -> Result { - 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()); } -- cgit v1.2.3