Баг генерации bookings

This commit is contained in:
2025-12-11 10:34:16 +03:00
parent 90aafd7b1d
commit 31171f84bc
6 changed files with 84 additions and 11 deletions
+30
View File
@@ -9,3 +9,33 @@
Основные команды см. в корневом `Makefile` (`bookings-init`, `bookings-generate-day`, `bookings-psql`) и в `README.md` проекта.
## Источник и версия
- Репозиторий демобазы: `postgrespro/demodb`.
- Закреплённый коммит: `d68de192850237719f09b47688d5f3fc94653ca6` (см. `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` и данных не появляется.
- Патчи применяются автоматически в `make bookings-init`. Если что-то пошло не так, их можно накатить вручную:
```
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-generate-day` добавляет следующий день после `max(book_date)`.
- Ручной вызов генерации из psql/DBeaver — только через DO-блок (подзапрос в аргументах `CALL` не работает):
```sql
DO $$
DECLARE
v_next_day timestamptz;
BEGIN
SELECT date_trunc('day', max(book_date)) + interval '1 day'
INTO v_next_day
FROM bookings.bookings;
CALL continue(v_next_day); -- или CALL continue(v_next_day, 4)
END $$;
```
+34 -2
View File
@@ -1,6 +1,6 @@
--- a/engine.sql
+++ b/engine.sql
@@ -230,7 +230,8 @@
@@
SELECT count(*) > 0
FROM pg_stat_activity
WHERE application_name = 'Airlines processor'
@@ -8,4 +8,36 @@
+ AND state != 'idle'
+ AND pid <> pg_backend_pid();
END;
@@
TRUNCATE TABLE gen.stat_jobs;
-- disconnect all previously opened connections
PERFORM dblink_disconnect(unnest(dblink_get_connections()));
- -- start parallel jobs
- FOR i IN 1 .. jobs LOOP
- connname := 'job' || i;
- PERFORM dblink_connect(connname, current_setting('gen.connstr'));
- res := CASE dblink_send_query(connname, format('CALL process_queue(%L)',end_date))
- WHEN 1 THEN 'ok' ELSE 'FAILED'
- END CASE;
- CALL log_message(0, format('Job %s (connname=%s): %s', i, connname, res));
- RAISE NOTICE 'Starting job %: %', i, res;
- END LOOP;
+ IF jobs = 1 THEN
+ -- jobs=1: синхронно, чтобы не убивать dblink-сессию при выходе из psql
+ CALL process_queue(end_date);
+ CALL log_message(0, 'Job 1 (local): ok');
+ ELSE
+ -- start parallel jobs
+ FOR i IN 1 .. jobs LOOP
+ connname := 'job' || i;
+ PERFORM dblink_connect(connname, current_setting('gen.connstr'));
+ res := CASE dblink_send_query(connname, format('CALL process_queue(%L)',end_date))
+ WHEN 1 THEN 'ok' ELSE 'FAILED'
+ END CASE;
+ CALL log_message(0, format('Job %s (connname=%s): %s', i, connname, res));
+ RAISE NOTICE 'Starting job %: %', i, res;
+ END LOOP;
+ END IF;
@@ -5,7 +5,7 @@
*/
-DROP DATABASE demo;
+DROP DATABASE IF EXISTS demo;
+DROP DATABASE IF EXISTS demo WITH (FORCE);
CREATE DATABASE demo;
\c demo
CREATE EXTENSION btree_gist;