add: delete_versions

This commit is contained in:
weisd
2024-08-27 14:12:15 +08:00
parent 939d37822d
commit cfd6e2b32f
4 changed files with 34 additions and 2 deletions
Generated
+1
View File
@@ -1168,6 +1168,7 @@ dependencies = [
"tracing-error",
"tracing-subscriber",
"transform-stream",
"uuid",
]
[[package]]
+4
View File
@@ -292,6 +292,7 @@ impl LocalDisk {
// 没有版本了,删除xl.meta
if fm.versions.is_empty() {
self.delete_file(&volume_dir, &xlpath, true, false).await?;
return Ok(());
}
// 更新xl.meta
@@ -871,6 +872,9 @@ impl DiskAPI for LocalDisk {
_opts: DeleteOptions,
) -> Result<Vec<Option<Error>>> {
let mut errs = Vec::with_capacity(versions.len());
for _ in 0..versions.len() {
errs.push(None);
}
for (i, ver) in versions.iter().enumerate() {
if let Err(e) = self.delete_versions_internal(volume, ver.name.as_str(), &ver.versions).await {
+1 -1
View File
@@ -23,7 +23,7 @@ http.workspace = true
bytes.workspace = true
futures.workspace = true
futures-util.workspace = true
uuid = { version = "1.8.0", features = ["v4", "fast-rng", "serde"] }
ecstore = { path = "../ecstore" }
s3s = "0.10.0"
clap = { version = "4.5.7", features = ["derive"] }
+28 -1
View File
@@ -6,6 +6,7 @@ use ecstore::store_api::HTTPRangeSpec;
use ecstore::store_api::MakeBucketOptions;
use ecstore::store_api::MultipartUploadResult;
use ecstore::store_api::ObjectOptions;
use ecstore::store_api::ObjectToDelete;
use ecstore::store_api::PutObjReader;
use ecstore::store_api::StorageAPI;
use futures::pin_mut;
@@ -20,7 +21,9 @@ use s3s::S3;
use s3s::{S3Request, S3Response};
use std::fmt::Debug;
use std::str::FromStr;
use tracing::info;
use transform_stream::AsyncTryStream;
use uuid::Uuid;
use ecstore::error::Result;
use ecstore::store::ECStore;
@@ -99,7 +102,31 @@ impl S3 for FS {
#[tracing::instrument(level = "debug", skip(self, req))]
async fn delete_objects(&self, req: S3Request<DeleteObjectsInput>) -> S3Result<S3Response<DeleteObjectsOutput>> {
let _input = req.input;
info!("delete_objects args {:?}", req.input);
let DeleteObjectsInput { bucket, delete, .. } = req.input;
let objects: Vec<ObjectToDelete> = delete
.objects
.iter()
.map(|v| {
let version_id = v
.version_id
.as_ref()
.map(|v| match Uuid::parse_str(v) {
Ok(id) => Some(id),
Err(_) => None,
})
.unwrap_or_default();
ObjectToDelete {
object_name: v.key.clone(),
version_id: version_id,
}
})
.collect();
let (dobjs, errs) = try_!(self.store.delete_objects(&bucket, objects, ObjectOptions::default()).await);
info!("delete_objects res {:?} {:?}", &dobjs, errs);
let output = DeleteObjectsOutput { ..Default::default() };
Ok(S3Response::new(output))