mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
fix(overpass): rotate mirrors on any refusal, and never cache one as data
The proxy lists four mirrors and rotated on 5xx alone, so a 4xx ended the fan-out. Measured against the live services: overpass-api.de and its lz4 alias answer 406 to this proxy's User-Agent, while overpass.kumi.systems and overpass.private.coffee answer 200 to the byte-identical request. Every Overpass-backed feature — road geometry, annotation outlines, place lookup — was failing on an Apache error page with two healthy mirrors untried. The refusal was then cached. The cache guard read `status < 500`, so the error page was written to memory and to disk, and the serve-stale guard used the same threshold and declined to replace it. Boundary-class queries hold a month-long TTL: four of twenty-three cached entries on this machine held that 406, dated days after the mirror had stopped refusing. Both decisions now go through one predicate. A payload is data only when it is a 2xx that is neither rate-limited nor a body-level runtime error, so what may be cached and what may be replaced by a stale entry cannot drift apart again. A refusal every mirror agrees on is still reported with the first mirror's status and body, so a malformed query says what upstream said — after every mirror has had its chance, not instead of it. fetchOverpassPayload takes injectable endpoints and fetch so the rotation is covered without a live mirror; restoring either half of the old behaviour fails the new tests.
This commit is contained in:
1 parent
9dfb5369e8
commit
973b4e147f
4 files changed
+184
-8
No files matched your search
@@ -2006,6 +2006,12 @@ silently demoting every later lookup for the session.
|
||||
- **Track trails**: server accumulates per-MMSI ring buffers (`/api/ais-live/track?mmsi=`, Float32+Uint32, 64 samples, 30s/25m thinning); aircraft backfill proxies `/api/opensky-track` (OAuth, own credit bucket) and `/api/adsblol/trace` (tar1090 readsb, ~24h history, ODbL — credit adsb.lol).
|
||||
- Shared `src/data/pickRegistry.js` stops the two flight layers' click handlers from fighting over the camera.
|
||||
|
||||
### Overpass proxy mirror rotation (September 2026)
|
||||
|
||||
- `/api/overpass` fans out across four public mirrors. `overpassPayloadIsData()` is the single predicate deciding what counts as an answer, and it governs BOTH what enters the cache and when a stale entry may stand in, so the two cannot drift apart. Only a 2xx that is neither rate-limited nor a body-level runtime error is data.
|
||||
- The rotation used to trigger on 5xx alone, so a 4xx ended the fan-out and was returned, cached to memory AND disk, and served to the client as data. Measured against the live mirrors: `overpass-api.de` and `lz4.overpass-api.de` answer **406** to the proxy's `User-Agent` while `overpass.kumi.systems` and `overpass.private.coffee` answer **200** to the byte-identical request — so every Overpass-backed feature failed on an Apache error page with two healthy mirrors untried, and four of twenty-three cached entries on the machine this was found on held that error page. Boundary-class queries carry a month-long TTL, so one refusal outlived its outage by weeks.
|
||||
- A refusal every mirror agrees on is still reported with the first mirror's status and body, so a genuinely malformed query says what upstream said — but only after every mirror has had the chance to answer it. `fetchOverpassPayload` takes injectable endpoints and fetch so the rotation is tested without a live mirror (`src/overpassProxy.test.mjs`).
|
||||
|
||||
### Share-link v2 layer state (August 2026)
|
||||
|
||||
- Generated share links use a deterministic v2 hash. Existing camera, visual,
|
||||
|
||||
Reference in new issue
Block a user