mirror of
https://github.com/rustfs/rustfs.git
synced 2026-09-06 12:09:12 +00:00
18670b269b
A delete-marker purge intent that outlived its watch window was journaled without the version ids the targets assigned to the replicated markers. Replay rebuilt the replication state from a blank ObjectInfo, so `delete_marker_purge_version_id` fell back to the source marker id; a generic S3 target that mints its own ids answers that DELETE with 204, the entry was acknowledged and the real marker stayed on the target. - `MrfReplicateEntry` gains `targetDeleteMarkerVersionIDs` (per-ARN map) and `targetDeleteMarkerVersionIDsCorrupt`; both default and are skipped when empty/false, so old journals decode to the pre-existing shape. - `DeletedObjectReplicationInfo::to_mrf_entry` copies both from the source replication state; `reconstructed_heal_delete_info` restores them into the replayed state so the purge addresses the recorded id and a fail-closed refusal stays a refusal after restart. - MRF envelope capability bit `TargetDeleteMarkerVersionIds` (1 << 4) fences the field like `DeleteMarkerMtime`; readers without the bit refuse envelopes that advertise it, current readers accept old ones. (cherry picked from commit ddacaaa185fda7a5f426138ba5b179f986b862d9)