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>
This commit is contained in:
1 parent
ae4aee3f66
commit
78fb8e372c
15 files changed
+222
-68
No files matched your search
+15
-6
@@ -4,29 +4,38 @@
|
||||
|
||||
На первом этапе мы:
|
||||
- поднимаем отдельный контейнер `bookings-db` с Postgres;
|
||||
- устанавливаем в нём генератор демобазы `demodb` (репозиторий `postgrespro/demodb`);
|
||||
- инициализируем демобазу одним из двух способов (см. ниже);
|
||||
- генерируем данные «день за днём» с помощью `make`‑команд.
|
||||
|
||||
Основные команды см. в корневом `Makefile` (`bookings-init`, `bookings-generate-day`, `bookings-psql`) и в `README.md` проекта.
|
||||
### Два способа инициализации
|
||||
|
||||
| Команда | Что делает | Время | Для кого |
|
||||
|---------|-----------|-------|----------|
|
||||
| `make bookings-init` | Быстрое восстановление из seed-дампа | ~18 сек | **Студенты** (рекомендуется по умолчанию) |
|
||||
| `make bookings-generate` | Полная генерация с нуля через генератор demodb | часы | Разработчики, пересоздание дампа |
|
||||
|
||||
Основные команды см. в корневом `Makefile` (`bookings-init`, `bookings-generate`, `bookings-generate-day`, `bookings-psql`) и в `README.md` проекта.
|
||||
|
||||
## Источник и версия
|
||||
- Репозиторий демобазы: `postgrespro/demodb`.
|
||||
- Закреплённый коммит: `d68de192850237719f09b47688d5f3fc94653ca6` (см. `DEMODB_COMMIT` в корневом `Makefile`).
|
||||
- Закреплённый коммит: `866e56f7` (см. `DEMODB_COMMIT` в корневом `Makefile`).
|
||||
|
||||
## Что мы патчим в demodb
|
||||
- `install.sql`: `DROP DATABASE IF EXISTS demo WITH (FORCE)` — установка не падает, даже если демобазу держат активные сессии (например, из Airflow).
|
||||
- `engine.sql`: два изменения в `engine_jobs1_sync.patch`:
|
||||
- `busy()` игнорирует свой `pid`, чтобы не считать собственное подключение занятым;
|
||||
- `continue()` при `jobs=1` вызывает `process_queue` синхронно (без `dblink`), иначе генерация обрывается при выходе из `psql` и данных не появляется.
|
||||
- Режим эксплуатации в этом стенде: только `jobs=1` (`BOOKINGS_JOBS=1`).
|
||||
- Патчи применяются автоматически в `make bookings-init`. Если что-то пошло не так, их можно накатить вручную:
|
||||
- `install.sql`: удалён хардкод `gen.connstr` без credentials (`install_connstr_no_hardcode.patch`).
|
||||
- Дефолт: `BOOKINGS_JOBS=2`. При `jobs=1` генерация синхронная (без dblink), при `jobs>1` — через dblink.
|
||||
- Патчи применяются автоматически в `make bookings-generate` (генерация с нуля). Если что-то пошло не так, их можно накатить вручную:
|
||||
```
|
||||
patch -d bookings/demodb -p1 --forward < bookings/patches/install_drop_if_exists.patch
|
||||
patch -d bookings/demodb -p1 --forward < bookings/patches/engine_jobs1_sync.patch
|
||||
```
|
||||
|
||||
## Быстрая проверка после init/обновления
|
||||
- `make bookings-init` должен завершиться без ошибок; в `bookings.bookings` ожидаем >0 строк (примерно 15k).
|
||||
- `make bookings-init` (восстановление из дампа) должен завершиться без ошибок; в `bookings.bookings` ожидаем >0 строк (примерно 15k).
|
||||
- `make bookings-generate` (генерация с нуля) тоже должен дать >0 строк, но занимает значительно больше времени.
|
||||
- `make bookings-generate-day` добавляет следующий день после `max(book_date)`.
|
||||
- Ручной вызов генерации из psql/DBeaver — только через DO-блок (подзапрос в аргументах `CALL` не работает):
|
||||
```sql
|
||||
|
||||
@@ -11,12 +11,11 @@ DECLARE
|
||||
BEGIN
|
||||
-- Проверяем, что демобаза установлена
|
||||
IF to_regclass('bookings.bookings') IS NULL THEN
|
||||
RAISE EXCEPTION 'Таблица bookings.bookings не найдена. Сначала выполните make bookings-init.';
|
||||
RAISE EXCEPTION 'Таблица bookings.bookings не найдена. Сначала выполните make bookings-init или make bookings-generate.';
|
||||
END IF;
|
||||
|
||||
-- В учебном стенде поддерживается только jobs=1, иначе генерация нестабильна.
|
||||
IF v_jobs <> 1 THEN
|
||||
RAISE EXCEPTION 'Поддерживается только bookings.jobs=1. Текущее значение: %. Установите BOOKINGS_JOBS=1 и выполните make bookings-init.', v_jobs;
|
||||
IF v_jobs < 1 THEN
|
||||
RAISE EXCEPTION 'bookings.jobs должен быть >= 1. Текущее значение: %.', v_jobs;
|
||||
END IF;
|
||||
|
||||
-- Ищем последнюю сгенерированную дату
|
||||
@@ -39,6 +38,17 @@ BEGIN
|
||||
CALL continue(v_end_date, v_jobs);
|
||||
END IF;
|
||||
|
||||
-- continue() делает TRUNCATE gen.stat_jobs → AccessExclusiveLock.
|
||||
-- Без COMMIT воркеры не могут INSERT INTO gen.stat_jobs → deadlock.
|
||||
COMMIT;
|
||||
|
||||
-- При jobs>1 воркерам нужно время, чтобы подключиться через dblink и
|
||||
-- выставить application_name='Airlines processor'. Без паузы busy()
|
||||
-- сразу вернёт false (воркеры ещё не видны в pg_stat_activity).
|
||||
IF v_jobs > 1 THEN
|
||||
PERFORM pg_sleep(3);
|
||||
END IF;
|
||||
|
||||
-- Ждём завершения фоновых джобов генератора, чтобы данные успели записаться
|
||||
WHILE busy() LOOP
|
||||
PERFORM pg_sleep(1);
|
||||
@@ -50,4 +60,12 @@ BEGIN
|
||||
IF v_bookings_cnt = 0 THEN
|
||||
RAISE EXCEPTION 'Генератор demodb завершился, но bookings.bookings пустая. Проверьте применение патчей и логи генератора.';
|
||||
END IF;
|
||||
|
||||
-- Генерация закончена — возвращаем synchronous_commit = on и сбрасываем
|
||||
-- буферы на диск. Без этого docker compose down может убить PostgreSQL
|
||||
-- до записи WAL → данные пропадут (особенно на WSL2).
|
||||
ALTER DATABASE demo SET synchronous_commit = on;
|
||||
SET synchronous_commit = on;
|
||||
END $$;
|
||||
|
||||
CHECKPOINT;
|
||||
@@ -0,0 +1,14 @@
|
||||
--- a/install.sql
|
||||
+++ b/install.sql
|
||||
@@ -24,8 +24,9 @@
|
||||
-- use UTC to avoid daylight-saving problems
|
||||
ALTER DATABASE demo SET timezone = 'Etc/UTC';
|
||||
|
||||
--- connection string for dblink
|
||||
-ALTER DATABASE demo SET gen.connstr = 'dbname=demo';
|
||||
+-- Строку подключения для dblink (gen.connstr) задаёт Makefile
|
||||
+-- с credentials текущего пользователя БД. Не хардкодим здесь,
|
||||
+-- иначе VACUUM и другие dblink-вызовы падают без пароля.
|
||||
|
||||
-- airlines company name
|
||||
ALTER DATABASE demo SET gen.airlines_name = 'PostgresPro';
|
||||
Binary file not shown.
Reference in new issue
Block a user