mirror of
https://github.com/rustfs/rustfs.git
synced 2026-01-17 01:30:33 +00:00
add: delete_versions Option<uuid>
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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<Uuid>,
|
||||
pub erasure: ErasureInfo,
|
||||
pub deleted: bool,
|
||||
// DataDir of the file
|
||||
pub data_dir: Uuid,
|
||||
pub data_dir: Option<Uuid>,
|
||||
pub mod_time: Option<OffsetDateTime>,
|
||||
pub size: usize,
|
||||
pub data: Option<Vec<u8>>,
|
||||
@@ -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<Uuid>,
|
||||
pub delete_marker: bool,
|
||||
pub parts: Vec<ObjectPartInfo>,
|
||||
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<String>,
|
||||
pub object_name: String,
|
||||
pub version_id: String,
|
||||
pub version_id: Option<String>,
|
||||
// MTime of DeleteMarker on source that needs to be propagated to replica
|
||||
pub delete_marker_mtime: Option<OffsetDateTime>,
|
||||
// to support delete marker replication
|
||||
|
||||
@@ -102,7 +102,7 @@ impl S3 for FS {
|
||||
|
||||
#[tracing::instrument(level = "debug", skip(self, req))]
|
||||
async fn delete_objects(&self, req: S3Request<DeleteObjectsInput>) -> S3Result<S3Response<DeleteObjectsOutput>> {
|
||||
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))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user