aboutsummaryrefslogtreecommitdiff
path: root/src/api/s3_put.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/s3_put.rs')
-rw-r--r--src/api/s3_put.rs30
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());
}