From 2ee436f8c7bb258e3451e0b6ae730a4d02f63467 Mon Sep 17 00:00:00 2001 From: Dmitry Dementiev Date: Thu, 13 Aug 2026 12:24:54 +0300 Subject: [PATCH] =?UTF-8?q?docs(adr):=20=D1=83=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D0=B0=20=D0=BF=D0=BE=D0=B7=D0=B8=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=20=D0=BC=D1=8F=D0=B3?= =?UTF-8?q?=D0=BA=D0=B8=D0=B9=20=D1=85=D1=83=D0=B4=D1=88=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=B8=D1=81=D1=85=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зачем: горячее ревью ADR 0009 нашло случай, который читатель найдёт сам — работник, кончивший позже, ставит позицию по своему последнему дню и может отодвинуть её назад. Что: случай назван вместе с ценой (часть дней переигрывается, и это дешевле дыры); заодно поправлен порядок слов там, где даг зовёт генератор. Проверка: make config-test зелёный. Co-Authored-By: Claude Opus 5 --- docs/adr/0009-world-control.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/adr/0009-world-control.md b/docs/adr/0009-world-control.md index 50bd601..9326749 100644 --- a/docs/adr/0009-world-control.md +++ b/docs/adr/0009-world-control.md @@ -17,7 +17,7 @@ через `TriggerDagRunOperator`, дожидаясь его завершения. Снят с паузы — стенд живёт день за днём; поставлен на паузу — мир встал на границе модельных суток. -Генератор задача зовёт `DockerOperator`: поднимает образ +Генератор задача зовёт через `DockerOperator`: тот поднимает образ `clickstream-generator:local` — тот самый канонический контейнер, внутри которого [спека генератора](../specs/2026-08-01-generator.md) обещает побайтовую воспроизводимость, — в сети стенда, командой `batch` или `live`. @@ -75,12 +75,18 @@ и выключатель. Это [ADR 0003](0003-dag-run-state.md) в действии: зелёный конец графа не должен переживать отказ выше. -**Позиция ставится, а не увеличивается.** Правило дешевле сторожа. Если -автоматика прилетит поверх ручного прогона, худшее — день сыгран дважды: номера -событий детерминированы, повтор схлопнет `ReplacingMergeTree`, а позиция -останется верной. Увеличение на единицу в том же случае молча проглотило бы -день, и мир получил бы дыру, которую никто не заметит. Ни пул как мьютекс, ни -проверка «а не идёт ли другой прогон» после этого не нужны. +**Позиция ставится, а не увеличивается.** Правило дешевле сторожа. Если прогон +выключателя наложится на ручной, худшее — день сыгран дважды: номера событий +детерминированы, повтор схлопнет `ReplacingMergeTree`, а позиция останется +верной. Увеличение на единицу в том же случае молча проглотило бы день, и мир +получил бы дыру, которую никто не заметит. Ни пул как мьютекс, ни проверка «а не +идёт ли другой прогон» после этого не нужны. + +Худший исход у правила всё-таки есть, и он мягкий: работник, кончивший позже, +ставит позицию по своему последнему дню и может отодвинуть её назад — так +бывает, если долгий живой день закончится после разгона на три дня вперёд. +Тогда часть дней переигрывается. Это дешевле дыры: переигранный день склеится, +пропущенный не найдётся никогда. **Плата — сокет докера внутри Airflow.** Доступ к нему равен праву root на машине, и пользователю `airflow` он открывается через GID группы `docker`,