Our own asset fetcher: pipelined HTTP/1.1 client for texture/mesh GETs to the asset CDN #485
Labels
No labels
amd
avatars
bug
builder
cannot-reproduce
crash
epic
feature
from-viewer
gl-removal
known-limitation
monitoring
parity
perf
platform
priority
critical
priority
high
priority
low
priority
medium
provenance
rendering
rt
status
in-progress
status
testing
status
up-next
triage
ui
upstream
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sky_line/Slipstream#485
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #484.
Why: asset downloads are plain HTTP/1.1 GETs to one known CDN (
asset-cdn.glb.agni.lindenlab.com, Akamai: HTTP/1.1 only, no HTTP/2, no usable HTTPS; see #391). They're today's only use of curl's HTTP/1.1 pipelining, which modern curl removed. A purpose-built client lets curl be upgraded freely and gives us control where performance matters.Scope: GET only;
Content-Length-framed (plus chunked if the CDN ever sends it); keep-alive; a fixed pipeline depth per connection; responses matched in order; retry or requeue when a connection drops; timeouts.Gate: start only if the #391 measurement shows pipelining matters. Otherwise plain modern curl within the caps is enough.
Deprioritised: measured on #391, pipelining on vs off is roughly a wash (±8%, within run-order noise) in both a light and a busy region. Plain curl 8 at the current connection counts is enough. Keep this only for scheduling features (cancellation, visible-first priority), at low priority.
Status (2026-10-06): curl 8 + OpenSSL 3 shipped in 1.1.0 Beta 5 to 7 with pipelining removed (8 texture requests in flight over 8 connections, the same setup measured as a wash in #391). A Wireshark pass found no TLS problems; the only real incompatibility (the CDN's bogus Content-Encoding) is handled with raw-body fetches. The Alchemy dev confirms pipelining was the only reason he advised against the curl upgrade.
Decision: keep this ticket parked as the fallback. Watch beta reports and the AssetFetch timeline log (
#AssetFetch, settle time after login) for slower texture/mesh loading. If regressions show up, build our own pipelined HTTP/1.1 asset fetcher here.Design direction (owner, 2026-10-09) + evidence from a high-speed mainland flight
Evidence (1.2.0 Beta 6, flying fast across Zindra, 4096 m draw distance, 25-region ring). About 15–30 s into the flight:
The current guess is server-side abuse protection reacting to the request/connection burst (not confirmed; a Firestorm A/B is pending).
Design: the fetcher should rate-limit itself.
Possible companion (#568): pace how fast new neighbour (child-agent) circuits open while moving very fast, in case that churn is the trigger rather than HTTP.
Done differently, shipped in 1.2.0 Beta 7. This ticket's gate said to build a custom pipelined client only if pipelining mattered; #391 measured it as a wash, and a curl probe confirmed the asset CDN speaks HTTP/1.1 only (no HTTP/2, no usable HTTPS). So instead of a new client, the existing llcorehttp path was fixed and put under our own scheduling:
Measured on a 27-crossing dense flight: new connections ~0/s after warm-up, 0 server errors, RAM peak 11 GB (was 58 GB).