6.7 KiB
План исправления: генератор demodb (bookings) остаётся пустым
Контекст
В стенде используется демобаза bookings из репозитория postgrespro/demodb, закреплённая на коммите d68de192850237719f09b47688d5f3fc94653ca6 (см. DEMODB_COMMIT в Makefile).
Инициализация источника для ETL выполняется командой make bookings-init:
- клонирует demodb в
bookings/demodb/; - пытается применить патчи из
bookings/patches/; - запускает
install.sqlв контейнереbookings-db; - выставляет GUC-параметры (
gen.connstr,bookings.start_date/init_days/jobs); - запускает
/bookings/generate_next_day.sql(должен сгенерировать минимум 1 день данных).
Симптомы (как в TODO)
- после
make bookings-initтаблицаbookings.bookingsостаётся пустой; - патчи
bookings/patches/engine_jobs1_sync.patchиbookings/patches/install_drop_if_exists.patchпадают при применении; - из‑за этого DAG
bookings_to_gp_stageвалится на проверках (источник пустой).
Предварительный диагноз (что уже видно)
-
engine_jobs1_sync.patchне является валидным unified diff (в hunk’ах нет номеров строк вида@@ -N,M +N,M @@), поэтомуpatchотвечает:patch: **** Only garbage was found in the patch input. -
install_drop_if_exists.patchустарел относительно закреплённого коммита demodb: вinstall.sqlуже естьDROP DATABASE IF EXISTS demo;, поэтому hunk “не находится” и патч не накатывается. -
Ошибки патча сейчас замаскированы в
Makefileчерез|| true, поэтомуmake bookings-initможет завершаться “успешно”, хотя критичные правки в demodb не применились.
Цель фикса
make bookings-initвоспроизводимо создаёт и наполняетdemo.bookings.bookings(>0 строк).- Если патчи не применяются — процесс останавливается с понятным сообщением, что делать дальше.
- Патчи соответствуют закреплённому коммиту demodb и применяются идемпотентно.
План диагностики (чтобы быстро подтвердить проблему)
- Чистое воспроизведение:
make cleanrm -rf bookings/demodbmake bookings-init
- Проверка данных:
make bookings-psql- выполнить:
SELECT COUNT(*) FROM bookings.bookings;SELECT min(book_date), max(book_date) FROM bookings.bookings;
- Проверка патчей (без изменения файлов):
patch -d bookings/demodb -p1 --dry-run < bookings/patches/engine_jobs1_sync.patchpatch -d bookings/demodb -p1 --dry-run < bookings/patches/install_drop_if_exists.patch
Ожидаемо: сейчас dry-run показывает “garbage in patch” и/или “Hunk FAILED”.
План решения
Шаг 1. Пересобрать патчи под закреплённый демо‑коммит
Собираем патчи через git diff, чтобы получился корректный unified diff.
bookings/patches/engine_jobs1_sync.patch:
- Добавить/подтвердить 2 изменения в
engine.sql:busy()игнорирует текущий backend:AND pid <> pg_backend_pid().continue()приjobs = 1выполняетprocess_queue(end_date)синхронно и пишет заметный маркер в лог (Job 1 (local): ok), иначе — оставляет текущую логику черезdblink.
bookings/patches/install_drop_if_exists.patch:
- Поменять строку (в актуальном
install.sql):- было:
DROP DATABASE IF EXISTS demo; - стало:
DROP DATABASE IF EXISTS demo WITH (FORCE);
- было:
Шаг 2. Сделать make bookings-init fail-fast на проблемах с патчами
В Makefile:
- убрать
|| trueу применения патчей; - при ошибке патча — завершать
makeс ненулевым кодом и короткой подсказкой:- “удалите
bookings/demodbи повторитеmake bookings-init”, - “если не помогло — проверьте, что
DEMODB_COMMITне менялся и патчи собраны под него”.
- “удалите
Шаг 3. Добавить “защиту от тихого пустого результата”
После запуска /bookings/generate_next_day.sql (в Makefile или внутри SQL):
- выполнить проверку
COUNT(*)поbookings.bookings; - если 0 — завершаться ошибкой с подсказкой, куда смотреть (патчи/логи генератора).
Цель: чтобы проблема не уезжала дальше в DAG’и и DQ‑проверки, а ловилась сразу при init.
Проверка (критерии готовности)
make clean && rm -rf bookings/demodb && make bookings-initзавершается без ошибок.make bookings-psql→SELECT COUNT(*) FROM bookings.bookings;возвращает> 0.make bookings-generate-dayдобавляет следующий день:max(book_date)сдвигается на +1 сутки.
./scripts/e2e_smoke.shпроходит до проверкиstg.bookings(или хотя бы DAGbookings_to_gp_stageперестаёт падать на “источник пустой”).
Откат (если нужно быстро вернуть стенд в рабочее состояние)
- Временно отключить применение патчей в
Makefileи явно предупреждать, что генерация может быть нестабильной (нежелательно для студентов). - Или зафиксировать альтернативный
DEMODB_COMMIT, под который уже готовы патчи (делать только вместе с обновлением документации и проверкой, что генерация стабильна).