diff --git a/rustfs/src/admin/handlers/bucket_meta.rs b/rustfs/src/admin/handlers/bucket_meta.rs
index be7295801..8f48bde20 100644
--- a/rustfs/src/admin/handlers/bucket_meta.rs
+++ b/rustfs/src/admin/handlers/bucket_meta.rs
@@ -1013,6 +1013,66 @@ mod imported_config_apply_tests {
}
}
+ #[test]
+ fn g_d3_005_new_writer_backup_payloads_pass_old_import_validators() {
+ // Captured from the gateway persistence writers at a16e94426b36c6a454dc200a5639c711b590e1eb.
+ // Keep these bytes independent of RustFS's old serializer so rollback drift stays visible.
+ let new_writer_payloads: [(&str, &[u8]); 7] = [
+ (
+ BUCKET_NOTIFICATION_CONFIG,
+ b"",
+ ),
+ (
+ BUCKET_LIFECYCLE_CONFIG,
+ b"30logs/expireEnabled",
+ ),
+ (
+ BUCKET_SSECONFIG,
+ b"AES256",
+ ),
+ (
+ BUCKET_TAGGING_CONFIG,
+ b"teamstorage",
+ ),
+ (
+ OBJECT_LOCK_CONFIG,
+ b"Enabled",
+ ),
+ (
+ BUCKET_VERSIONING_CONFIG,
+ b"Enabled",
+ ),
+ (
+ BUCKET_REPLICATION_CONFIG,
+ b"arn:aws:iam::123456789012:role/replicationDisabledarn:aws:s3:::backup1Enabled",
+ ),
+ ];
+
+ let imported_xml_cases = import_cases()
+ .into_iter()
+ .filter(|case| case.conf_name != BUCKET_TARGETS_FILE)
+ .collect::>();
+ assert_eq!(new_writer_payloads.len(), imported_xml_cases.len());
+ assert!(
+ imported_xml_cases
+ .iter()
+ .all(|case| new_writer_payloads.iter().any(|(name, _)| *name == case.conf_name))
+ );
+
+ let mut metadatas = imported_bucket();
+ for (conf_name, payload) in new_writer_payloads {
+ assert!(
+ apply_imported_bucket_config(&mut metadatas, BUCKET, conf_name, payload.to_vec(), imported_at())
+ .unwrap_or_else(|error| panic!("new-writer {conf_name} must pass the old import validator: {error}"))
+ );
+ let case = imported_xml_cases
+ .iter()
+ .find(|case| case.conf_name == conf_name)
+ .unwrap_or_else(|| panic!("{conf_name} must have an import mapping"));
+ assert_eq!((case.payload)(&metadatas[BUCKET]), payload);
+ }
+ }
+
#[test]
fn a_rejected_payload_leaves_the_field_untouched() {
for case in import_cases() {