diff options
author | Alex Auvolat <lx@deuxfleurs.fr> | 2025-02-14 13:03:11 +0100 |
---|---|---|
committer | Alex Auvolat <lx@deuxfleurs.fr> | 2025-02-14 13:11:33 +0100 |
commit | 315169501173c1cf5f78397375fe05ea2ebb77f0 (patch) | |
tree | 777b81f299208afb795b84e9626863b8bbaddd81 /src/model/helper/bucket.rs | |
parent | f034e834fa70f579bfd85745aea533b4328cbce4 (diff) | |
parent | 61f3de649646d098812e6ddb814e20ce7e66ad94 (diff) | |
download | garage-315169501173c1cf5f78397375fe05ea2ebb77f0.tar.gz garage-315169501173c1cf5f78397375fe05ea2ebb77f0.zip |
Merge branch 'next-v2' into 1686a/s3-redirects
Diffstat (limited to 'src/model/helper/bucket.rs')
-rw-r--r-- | src/model/helper/bucket.rs | 73 |
1 files changed, 40 insertions, 33 deletions
diff --git a/src/model/helper/bucket.rs b/src/model/helper/bucket.rs index e5506d7e..fe86c9d9 100644 --- a/src/model/helper/bucket.rs +++ b/src/model/helper/bucket.rs @@ -73,41 +73,48 @@ impl<'a> BucketHelper<'a> { pattern: &String, ) -> Result<Uuid, Error> { if let Some(uuid) = self.resolve_global_bucket_name(pattern).await? { - return Ok(uuid); - } else if pattern.len() >= 2 { - let hexdec = pattern - .get(..pattern.len() & !1) - .and_then(|x| hex::decode(x).ok()); - if let Some(hex) = hexdec { - let mut start = [0u8; 32]; - start - .as_mut_slice() - .get_mut(..hex.len()) - .ok_or_bad_request("invalid length")? - .copy_from_slice(&hex); - let mut candidates = self - .0 - .bucket_table - .get_range( - &EmptyKey, - Some(start.into()), - Some(DeletedFilter::NotDeleted), - 10, - EnumerationOrder::Forward, - ) - .await? - .into_iter() - .collect::<Vec<_>>(); - candidates.retain(|x| hex::encode(x.id).starts_with(pattern)); - if candidates.len() == 1 { - return Ok(candidates.into_iter().next().unwrap().id); - } + Ok(uuid) + } else { + let hexdec = if pattern.len() >= 2 { + pattern + .get(..pattern.len() & !1) + .and_then(|x| hex::decode(x).ok()) + } else { + None + }; + let hex = hexdec.ok_or_else(|| Error::NoSuchBucket(pattern.clone()))?; + + let mut start = [0u8; 32]; + start + .as_mut_slice() + .get_mut(..hex.len()) + .ok_or_bad_request("invalid length")? + .copy_from_slice(&hex); + let mut candidates = self + .0 + .bucket_table + .get_range( + &EmptyKey, + Some(start.into()), + Some(DeletedFilter::NotDeleted), + 10, + EnumerationOrder::Forward, + ) + .await? + .into_iter() + .collect::<Vec<_>>(); + candidates.retain(|x| hex::encode(x.id).starts_with(pattern)); + if candidates.is_empty() { + Err(Error::NoSuchBucket(pattern.clone())) + } else if candidates.len() == 1 { + Ok(candidates.into_iter().next().unwrap().id) + } else { + Err(Error::BadRequest(format!( + "Several matching buckets: {}", + pattern + ))) } } - Err(Error::BadRequest(format!( - "Bucket not found / several matching buckets: {}", - pattern - ))) } /// Returns a Bucket if it is present in bucket table, |