fix(object-lock): prevent locked version deletes (#4297)

This commit is contained in:
Zhengchao An
2026-07-06 14:05:19 +08:00
committed by GitHub
parent 2585855d23
commit 3e4c15da5d
9 changed files with 132 additions and 11 deletions
+26 -1
View File
@@ -1327,10 +1327,31 @@ impl crate::storage_api_contracts::object::ObjectOperations for SetDisks {
let mut vers_map: HashMap<&String, FileInfoVersions> = HashMap::new();
for (i, dobj) in objects.iter().enumerate() {
if del_errs[i].is_some() {
continue;
}
let explicit_null_version = is_explicit_null_version(dobj.version_id);
let version_id = delete_file_info_version_id(dobj.version_id);
let check_opts = ObjectOptions {
version_id: version_id.map(|version_id| version_id.to_string()),
versioned: ver_cfg.prefix_enabled(dobj.object_name.as_str()),
version_suspended: ver_cfg.suspended(),
object_lock_delete: opts.object_lock_delete.clone(),
no_lock: true,
..Default::default()
};
let (goi, _write_quorum, gerr) = self.get_object_info_and_quorum(bucket, &dobj.object_name, &check_opts).await;
if gerr.is_none()
&& let Err(err) = check_object_lock_delete(bucket, &dobj.object_name, &goi, &check_opts).await
{
del_errs[i] = Some(err);
continue;
}
let mut vr = FileInfo {
name: dobj.object_name.clone(),
version_id: delete_file_info_version_id(dobj.version_id),
version_id,
idx: i,
replication_state_internal: Some(dobj.replication_state()),
..Default::default()
@@ -1531,6 +1552,10 @@ impl crate::storage_api_contracts::object::ObjectOperations for SetDisks {
}
}
if version_found {
check_object_lock_delete(bucket, object, &goi, &opts).await?;
}
let otd = ObjectToDelete {
object_name: object.to_string(),
version_id: opts