mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-27 15:37:02 +00:00
feat(lifecycle): improve ILM compatibility and scanner runtime config (#2534)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: houseme <4829346+houseme@users.noreply.github.com> Co-authored-by: cxymds <Cxymds@qq.com>
This commit is contained in:
@@ -382,6 +382,11 @@ impl FileMeta {
|
||||
#[tracing::instrument(level = "debug", skip(self))]
|
||||
pub fn delete_version(&mut self, fi: &FileInfo) -> Result<Option<Uuid>> {
|
||||
let vid = Some(fi.version_id.unwrap_or(Uuid::nil()));
|
||||
let target_is_delete_marker = self
|
||||
.versions
|
||||
.iter()
|
||||
.find(|ver| ver.header.version_id == vid)
|
||||
.is_some_and(|ver| ver.header.version_type == VersionType::Delete);
|
||||
|
||||
let mut ventry = FileMetaVersion::default();
|
||||
if fi.deleted {
|
||||
@@ -416,6 +421,10 @@ impl FileMeta {
|
||||
}
|
||||
}
|
||||
|
||||
if target_is_delete_marker && !fi.deleted && !fi.version_purge_status().is_empty() {
|
||||
update_version = false;
|
||||
}
|
||||
|
||||
if fi.deleted {
|
||||
if !fi.delete_marker_replication_status().is_empty()
|
||||
&& let Some(delete_marker) = ventry.delete_marker.as_mut()
|
||||
@@ -1659,6 +1668,45 @@ mod test {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn delete_version_removes_delete_marker_during_version_purge_replication() {
|
||||
let version_id = Uuid::new_v4();
|
||||
let mut fm = FileMeta::new();
|
||||
fm.add_version_filemata(FileMetaVersion {
|
||||
version_type: VersionType::Delete,
|
||||
legacy_object: None,
|
||||
object: None,
|
||||
delete_marker: Some(MetaDeleteMarker {
|
||||
version_id: Some(version_id),
|
||||
mod_time: Some(OffsetDateTime::now_utc()),
|
||||
meta_sys: HashMap::new(),
|
||||
}),
|
||||
write_version: 1,
|
||||
uses_legacy_checksum: false,
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
let fi = FileInfo {
|
||||
deleted: false,
|
||||
mark_deleted: false,
|
||||
version_id: Some(version_id),
|
||||
replication_state_internal: Some(ReplicationState {
|
||||
version_purge_status_internal: Some("target=PENDING;".to_string()),
|
||||
purge_targets: version_purge_statuses_map("target=PENDING;"),
|
||||
..Default::default()
|
||||
}),
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
let result = fm.delete_version(&fi).unwrap();
|
||||
|
||||
assert!(result.is_none());
|
||||
assert!(
|
||||
fm.versions.is_empty(),
|
||||
"delete-marker version purge should remove the local marker instead of rewriting purge metadata onto it"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_data_integrity_validation() {
|
||||
// Test data integrity checks
|
||||
|
||||
Reference in New Issue
Block a user