From 0226561035bc90dbf45b993f755b1eee47c8a790 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Tue, 21 Apr 2020 14:33:12 +0000 Subject: [PATCH] Do not insert deletion marker if there is no object to delete --- src/api_server.rs | 33 +++++++++++++++++++++++++++------ test_delete.sh | 4 ++-- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/api_server.rs b/src/api_server.rs index 6487d5f..4ee28f5 100644 --- a/src/api_server.rs +++ b/src/api_server.rs @@ -90,15 +90,13 @@ async fn handler_inner( .to_string(); let version_uuid = handle_put(garage, &mime_type, &bucket, &key, req.into_body()).await?; - Ok(Response::new(Box::new(BytesBody::from(hex::encode( - version_uuid, - ))))) + let response = format!("{}\n", hex::encode(version_uuid,)); + Ok(Response::new(Box::new(BytesBody::from(response)))) } &Method::DELETE => { let version_uuid = handle_delete(garage, &bucket, &key).await?; - Ok(Response::new(Box::new(BytesBody::from(hex::encode( - version_uuid, - ))))) + let response = format!("{}\n", hex::encode(version_uuid,)); + Ok(Response::new(Box::new(BytesBody::from(response)))) } _ => Err(Error::BadRequest(format!("Invalid method"))), } @@ -250,6 +248,29 @@ impl BodyChunker { } async fn handle_delete(garage: Arc, bucket: &str, key: &str) -> Result { + let exists = 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 + } + }; + + if !exists { + // No need to delete + return Ok([0u8; 32].into()); + } + let version_uuid = gen_uuid(); let mut object = Object { diff --git a/test_delete.sh b/test_delete.sh index 5f92978..21054a0 100755 --- a/test_delete.sh +++ b/test_delete.sh @@ -1,6 +1,6 @@ #!/bin/bash -for FILE in $(find target/debug/deps); do - curl -v localhost:3900/$FILE -X DELETE -H 'Host: garage' +for FILE in $(find target); do + curl localhost:3900/$FILE -X DELETE -H 'Host: garage' done