6d520c6756
Status fields (_lastDrainUtc, _lastSuccessUtc, _lastError, _drainState, _evictedCount) were written by the drain timer thread and read by GetStatus() / health-check threads with no memory barrier, risking torn DateTime? reads and stale DrainState observations. - Added _statusLock object; all writes to status fields now happen inside lock(_statusLock) blocks in DrainOnceAsync and DrainTimerCallback. - GetStatus() snapshots all fields atomically under the same lock so the Admin UI / /healthz endpoint always sees a consistent view. - Regression test GetStatus_snapshot_is_consistent_under_concurrent_drain drives status writes and reads from concurrent threads; asserts no throws. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>