diff --git a/ecstore/src/disk/local.rs b/ecstore/src/disk/local.rs index 3daf2637..3e8524aa 100644 --- a/ecstore/src/disk/local.rs +++ b/ecstore/src/disk/local.rs @@ -650,7 +650,7 @@ impl DiskAPI for LocalDisk { let (src_data_path, dst_data_path) = { let mut data_dir = String::new(); if !fi.is_remote() { - data_dir = utils::path::retain_slash(fi.data_dir.to_string().as_str()); + data_dir = utils::path::retain_slash(fi.data_dir.unwrap_or(Uuid::nil()).to_string().as_str()); } if !data_dir.is_empty() { @@ -689,10 +689,9 @@ impl DiskAPI for LocalDisk { let old_data_dir = meta .find_version(fi.version_id) .map(|(_, version)| { - version.get_data_dir().filter(|data_dir| { - warn!("get data dir {}", &data_dir); - meta.shard_data_dir_count(&fi.version_id, data_dir) == 0 - }) + version + .get_data_dir() + .filter(|data_dir| meta.shard_data_dir_count(&fi.version_id, &Some(data_dir.clone())) == 0) }) .unwrap_or_default(); diff --git a/ecstore/src/store.rs b/ecstore/src/store.rs index 315b6986..8fdcc2fb 100644 --- a/ecstore/src/store.rs +++ b/ecstore/src/store.rs @@ -418,7 +418,7 @@ impl StorageAPI for ECStore { if pinfo.object_info.delete_marker && opts.version_id.is_empty() { del_objects[i] = DeletedObject { delete_marker: pinfo.object_info.delete_marker, - delete_marker_version_id: pinfo.object_info.version_id.to_string(), + delete_marker_version_id: pinfo.object_info.version_id.map(|v| v.to_string()), object_name: utils::path::decode_dir_object(&pinfo.object_info.name), delete_marker_mtime: pinfo.object_info.mod_time, ..Default::default() diff --git a/ecstore/src/store_api.rs b/ecstore/src/store_api.rs index 328d3f8f..a330f3e3 100644 --- a/ecstore/src/store_api.rs +++ b/ecstore/src/store_api.rs @@ -10,15 +10,15 @@ pub const ERASURE_ALGORITHM: &str = "rs-vandermonde"; pub const BLOCK_SIZE_V2: usize = 1048576; // 1M // #[derive(Debug, Clone)] -#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone, Default)] pub struct FileInfo { pub name: String, pub volume: String, - pub version_id: Uuid, + pub version_id: Option, pub erasure: ErasureInfo, pub deleted: bool, // DataDir of the file - pub data_dir: Uuid, + pub data_dir: Option, pub mod_time: Option, pub size: usize, pub data: Option>, @@ -27,24 +27,24 @@ pub struct FileInfo { pub is_latest: bool, } -impl Default for FileInfo { - fn default() -> Self { - Self { - version_id: Uuid::nil(), - erasure: Default::default(), - deleted: Default::default(), - data_dir: Uuid::nil(), - mod_time: None, - size: Default::default(), - data: Default::default(), - fresh: Default::default(), - name: Default::default(), - volume: Default::default(), - parts: Default::default(), - is_latest: Default::default(), - } - } -} +// impl Default for FileInfo { +// fn default() -> Self { +// Self { +// version_id: Default::default(), +// erasure: Default::default(), +// deleted: Default::default(), +// data_dir: Default::default(), +// mod_time: None, +// size: Default::default(), +// data: Default::default(), +// fresh: Default::default(), +// name: Default::default(), +// volume: Default::default(), +// parts: Default::default(), +// is_latest: Default::default(), +// } +// } +// } impl FileInfo { pub fn new(object: &str, data_blocks: usize, parity_blocks: usize) -> Self { @@ -418,7 +418,7 @@ pub struct ObjectInfo { pub is_dir: bool, pub parity_blocks: usize, pub data_blocks: usize, - pub version_id: Uuid, + pub version_id: Option, pub delete_marker: bool, pub parts: Vec, pub is_latest: bool, @@ -476,9 +476,9 @@ pub struct ObjectToDelete { #[derive(Debug, Default, Clone)] pub struct DeletedObject { pub delete_marker: bool, - pub delete_marker_version_id: String, + pub delete_marker_version_id: Option, pub object_name: String, - pub version_id: String, + pub version_id: Option, // MTime of DeleteMarker on source that needs to be propagated to replica pub delete_marker_mtime: Option, // to support delete marker replication diff --git a/rustfs/src/storage/ecfs.rs b/rustfs/src/storage/ecfs.rs index 822488aa..ded92dd7 100644 --- a/rustfs/src/storage/ecfs.rs +++ b/rustfs/src/storage/ecfs.rs @@ -102,7 +102,7 @@ impl S3 for FS { #[tracing::instrument(level = "debug", skip(self, req))] async fn delete_objects(&self, req: S3Request) -> S3Result> { - info!("delete_objects args {:?}", req.input); + // info!("delete_objects args {:?}", req.input); let DeleteObjectsInput { bucket, delete, .. } = req.input; @@ -126,9 +126,31 @@ impl S3 for FS { .collect(); let (dobjs, errs) = try_!(self.store.delete_objects(&bucket, objects, ObjectOptions::default()).await); - info!("delete_objects res {:?} {:?}", &dobjs, errs); + // info!("delete_objects res {:?} {:?}", &dobjs, errs); - let output = DeleteObjectsOutput { ..Default::default() }; + let deleted = dobjs + .iter() + .map(|v| DeletedObject { + delete_marker: { + if v.delete_marker { + Some(true) + } else { + None + } + }, + delete_marker_version_id: v.delete_marker_version_id.clone(), + key: Some(v.object_name.clone()), + version_id: v.version_id.clone(), + }) + .collect(); + + // TODO: let errors; + + let output = DeleteObjectsOutput { + deleted: Some(deleted), + // errors, + ..Default::default() + }; Ok(S3Response::new(output)) }