- беклог и план переехали в docs/tasks (38 задач, 11 целей), слаги переименованы с транслита на английские, 85 ссылок поправлены - conventions.md разобран в docs/conventions/, local-research.md — в docs/research/, review-journal.md — в docs/review.md с разделом настройки конвейера; заведены security.md, adr/ и .pm.json - шаг docs.py check добавлен в task gate; поведение в architecture.md помечено девятью маркерами долга, database.md получил настройки с числовым значением
5.4 KiB
5.4 KiB
1. Версия витрины в хранилище
- 1.1 Соединение-щуп:
sql.Conn, взятый по первому запросу версии, поколение (ULID черезinternal/ident), пересоздание с новым поколением только приsql.ErrConnDone— обстоятельства поколение не меняют - 1.2
Store.StateVersion(ctx)—PRAGMA data_versionсо щупа, метка вида<поколение>-<счётчик>;Store.VersionedRead— двойная проба вокруг чтения; щуп закрывается раньше пула вCloseи не воскресает после него - 1.3 Тесты: неизменившаяся база даёт ту же версию; запись из пула её
двигает; переоткрытие базы даёт другую версию; щуп пересоздаётся с новым
поколением; после
Closeверсия отказывает и-walрядом не остаётся; щуп не удерживает читающий снимок
2. Обслуживание WAL
- 2.1
journal_size_limitв DSN рабочего подключения, с причиной в комментарии (пассивный чекпойнт файл не укорачивает) - 2.2
Store.CheckpointWAL(ctx)—PRAGMA wal_checkpoint(PASSIVE), наружу тройка чисел (busy, log, checkpointed) без интерпретации - 2.3 Цикл чекпойнта в
cmd/healthlog: тик в минуту,WARNпри «страниц больше порога и перенесено меньше», отказ не убивает цикл - 2.4 Запуск и дренирование в
serve: горутина ждётся в общем бюджете остановки, отдельного чекпойнта на выходе нет - 2.5 Тесты: чекпойнт переносит страницы в тишине; удерживаемый читатель
даёт
checkpointed < logбез ошибки; порог молчит на малом журнале; цикл выходит по отмене
3. Условный запрос в транспорте
- 3.1 Помощник
httpapi: разборIf-None-Match(список,W/,*), слабое сравнение,304без тела — общий для будущих читающих маршрутов - 3.2 Источник версии передаётся транспорту функцией (как
worker.Notify), проверка токена чтения остаётся раньше условия - 3.3 Тесты помощника на формах заголовка: пусто, список,
W/,*, мусор
4. Каталог отдаёт версию
- 4.1
catalog.Service.Metricsвозвращает снимок вместе с версией: проба до, сборка, проба после; расхождение — версии нет - 4.2
handleMetrics:ETagиз версии,304поIf-None-Matchбез открытия снимка, ответ безETagпри расхождении проб - 4.3 Тесты: два ответа подряд — одна метка и одинаковые байты; после
свёртки метка другая;
304не открывает снимок;401раньше304
5. Приёмочные критерии (рубрика ревью дизайна)
- 5.1 Равная метка ⟹ побайтово равный ответ (кроме горизонта — назван в дизайне); обратное направление ошибок не допускается ни в одном тесте
- 5.2 Ни один новый лог не несёт значений точек, имён метрик без обрезки и секретов; уровень выбран по адресату
- 5.3
task gateзелёный;task verify:archiveсходится (обслуживание WAL и версия не меняют витрину) - 5.4 Поведенческая проверка на своём стенде из исходников (отдельный
каталог данных, рабочий контейнер не трогаем):
curlдважды даёт304, после доставки —200
6. Документация
- 6.1
docs/architecture.md: версия витрины, условный запрос, обслуживание WAL, отвергнутые чужие решения с причинами - 6.2
README.md: строка про условный запрос в примерах чтения - 6.3
docs/backlog: задача снята, остаток (предел ответа, измеренная цена первого запроса, готовая машинерия условного запроса) перенесён вread-api-points.md; наблюдаемость — вstats-endpoint.md, цена ветки исчерпанного бюджета — вshutdown-and-migration-traces.md