Цена читающего маршрута: чекпойнт WAL по таймеру и условный запрос
- рядом с воркером свёртки живёт горутина, раз в минуту разбирающая журнал пассивным чекпойнтом; «журнал не разбирается» видно строкой владельцу, а не только по `df`. Признак — пара чисел, а не флаг занятости: тот молчит под удерживаемым читателем (`busy=0` при 6256 страницах и пяти перенесённых), а при занятой блокировке отдаёт `-1` вместо ответа, и `-1 >= -1` читалось бы как «разобрано целиком» - каталог отвечает `304` на `If-None-Match`, не открывая снимок витрины. Метка собрана из всего, от чего зависит ответ: версии витрины (`data_version` с закреплённого соединения плюс поколение — значение локально для соединения и не переживает переоткрытия), горизонта измерения и области действия ресурса. Версия снимается до и после сборки: снятая после пометила бы устаревший снимок свежим номером - предел и дедлайн ответа отложены в задачу Read API точек вместе с измеренной ценой первого запроса; попутно починен флаки-тест чужой задачи, искавший значение точки в сыром буфере записи лога
This commit is contained in:
@@ -110,3 +110,24 @@
|
||||
стоит одной строки, а пропуск молчащий стоил семи находок и отдельной задачи
|
||||
на их дозакрытие. Состав проходов и профилей при этом не трогаем: они
|
||||
сработали ровно так, как задуманы, — их просто не позвали.
|
||||
|
||||
## 2026-08-02 — тест на утечку значений в лог краснел от хода часов
|
||||
|
||||
- **Где:** `internal/fold/log_test.go`, `TestFoldНесравнимыеНаборыДаютWarn`
|
||||
- **Симптом:** гейт задачи про цену читающего маршрута покраснел на чужом
|
||||
тесте: «в логе оказалось значение точки "5.1"». Значения в логе не было —
|
||||
подстрока нашлась в метке времени записи (`…T20:23:35.193…` содержит `5.1`).
|
||||
Повторный прогон зелёный.
|
||||
- **Причина:** утверждение искало секрет в **сыром буфере** записи, а буфер
|
||||
содержит служебное поле `time` с долями секунды. Вероятность совпадения для
|
||||
двухсимвольного числа с точкой — около процента на прогон, то есть тест
|
||||
флаки по построению, и краснеет он у того, кто мимо проходил.
|
||||
- **Почему не поймали:** шаг `flaky` гейта гоняет набор дважды подряд —
|
||||
вероятность поймать однопроцентную флаки за два прогона мала, а сам тест
|
||||
выглядит образцовым: он проверяет ровно тот инвариант, который проекту
|
||||
дороже всего («данные о здоровье чувствительнее токенов»). Ни один проход
|
||||
ревью не смотрит на тесты чужих задач.
|
||||
- **Что меняем:** правило в [conventions.md](conventions.md) — проверка «в логе
|
||||
нет значения» разбирает запись и выбрасывает `time`, а не ищет в сыром
|
||||
буфере. Гейт не трогаем: два прогона против однопроцентной флаки не помогут,
|
||||
а десять стоили бы дороже самой находки.
|
||||
|
||||
Reference in New Issue
Block a user