bug
The on-demand sweep route calls `app.sweeper.sweep(dry_run)` directly and never acquires the `running` mutex — only `Sweeper::run()` (sweep.rs:83) locks it — so a manual `POST /v1/admin/cache/sweep`… The on-demand sweep route calls `app.sweeper.sweep(dry_run)` directly and never acquires the `running` mutex — only `Sweeper::run()` (sweep.rs:83) locks it — so a manual `POST /v1/admin/cache/sweep` runs concurrently with the interval sweep, and both decide removals from a shared `remaining` total, deleting up to twice the bytes needed and taking the store far below the ceiling (the exact failure sweep.rs:10-12's "one sweep at a time" comment says the mutex exists to prevent).
services/proxy/src/routes/admin.rs:76
Evidence quote
Not recorded
Suggested fix
Not recorded