Files
airflow-greenplum/plans/bookings-demodb-bugfix-plan.md
T
ddadminandClaude Opus 4.6 78fb8e372c fix(bookings): исправлена генерация demodb и добавлен seed-дамп
- Зачем:
  - генерация с нуля занимала часы, boarding_passes были пустыми, данные
    пропадали после docker compose down/up.
- Что:
  - обновлён demodb до коммита 866e56f, добавлен патч install_connstr_no_hardcode.
  - BOOKINGS_INIT_DAYS увеличен до 60, BOOKINGS_JOBS по умолчанию 2.
  - добавлен seed-дамп bookings/seed/demo.sql.xz (42 MB, xz вместо 7z).
  - make bookings-init восстанавливает из дампа (~18 сек) и применяет GUC из .env.
  - make bookings-generate — генерация с нуля для разработчиков.
  - generate_next_day.sql: COMMIT после continue(), pg_sleep(3) для jobs>1, synchronous_commit=on + CHECKPOINT.
  - bookings-check-jobs: добавлена валидация нечисловых значений BOOKINGS_JOBS.
  - bookings-init теперь вызывает bookings-check-jobs как prerequisite.
  - синхронизированы внутренние документы (коммит demodb, init_days=60).
- Проверка:
  - make bookings-init && make bookings-generate-day BOOKINGS_JOBS=2.
  - make test.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 15:01:03 +03:00

7.2 KiB
Raw Blame History

План исправления: генератор demodb (bookings) остаётся пустым

Контекст

В стенде используется демобаза bookings из репозитория postgrespro/demodb, закреплённая на коммите 866e56f7fe54596a1d2a88f5f32f4aa3b2698121 (см. DEMODB_COMMIT в Makefile).

Инициализация источника для ETL выполняется двумя способами:

  • make bookings-init — быстрое восстановление из seed-дампа (~18 сек, рекомендуется для студентов);
  • make bookings-generate — полная генерация с нуля (для разработчиков):
    • клонирует 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-generate таблица bookings.bookings остаётся пустой;
  • патчи bookings/patches/engine_jobs1_sync.patch и bookings/patches/install_drop_if_exists.patch падают при применении;
  • из‑за этого DAG bookings_to_gp_stage валится на проверках (источник пустой).

Предварительный диагноз (что уже видно)

  1. engine_jobs1_sync.patch не является валидным unified diff (в hunk’ах нет номеров строк вида @@ -N,M +N,M @@), поэтому patch отвечает: patch: **** Only garbage was found in the patch input.

  2. install_drop_if_exists.patch устарел относительно закреплённого коммита demodb: в install.sql уже есть DROP DATABASE IF EXISTS demo;, поэтому hunk “не находится” и патч не накатывается.

  3. Ошибки патча сейчас замаскированы в Makefile через || true, поэтому make bookings-generate может завершаться “успешно”, хотя критичные правки в demodb не применились.

Цель фикса

  • make bookings-init (восстановление из дампа) и make bookings-generate (генерация с нуля) воспроизводимо создают и наполняют demo.bookings.bookings (>0 строк).
  • Если патчи не применяются — процесс останавливается с понятным сообщением, что делать дальше.
  • Патчи соответствуют закреплённому коммиту demodb и применяются идемпотентно.

План диагностики (чтобы быстро подтвердить проблему)

  1. Чистое воспроизведение:
  • make clean
  • rm -rf bookings/demodb
  • make bookings-generate
  1. Проверка данных:
  • make bookings-psql
  • выполнить:
    • SELECT COUNT(*) FROM bookings.bookings;
    • SELECT min(book_date), max(book_date) FROM bookings.bookings;
  1. Проверка патчей (без изменения файлов):
  • patch -d bookings/demodb -p1 --dry-run < bookings/patches/engine_jobs1_sync.patch
  • patch -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.

  1. 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.
  1. bookings/patches/install_drop_if_exists.patch:
  • Поменять строку (в актуальном install.sql):
    • было: DROP DATABASE IF EXISTS demo;
    • стало: DROP DATABASE IF EXISTS demo WITH (FORCE);

Шаг 2. Сделать make bookings-generate fail-fast на проблемах с патчами

В Makefile:

  • убрать || true у применения патчей;
  • при ошибке патча — завершать make с ненулевым кодом и короткой подсказкой:
    • “удалите bookings/demodb и повторите make bookings-generate”,
    • “если не помогло — проверьте, что DEMODB_COMMIT не менялся и патчи собраны под него”.

Шаг 3. Добавить “защиту от тихого пустого результата”

После запуска /bookings/generate_next_day.sqlMakefile или внутри SQL):

  • выполнить проверку COUNT(*) по bookings.bookings;
  • если 0 — завершаться ошибкой с подсказкой, куда смотреть (патчи/логи генератора).

Цель: чтобы проблема не уезжала дальше в DAG’и и DQ‑проверки, а ловилась сразу при init.

Проверка (критерии готовности)

  • make clean && rm -rf bookings/demodb && make bookings-generate завершается без ошибок.
  • make bookings-psqlSELECT COUNT(*) FROM bookings.bookings; возвращает > 0 (для обоих способов: bookings-init и bookings-generate).
  • make bookings-generate-day добавляет следующий день:
    • max(book_date) сдвигается на +1 сутки.
  • ./scripts/e2e_smoke.sh проходит до проверки stg.bookings (или хотя бы DAG bookings_to_gp_stage перестаёт падать на “источник пустой”).

Откат (если нужно быстро вернуть стенд в рабочее состояние)

  • Временно отключить применение патчей в Makefile и явно предупреждать, что генерация может быть нестабильной (нежелательно для студентов).
  • Или зафиксировать альтернативный DEMODB_COMMIT, под который уже готовы патчи (делать только вместе с обновлением документации и проверкой, что генерация стабильна).