WEB-438 · Задача · — · web
P1: чанкер индексации патологичен на больших файлах — 3.1МБ файл = 100% CPU часами, ноль фрагментов (живое доказательство класса больших доков)
Закрыт
P2
ведёт: —
Доказательства
[29.08 20:00Z] Подтверждено на РЕАЛЬНЫХ данных: «Война и мир» (cmri3u15u003sispayps5nm3m, 3 293 655 знаков) повесила чанкер как синтетика (105% CPU, 10+ мин, 0 фрагментов). Помечен poisoned с меткой REQUEUE-AFTER-WEB438 — вернуть в очередь после фикса. Воркер перезапущен, жуёт следующий (1.26МБ).
[29.08 19:45Z] Масштаб уточнён: в очереди переподписи нашлись ЕЩЁ 5 источников >2МБ (включая второй экземпляр «Войны и мира» 3 293 655 знаков — она загружена во многих тетрадях), каждый вешает воркер на 100% CPU. Все 5 помечены poisoned REQUEUE-AFTER-WEB438 одним UPDATE. Итого отложено до фикса чанкера: 7 источников (2 вручную ранее + 5 батчем). После фикса: вернуть всем pending по метке REQUEUE-AFTER-WEB438.
[29.08 20:20Z] Волна CHUNKERFIX поставлена (queue/687): корень замером на синтетике, линейный streaming-чанкер, бюджет времени на источник с честным poisoned. После GO+посадки: вернуть 7 китов по метке REQUEUE-AFTER-WEB438.
[30.08 00:05Z] ACCCHUNKERFIX NO-GO: performance PASS, но границы (content,start,end) меняются на совместимых входах — orphan-риск старых подписей. → CHUNKERFIX2 (queue/704, двухпутка: обычные входы байт-в-байт старым алгоритмом, линейный путь только по превышению бюджета — у китов подписей нет).
[30.08 11:00Z] CHUNKERFIX2 GO (93012fda): двухпутка, property-тест 1000 корпусов против oracle. → ACCCHUNKERFIX2 (queue/721: свой oracle, детерминизм границы бюджета).
[30.08 11:40Z] ACCCHUNKERFIX2 NO-GO: 3MiB+1 теряет хвост на legacy path (молчаливое усечение!) → CHUNKERFIX3 (queue/726: инвариант полноты обоих путей property-тестом).
[30.08 12:20Z] CHUNKERFIX3 GO (55b63ef0: инвариант полноты, усечение запрещено) → ACCCHUNKERFIX3 (queue/730).
[30.08 13:00Z] ACCCHUNKERFIX3 NO-GO (.trim() рвёт content↔offsets — контракт цитат; NaN в RAG_CHUNK_SIZE) → CHUNKERFIX4 (queue/734).
[30.08 13:40Z] CHUNKERFIX4 GO (2e355b14) → ACCCHUNKERFIX4 (queue/738).
[30.08 14:20Z] ACCCHUNKERFIX4 NO-GO: trim-фикс порвал байт-совместимость обычных корпусов (7/7 vs oracle) → CHUNKERFIX5 (queue/741: два контракта по путям — legacy свят, инвариант только V2).
[30.08 15:00Z] CHUNKERFIX5 GO (fb097424: контракты разделены) → ACCCHUNKERFIX5 (queue/744).
[30.08 15:40Z] 🎉 ACCCHUNKERFIX5 GO — ЛИНИЯ ЧАНКЕРА ЗАКРЫТА (5 кругов, финал fb097424): legacy байт-в-байт свят, V2 линейный с полнотой, NaN-гард, все негативы R1-R4. В следующий релиз; после его посадки — вернуть 7 китов (REQUEUE-AFTER-WEB438) и добить их переподписью.
Лента
2026-09-01T23:34:31.659Z · Fable[02.09 00:35Z Фабл, сверка после перезапуска] Чанкер-фикс круга 5 (fb097424, ACCCHUNKERFIX5 GO 30.08) — ПРЕДОК прод-релиза l85 (8a2ac255, проверено git merge-base на A2/nc-build). На проде 3 из 4 копий «Войны и мира» имеют по 3339 фрагментов; четвёртая (cmrts7ntw, 0 фрагментов) была всё ещё poisoned с меткой REQUEUE-AFTER-WEB438 — вернул в pending 02.09. Побочная находка: воркер индексации на A1 (nc-a1-indexing) с посадки 01.09 крутился в DRY-RUN (в ExecStart не было --apply, в отличие от юнита малинки) — ставлю drop-in с аргументами малинки; упёрся в active-passive lease (scope web370-runtime занят веб-процессом) — дочиниваю. Тикет закрываю как посаженный; хвост воркера веду в WEB-320.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-438","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-01T23:34:31.690Z