mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-28 16:07:05 +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 (src_data_path, dst_data_path) = {
|
||||||
let mut data_dir = String::new();
|
let mut data_dir = String::new();
|
||||||
if !fi.is_remote() {
|
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() {
|
if !data_dir.is_empty() {
|
||||||
@@ -689,10 +689,9 @@ impl DiskAPI for LocalDisk {
|
|||||||
let old_data_dir = meta
|
let old_data_dir = meta
|
||||||
.find_version(fi.version_id)
|
.find_version(fi.version_id)
|
||||||
.map(|(_, version)| {
|
.map(|(_, version)| {
|
||||||
version.get_data_dir().filter(|data_dir| {
|
version
|
||||||
warn!("get data dir {}", &data_dir);
|
.get_data_dir()
|
||||||
meta.shard_data_dir_count(&fi.version_id, data_dir) == 0
|
.filter(|data_dir| meta.shard_data_dir_count(&fi.version_id, &Some(data_dir.clone())) == 0)
|
||||||
})
|
|
||||||
})
|
})
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
|||||||
@@ -418,7 +418,7 @@ impl StorageAPI for ECStore {
|
|||||||
if pinfo.object_info.delete_marker && opts.version_id.is_empty() {
|
if pinfo.object_info.delete_marker && opts.version_id.is_empty() {
|
||||||
del_objects[i] = DeletedObject {
|
del_objects[i] = DeletedObject {
|
||||||
delete_marker: pinfo.object_info.delete_marker,
|
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),
|
object_name: utils::path::decode_dir_object(&pinfo.object_info.name),
|
||||||
delete_marker_mtime: pinfo.object_info.mod_time,
|
delete_marker_mtime: pinfo.object_info.mod_time,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
|||||||
+24
-24
@@ -10,15 +10,15 @@ pub const ERASURE_ALGORITHM: &str = "rs-vandermonde";
|
|||||||
pub const BLOCK_SIZE_V2: usize = 1048576; // 1M
|
pub const BLOCK_SIZE_V2: usize = 1048576; // 1M
|
||||||
|
|
||||||
// #[derive(Debug, Clone)]
|
// #[derive(Debug, Clone)]
|
||||||
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
|
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone, Default)]
|
||||||
pub struct FileInfo {
|
pub struct FileInfo {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub volume: String,
|
pub volume: String,
|
||||||
pub version_id: Uuid,
|
pub version_id: Option<Uuid>,
|
||||||
pub erasure: ErasureInfo,
|
pub erasure: ErasureInfo,
|
||||||
pub deleted: bool,
|
pub deleted: bool,
|
||||||
// DataDir of the file
|
// DataDir of the file
|
||||||
pub data_dir: Uuid,
|
pub data_dir: Option<Uuid>,
|
||||||
pub mod_time: Option<OffsetDateTime>,
|
pub mod_time: Option<OffsetDateTime>,
|
||||||
pub size: usize,
|
pub size: usize,
|
||||||
pub data: Option<Vec<u8>>,
|
pub data: Option<Vec<u8>>,
|
||||||
@@ -27,24 +27,24 @@ pub struct FileInfo {
|
|||||||
pub is_latest: bool,
|
pub is_latest: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for FileInfo {
|
// impl Default for FileInfo {
|
||||||
fn default() -> Self {
|
// fn default() -> Self {
|
||||||
Self {
|
// Self {
|
||||||
version_id: Uuid::nil(),
|
// version_id: Default::default(),
|
||||||
erasure: Default::default(),
|
// erasure: Default::default(),
|
||||||
deleted: Default::default(),
|
// deleted: Default::default(),
|
||||||
data_dir: Uuid::nil(),
|
// data_dir: Default::default(),
|
||||||
mod_time: None,
|
// mod_time: None,
|
||||||
size: Default::default(),
|
// size: Default::default(),
|
||||||
data: Default::default(),
|
// data: Default::default(),
|
||||||
fresh: Default::default(),
|
// fresh: Default::default(),
|
||||||
name: Default::default(),
|
// name: Default::default(),
|
||||||
volume: Default::default(),
|
// volume: Default::default(),
|
||||||
parts: Default::default(),
|
// parts: Default::default(),
|
||||||
is_latest: Default::default(),
|
// is_latest: Default::default(),
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
impl FileInfo {
|
impl FileInfo {
|
||||||
pub fn new(object: &str, data_blocks: usize, parity_blocks: usize) -> Self {
|
pub fn new(object: &str, data_blocks: usize, parity_blocks: usize) -> Self {
|
||||||
@@ -418,7 +418,7 @@ pub struct ObjectInfo {
|
|||||||
pub is_dir: bool,
|
pub is_dir: bool,
|
||||||
pub parity_blocks: usize,
|
pub parity_blocks: usize,
|
||||||
pub data_blocks: usize,
|
pub data_blocks: usize,
|
||||||
pub version_id: Uuid,
|
pub version_id: Option<Uuid>,
|
||||||
pub delete_marker: bool,
|
pub delete_marker: bool,
|
||||||
pub parts: Vec<ObjectPartInfo>,
|
pub parts: Vec<ObjectPartInfo>,
|
||||||
pub is_latest: bool,
|
pub is_latest: bool,
|
||||||
@@ -476,9 +476,9 @@ pub struct ObjectToDelete {
|
|||||||
#[derive(Debug, Default, Clone)]
|
#[derive(Debug, Default, Clone)]
|
||||||
pub struct DeletedObject {
|
pub struct DeletedObject {
|
||||||
pub delete_marker: bool,
|
pub delete_marker: bool,
|
||||||
pub delete_marker_version_id: String,
|
pub delete_marker_version_id: Option<String>,
|
||||||
pub object_name: 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
|
// MTime of DeleteMarker on source that needs to be propagated to replica
|
||||||
pub delete_marker_mtime: Option<OffsetDateTime>,
|
pub delete_marker_mtime: Option<OffsetDateTime>,
|
||||||
// to support delete marker replication
|
// to support delete marker replication
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ impl S3 for FS {
|
|||||||
|
|
||||||
#[tracing::instrument(level = "debug", skip(self, req))]
|
#[tracing::instrument(level = "debug", skip(self, req))]
|
||||||
async fn delete_objects(&self, req: S3Request<DeleteObjectsInput>) -> S3Result<S3Response<DeleteObjectsOutput>> {
|
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;
|
let DeleteObjectsInput { bucket, delete, .. } = req.input;
|
||||||
|
|
||||||
@@ -126,9 +126,31 @@ impl S3 for FS {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let (dobjs, errs) = try_!(self.store.delete_objects(&bucket, objects, ObjectOptions::default()).await);
|
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))
|
Ok(S3Response::new(output))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user