forked from Deuxfleurs/garage
Update delete code
This commit is contained in:
parent
0a283e4e70
commit
1999c0ae51
1 changed files with 17 additions and 13 deletions
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue