Review text is escaped; normalized decisions follow each finding
Finding f1
bug
clear_partials` deletes every file in `incoming` without coordinating with active writers, so a live fetch can lose its temporary path and fail when `BlobWriter::commit` renames it.
The index snapshot is not synchronized with fetch commits; a sweep can see a newly committed but not-yet-linked blob as unreferenced, delete it, and leave the subsequent index entry pointing to a…
The index snapshot is not synchronized with fetch commits; a sweep can see a newly committed but not-yet-linked blob as unreferenced, delete it, and leave the subsequent index entry pointing to a missing blob.
On-demand sweeps bypass the `running` mutex used by periodic sweeps, allowing concurrent sweeps to race while collecting, unlinking blobs, and removing index entries.
The handler performs a potentially huge recursive filesystem walk synchronously on a Tokio worker, which can block cache requests and health probes while sweeping a large store.
forget` runs during dry runs even though selected blobs are not removed, so `?dry_run=true` deletes their index entries and can cause a later sweep to delete those still-present blobs.
When `remove_file` fails, execution still counts the candidate as removed and adds it to `gone`, so the response and metrics report reclaimed bytes while the blob remains and its index entries are…
When `remove_file` fails, execution still counts the candidate as removed and adds it to `gone`, so the response and metrics report reclaimed bytes while the blob remains and its index entries are then deleted.
values()` supplies reclaimed bytes in the slot declared for removed blobs and blobs in the slot declared for bytes, so Prometheus exposes both sweep counters under the wrong names.
tokio::time::interval` fires its first tick immediately, contrary to the stated one-interval delay, so every restart sweeps the cache immediately instead of waiting for `CAIRN_SWEEP_INTERVAL`.