Why
The read path is anonymous and unauthenticated, so it is the easiest thing to
make expensive. git_http_max_concurrent, git_http_max_per_client, and the
600 s clone budget bound clones; nothing bounds what a thousand concurrent page
reads cost, and a page render re-reads metadata and runs git for the tree it
shows.
Scope
Using the harness from the sibling issue:
- Clones:
info/refsplusupload-packfor a small and a large repository, at the configuredgit_http_max_concurrentand above it, to see a refusal rather than a queue. - Blob and raw file reads at both ends of
max_blob_bytes, with and without a byte range. - Repository pages: overview, tree, commits, compare, and a change request with a large diff.
- Code search, which runs
git grepper request. - Artifact and LFS downloads, and a hosted site page.
- Record the numbers per route, with the process’s peak RSS and file descriptors for the run.
Acceptance
- Every route above has a measured throughput and latency percentile at a stated concurrency, recorded on the issue.
- Refusals happen at the configured limit: not below it, and not never.
- Anything unbounded becomes its own issue with the measurement attached, and anything misconfigured is fixed in the same change request.
Part of #14. Depends on the load-test harness issue.