отработаны находки ревью кода
Триаж свёл 62 сырые находки девяти проходов к 33 причинам: 3 блокера, 4 «сейчас», 2 развилки. Все закрыты регрессионными тестами. - схема точки сна определяется по самой точке, а не по индексу в исходном массиве: одна пропущенная точка меняла эпизод и сводку местами - доставка сворачивается одной транзакцией: частичное состояние было недетерминированным (восемь прогонов — семь состояний) - граница размера на распакованном теле: 400 КиБ gzip разворачивались в 400 МиБ мимо max_body_mb - столкновение — расхождение канонических форм, а не байтов; WARN с координатами объекта; payload без HTML-экранирования - выравнивание по местной метке: получасовые зоны уводили часовую выгрузку в minute - доставка из одних суточных сводок больше не отвергается целиком - единицы не переписываются молча; счётчик считает сохранённые точки - все выходы Fold логируются, исход пишется на переживающем отмену контексте Четыре развилки вынесены блокерами в беклог.
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
# Единицы метрики: часть координаты или свойство объекта
|
||||
|
||||
**Приоритет:** блокеры
|
||||
|
||||
Вынуто ревью кода задачи `razbor-metrik-v-obekty` (профиль `deep`, найдено
|
||||
тремя проходами независимо).
|
||||
|
||||
## Что решить
|
||||
|
||||
Единицы измерения живут колонкой объекта — одна на все точки часа. Что делать,
|
||||
когда в тот же час приезжают точки в **других** единицах.
|
||||
|
||||
## Почему это не мелочь
|
||||
|
||||
Внутри точки единиц нет: проверено на 89 доставках, поле `units` не
|
||||
встретилось ни разу, оно живёт только на уровне метрики. Значит у точки,
|
||||
сохранённой раньше, не остаётся **ничего**, по чему её единицы восстановимы —
|
||||
кроме сырого архива, пока он жив.
|
||||
|
||||
Смена реальна и не требует злого умысла: переключатель единиц в настройках
|
||||
HAE, смена локали телефона, переименование единицы в новой версии приложения.
|
||||
|
||||
## Варианты и цена
|
||||
|
||||
**(1) Единицы — часть координаты объекта** (`метрика + слой + единицы + час`).
|
||||
Цена: миграция, ключ шире, каталог разрезов обязан показывать единицы. Зато
|
||||
точки никогда не подписаны чужим — разные единицы просто разные ряды.
|
||||
|
||||
**(2) Первое непустое побеждает, расхождение — `WARN` и счётчик** (сделано
|
||||
сейчас как безопасное умолчание).
|
||||
Цена: нулевая, уже работает. Но час, начавшийся в километрах, останется
|
||||
километровым навсегда, даже если телефон окончательно переехал на мили.
|
||||
|
||||
**(3) Хранить обе величины у объекта** (`units` и `units_seen`).
|
||||
Цена: малая, но это откладывание решения: читателю всё равно придётся
|
||||
выбирать.
|
||||
|
||||
## Рекомендация
|
||||
|
||||
**(1)**, если единицы вообще могут меняться на живом потоке — а они могут.
|
||||
Сегодняшний (2) безопасен, но оставляет систематическую ложь в подписи.
|
||||
|
||||
## Что стоит без решения
|
||||
|
||||
Ничего не теряется: сохранённые единицы больше **не перезаписываются** молча
|
||||
(было — пришедшие всегда побеждали), расхождение считается в
|
||||
`MergeStats.UnitsConflicts` и даёт `WARN` в свёртке.
|
||||
|
||||
Отдельная тонкость, которую надо закрыть тем же решением: единицы не входят в
|
||||
хеш содержимого, поэтому доставка с теми же точками и исправленными единицами
|
||||
уходит по ветке «ничего не изменилось» и колонку не трогает. То есть единицы
|
||||
сегодня обновляются тогда и только тогда, когда изменилось содержимое, —
|
||||
правило, которого никто не формулировал.
|
||||
Reference in New Issue
Block a user