Skip to content

End an eviction pass that cannot evict anything - #12

Closed
montehurd wants to merge 1 commit into
mainfrom
bound-eviction-pass
Closed

montehurd wants to merge 1 commit into
mainfrom
bound-eviction-pass

Conversation

@montehurd

Copy link
Copy Markdown
Owner

Fixes git-pkgs#341.

A failed delete leaves the record eligible, so the same batch comes back on the next iteration while the recorded size never drops. Against a backend refusing deletes the pass retries forever, burning CPU and flooding the log. A canceled context makes it faster, since every delete fails at once.

The pass now ends when a batch clears no record, and returns as soon as the context is canceled. Progress counts records rather than bytes, because a cached record can have no size recorded. A pass can therefore end with the cache still above its limit, leaving the failed records for the next pass.

Two disclosures. The zero-size test the issue asks for pins the behaviour but is not load-bearing: its sizeless record shares a batch with a sized one, so a bytes-based rule would still pass it. Separately, the storage interface documents Delete as returning nil for a missing path; the file backend honours that but GCS returns the raw error, so there a record whose bytes are already gone can become a permanently unevictable LRU head. That looks worth its own fix rather than widening this one.

CI here fails on the pre-existing handler test build, which git-pkgs#362 fixes. This same commit stacked on that fix is green across all six jobs: https://github.com/montehurd/proxy/actions/runs/35656065103

A failed delete leaves the record eligible, so the same batch came back
on the next iteration while the recorded size never dropped. Against a
backend refusing deletes the pass retried forever, burning CPU and
flooding the log. A canceled context made it faster: every delete fails
at once, so the loop spun as quickly as the database could answer.

The pass now ends when a batch clears no record, and returns as soon as
the context is canceled. Progress counts records rather than bytes,
because a cached record can have no size recorded. A pass can therefore
end with the cache still above its limit, leaving the records that
failed for the next pass to retry.
@montehurd montehurd closed this Sep 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

LRU eviction loops indefinitely when an artifact cannot be deleted

1 participant