Per-device schedule rows are not folding into URL rows (variants/job stuck at 1.06)
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 38/100
- Tipo di issue
- Bug
- Chiarezza
- Da chiarire
- Stato di attività
- Attiva
- Stack tecnologico
- javascript
- Ambito
- backend
Direzione di ricerca
Start by inspecting the schedule rows directly or reproducing the behavior locally with Harper; /prerender_admin/schedule cannot distinguish URL-keyed from device-keyed rows. Trace claims through RenderQueue.js and the schedule writers in util/changeProbe.js, resources/Target.js, http_handlers/bot_request.js, and util/invalidationReenqueue.js. Done means identifying whether URL rows are created, what still claims device rows, and whether row shape needs to be exposed in the admin API.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
Since v0.66.0 the schedule is one row per URL, and a claim should hand the renderer one job carrying every device in deviceTypes.default. Old per-device rows convert on their first render, so a corpus should fold within roughly one render cycle.
On a large production corpus it is not folding. Measured over 622,694 renders across 60 workers:
completed (variants) / jobs = 1.06 <- should approach the device count (2)
variantContextsShared = 5.3% of renders
94% of jobs still render a single device, two cycles after the deploy.
It is not a measurement artifact
Both counters were read from source: stats.jobs++ fires once per posted result (Worker.ts, result-post path), stats.completed++ once per variant render attempt. variantsSkipped was 0 for the whole window. The two independent signals agree — variantContextsShared at 5.3% implies the same ~6% multi-variant share as completed/jobs = 1.06.
It is not slow progress
Hourly over a 15-hour window the ratio does not trend:
| hour | variants/job |
|---|---|
| 0-3 | 1.06 - 1.08 |
| 4-8 | 1.13 -> 1.35 -> 1.27 -> 1.33 |
| 9-14 | 1.11 -> 1.04 -> 1.05 |
It starts at 1.06 and ends at 1.05. The bulge in hours 4-8 lines up with that corpus's overnight demand peak, i.e. the multi-variant share rises when scheduled renders dominate and falls back afterwards. Conversion would be monotonic; this is not.
Already ruled out
Every schedule writer files a URL-keyed row for devices in deviceTypes.default:
util/changeProbe.js—writeSchedule(row.url, ...)resources/Target.js—writeSchedule(url, ...)http_handlers/bot_request.js—scheduleKey = config.deviceTypes.default.includes(deviceType) ? cacheUrl : cacheKey, so device-keyed only for a device outside the default setutil/invalidationReenqueue.js— reads rows withgetScheduleRowfirst and only reschedules ones that already exist
So nothing is manufacturing new device-keyed rows, and fold is computed correctly at RenderQueue.js:161 (!perDevice || config.deviceTypes.default.includes(device)) — both default devices qualify.
/prerender_admin/schedule cannot be used to check row shape directly: it normalises the key, so URL-keyed and device-keyed lookups return the same row.
Why it matters
A folded job renders each device back-to-back sharing the browser context and replaying the document — the second variant needs roughly a fifth of the same-origin fetches. Unfolded, that saving is never realised, and on a CPU-bound fleet it translates directly into pod count: the difference between a second variant costing 50% and 100% of the first is ~12 pods vs ~16 for the same corpus.
Suggested next steps
- Determine whether URL-keyed rows are actually being created (a direct table read, or a local Harper reproduction —
/prerender_admin/schedulewill not answer it). - If they are, find what still claims the device rows.
- Consider surfacing row shape in the admin API, since there is currently no way to observe the fold's progress from outside.
🤖 Generated with Claude Code
- Lingua principale
- JavaScript
- Stelle
- 0
- Fork
- 0
- Merge medio
- 8h 11m
- PR unite (30g)
- 73
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di HarperFast/prerender-plugin
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
HarperFast/prerender-plugin#245 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
HarperFast/prerender-plugin#244 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 30/100
HarperFast/prerender-plugin#242 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement performance
Difficoltà 5/5 Più di una settimana Idoneità per principianti 38/100
HarperFast/prerender-plugin#235 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement performance
Difficoltà 5/5 Più di una settimana Idoneità per principianti 38/100
HarperFast/prerender-plugin#233 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di HarperFast/prerender-plugin
Issue simili
-
external-issue to-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
LearningCircuit/local-deep-research#7067 ·
I maintainer di solito rispondono entro 1 giorno
-
automated issue report
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 65/100
lirantal/discoprint#32 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
I maintainer di solito rispondono entro 1 giorno