Files
4041dee085 refactor(storage): decouple details probe and isolate refresh/lifecycle state (#3338)
* fix(storage): decouple details probe from request context and isolate refresh/lifecycle state

- Run storage capacity probes with context.WithoutCancel bounded by
  storage_details_timeout_seconds (default 15s, clamped to 1..600s) so
  a 1s listing wait or 3s admin wait cancellation no longer aborts the
  shared probe before it can populate the cache; convert driver panics
  to errors and return at the deadline even if a driver ignores ctx.
- Keep at most one active probe per mount until GetDetails actually
  exits, publishing the result and releasing the slot atomically.
  Forced refresh invalidates cached details and joins any in-flight
  probe without spawning duplicate remote requests.
- Track failed probes in private detailsState.failed without polluting
  detailCache with nil: ordinary refreshes skip re-probing failed mounts
  immediately (preventing repeated 1s stalls), while forced refreshes or
  storage lifecycle changes reset the failure state.
- Guard init, update, disable, and delete with per-mount generations and
  changing barriers so stale or retired driver instances cannot publish
  outdated capacity into the cache, without mutating storage status.
- Key details cache entries by full cleaned mount path so balanced
  storages (/a, /a.balance1) do not overwrite each other's capacity.

Closes #1815
Relates to #2633, #2635

Co-Authored-By: Codex <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Gemini <noreply@google.com>

* fix(storage): release details task slot on lifecycle invalidation

---------

Co-authored-by: Vurliy <ulermi@outlook.com>
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Gemini <noreply@google.com>
Co-authored-by: Codex <codex@localhost>
2026-11-06 12:45:27 +08:00
..
2026-01-31 16:52:20 +08:00
2026-10-24 17:34:29 +08:00
2026-10-24 17:34:29 +08:00