Files
rustfs/crates
overtrue f867f2b665 fix(ecstore): fence bucket heal on decommission-suspended pools
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
2026-08-22 18:43:43 +08:00
..