diff --git a/docs/backlog/README.md b/docs/backlog/README.md index 99f393e..af92c7e 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -42,6 +42,8 @@ - [Счётчики слияния переживают ротацию логов](nablyudenie-za-sliyaniem-v-bd.md) — единственный след несравнимых наборов — строка WARN в docker-логе с ротацией 3×10 МБ: событие может произойти и не оставить ничего - [Цена слияния на широкой доставке](cena-sliyaniya-na-shirokoj-dostavke.md) — 63 МБ на одной координате держат транзакцию 5.15 с при busy_timeout 5 с — соседние доставки уходят в failed - [Заголовки доставки в архиве рядом с телом](zagolovki-dostavki-v-arhive.md) — Заголовки живут только в базе — потеря базы навсегда ломает вывод слоя при пересборке +- [Предел на размер и число заголовков доставки](predel-na-zagolovki-dostavki.md) — MaxHeaderBytes не задан, в базу заголовки пишутся целиком: дефект спит до деплоя, а просыпается вместе с ним +- [Сверка живой витрины с пересборкой](sverka-vitriny-s-peresborkoj.md) — reindex печатает оба отпечатка, но сравнивать их некому — расхождение с журналом молчит ## низкий - [Устаревание нижнего слоя после экспорта](ustarevanie-nizhnego-sloya.md) — Нижний слой растёт на ~100 тысяч координат в сутки, а после экспорта Apple он избыточен diff --git a/docs/backlog/predel-na-zagolovki-dostavki.md b/docs/backlog/predel-na-zagolovki-dostavki.md new file mode 100644 index 0000000..c3241d4 --- /dev/null +++ b/docs/backlog/predel-na-zagolovki-dostavki.md @@ -0,0 +1,27 @@ +# Предел на размер и число заголовков доставки + +**Приоритет:** средний + +У тела доставки предел есть (`max_body`), у заголовков — нет ни одного: +`MaxHeaderBytes` серверу не задан, а `delivery.headers` пишутся в базу целиком, +сколько бы их ни пришло. В лог они с недавних пор обрезаются, в базу — нет. + +Сегодня отправитель один и он свой, поэтому дефект спит. Просыпается он +**вместе с [деплоем](deploy-rivendell.md)**: у приёма, торчащего наружу, +отправитель перестаёт быть своим по определению. Оценка сверху при доставке раз +в пять минут — сотни мегабайт в сутки в таблице, которую никто не подчищает; а +растёт вместе с ней и стоимость пересборки, которая учёт материализует целиком. + +Чинится дёшево и в двух местах сразу: `MaxHeaderBytes` у `http.Server` и предел +на то, что уходит в колонку. Разумно делать одной правкой с +[управлением токенами](upravlenie-sekretami.md) — оба пункта про одно и то же: +приём перестаёт доверять тому, кто с ним говорит. + +Осторожно: это путь приёма, а доставка, не попавшая в архив, теряется навсегда. +Отказ по превышению обязан наступать **до** записи тела, а не после, и быть +отличим в логе от отказа обстоятельств. + +Готово, когда доставка с заведомо раздутыми заголовками получает внятный отказ, +не оставляя следа в базе, а обычная доставка проходит как раньше. + +Связано: `internal/httpapi`, `internal/ingest`, `docs/architecture.md` → «Приём». diff --git a/docs/backlog/sverka-vitriny-s-peresborkoj.md b/docs/backlog/sverka-vitriny-s-peresborkoj.md new file mode 100644 index 0000000..d7cbb18 --- /dev/null +++ b/docs/backlog/sverka-vitriny-s-peresborkoj.md @@ -0,0 +1,30 @@ +# Сверка живой витрины с пересборкой + +**Приоритет:** средний + +`healthlog reindex` печатает отпечаток собранной витрины и отпечаток рабочей — +то есть данные для сверки уже есть, и **сравнивать их некому**. Расхождение +живого состояния с тем, что даёт проигрывание журнала, сегодня обнаруживается +только тем, что кто-то вручную запустил пересборку и посмотрел на два числа. + +Между тем расхождение — не гипотеза. Известный путь к нему записан блокером +[«Порядок журнала при конкурентных приёмах»](poryadok-zhurnala-na-priyome.md): +доставка, свёрнутая раньше своей предшественницы, уходит в `failed` навсегда, и +живая витрина расходится с пересборкой молча. Пока тот предел не закрыт, сверка +— единственный способ узнать, что он сработал. + +Инвариант «состояние есть свёртка журнала» проверяем ровно этим: пересобрать в +отдельный файл (рабочая база не трогается — это уже так и устроено), сверить +отпечатки, расхождение — событие, которое видно. Прогон не бесплатный +(на квартальном журнале десятки минут), поэтому это регламент, а не фоновая +задача сервиса. + +Развилка при взятии: кто запускает — `cron` на хосте рядом с деплоем или сам +сервис по расписанию. Первое честнее (пересборка уже сейчас команда, а не +режим сервиса), но требует места под второй файл базы. + +Готово, когда расхождение витрины с пересборкой перестаёт зависеть от того, +догадался ли человек посмотреть. + +Связано: `cmd/healthlog/reindex.go`, [наблюдаемость](stats-nablyudaemost.md), +[деплой](deploy-rivendell.md).