mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-27 16:48:58 +00:00
f73d4121ad
Two defensive gaps left the refresh singleflight vulnerable to a permanent wedge (running=true forever: scheduled refreshes silently stop, admin capacity joiners hang until restart): - spawn_refresh_if_needed's spawned task had no leader guard, unlike refresh_or_join: a panic after the refresh future completes (commit, metrics) killed the task before the reset block. The task now holds the same RAII RefreshLeaderGuard, disarmed only after the state is reset and the result published (S20). - refresh_fn() was evaluated before AssertUnwindSafe wrapping in both paths, so a panic while constructing the future escaped catch_unwind; construction now happens inside the wrapped future. - RefreshLeaderGuard::drop silently skipped the reset when try_lock was contended and no tokio runtime was current; it now falls back to a blocking reset, which is safe precisely because there is no executor to stall in that context (S31). Ref: rustfs/backlog#1021 (S20+S31 from audit rustfs/backlog#1010)