mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-23 12:49:04 +00:00
f867f2b665
Bucket-level heal had no decommission-state guard: handle_heal_bucket fanned out volume create/delete/rebuild to every peer regardless of pool state, while handle_heal_object already defers suspended pools. A bucket heal could therefore recreate or delete bucket volumes on a source pool being decommissioned (or already decommissioned), leaving stray directories that interfere with the decommission final sweep. Two fences, mirroring the existing object-heal pattern: - Dispatch: a pool-scoped bucket heal against a suspended pool now returns an explicit blocked error instead of fanning out - SlowDown while the decommission is in progress, InvalidArgument once it has completed. Unscoped heals still dispatch; per-pool protection happens at execution. - Local execution: heal_bucket_local_on_disks resolves the node's live decommission state before touching any volume and skips every disk belonging to a suspended pool. Drives on fenced pools are reported with a skipped-decommission-suspended drive state and the result detail classifies them, so a stale dispatcher assignment cannot bypass the fence and skipped pools are visible in the heal result instead of silently succeeding. No wire-format changes: each node re-checks its own pool metadata at execution time. Object-level heal fencing and the decommission preflight heal (which runs before a pool is marked suspended) are unchanged. Fixes rustfs/backlog#1912