отработаны находки ревью кода
Триаж свёл 62 сырые находки девяти проходов к 33 причинам: 3 блокера, 4 «сейчас», 2 развилки. Все закрыты регрессионными тестами. - схема точки сна определяется по самой точке, а не по индексу в исходном массиве: одна пропущенная точка меняла эпизод и сводку местами - доставка сворачивается одной транзакцией: частичное состояние было недетерминированным (восемь прогонов — семь состояний) - граница размера на распакованном теле: 400 КиБ gzip разворачивались в 400 МиБ мимо max_body_mb - столкновение — расхождение канонических форм, а не байтов; WARN с координатами объекта; payload без HTML-экранирования - выравнивание по местной метке: получасовые зоны уводили часовую выгрузку в minute - доставка из одних суточных сводок больше не отвергается целиком - единицы не переписываются молча; счётчик считает сохранённые точки - все выходы Fold логируются, исход пишется на переживающем отмену контексте Четыре развилки вынесены блокерами в беклог.
This commit is contained in:
@@ -88,13 +88,26 @@
|
||||
- **THEN** исход определяется детерминированно и не зависит от порядка
|
||||
воспроизведения доставок
|
||||
|
||||
Столкновением SHALL считаться расхождение **канонических форм**, а не байтов.
|
||||
Байты нестабильны — ради этого канонизация и заведена: из 81 952 повторно
|
||||
приехавших точек 67 534 различаются лишь порядком ключей, ещё 63% — последним
|
||||
разрядом double. Побайтовое сравнение давало бы тысячи ложных срабатываний на
|
||||
каждом глубоком проходе, и настоящий отказ правила стал бы неотличим от нормы.
|
||||
|
||||
#### Scenario: Столкновение с различием содержимого оставляет след
|
||||
|
||||
- **WHEN** по одним координатам сохраняется точка, каноническая форма которой
|
||||
отличается от уже сохранённой
|
||||
- **THEN** система пишет запись уровня `WARN` без значений точки
|
||||
- **AND** запись несёт координаты объекта: метрику, слой и час
|
||||
- **AND** увеличивает счётчик перезаписей в итоге разбора доставки
|
||||
|
||||
#### Scenario: Дребезг сериализации столкновением не считается
|
||||
|
||||
- **WHEN** та же точка приезжает с другим порядком ключей или отличаясь
|
||||
последним разрядом числа
|
||||
- **THEN** счётчик перезаписей не растёт и `WARN` не пишется
|
||||
|
||||
Без этого следа допущение «меньше полей не значит новее» не получит ни одного
|
||||
наблюдения, а отказ правила будет неотличим от нормальной работы до сверки с
|
||||
экспортом Apple — то есть месяцами.
|
||||
@@ -117,7 +130,32 @@
|
||||
слияний.
|
||||
|
||||
Запись — чтение объекта, слияние точек, запись обратно. Точки из объекта
|
||||
MUST NOT удаляться.
|
||||
MUST NOT удаляться. Содержимое объекта SHALL сериализоваться без
|
||||
HTML-экранирования: `&`, `<` и `>` внутри точки обязаны храниться теми же
|
||||
байтами, какими пришли, иначе «точка хранится дословно» перестаёт быть правдой,
|
||||
а сравнение с последующей доставкой той же точки промахивается навсегда.
|
||||
|
||||
Доставка SHALL сворачиваться **одной транзакцией**. Транзакция на объект давала
|
||||
недетерминированное частичное состояние: обход групп рандомизирован, и при
|
||||
отказе посреди доставки набор уже записанных объектов каждый раз другой
|
||||
(измерено: восемь прогонов одной доставки — семь разных состояний). Это ломает
|
||||
инвариант «состояние пересобираемо».
|
||||
|
||||
Единицы измерения MUST NOT переписываться молча: при расхождении сохранённых и
|
||||
пришедших единиц остаётся сохранённое значение, факт учитывается счётчиком и
|
||||
попадает в запись уровня `WARN`. Внутри точки единиц нет, и у ранее сохранённых
|
||||
точек не остаётся ничего, по чему их единицы восстановимы.
|
||||
|
||||
#### Scenario: Отказ посреди доставки не оставляет части объектов
|
||||
|
||||
- **WHEN** свёртка доставки прерывается на середине
|
||||
- **THEN** не записывается ни один объект этой доставки
|
||||
|
||||
#### Scenario: Смена единиц не переподписывает сохранённые точки
|
||||
|
||||
- **WHEN** в объект приезжают точки в единицах, отличных от сохранённых
|
||||
- **THEN** единицы объекта остаются прежними
|
||||
- **AND** факт учитывается счётчиком и записью `WARN`
|
||||
|
||||
#### Scenario: Точки за один час ложатся в один объект
|
||||
|
||||
|
||||
Reference in New Issue
Block a user