From f81a831c0cf5a617189ffd6b5482a1a6f464624d Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Thu, 8 Jan 2026 22:52:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B0=D1=82=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 10 +++++-- bookings/generate_next_day.sql | 7 +++++ bookings/patches/engine_jobs1_sync.patch | 26 ++++++++++--------- bookings/patches/install_drop_if_exists.patch | 8 +----- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/Makefile b/Makefile index ea563ea..5424d7a 100644 --- a/Makefile +++ b/Makefile @@ -47,11 +47,17 @@ bookings-clone-demodb: fi # Патчим generate/continue: при jobs=1 запускаем process_queue синхронно, без dblink if ! grep -q "Job 1 (local): ok" bookings/demodb/engine.sql; then \ - patch -d bookings/demodb -p1 --forward < bookings/patches/engine_jobs1_sync.patch || true; \ + if ! patch -d bookings/demodb -p1 --forward < bookings/patches/engine_jobs1_sync.patch; then \ + echo "Не удалось применить патч engine_jobs1_sync.patch. Удалите bookings/demodb и повторите make bookings-init." >&2; \ + exit 1; \ + fi; \ fi # Делаем установку идемпотентной и принудительной: DROP DATABASE IF EXISTS demo WITH (FORCE) if ! grep -q "DROP DATABASE IF EXISTS demo WITH (FORCE);" bookings/demodb/install.sql; then \ - patch -d bookings/demodb -p1 --forward < bookings/patches/install_drop_if_exists.patch || true; \ + if ! patch -d bookings/demodb -p1 --forward < bookings/patches/install_drop_if_exists.patch; then \ + echo "Не удалось применить патч install_drop_if_exists.patch. Удалите bookings/demodb и повторите make bookings-init." >&2; \ + exit 1; \ + fi; \ fi bookings-init: bookings-clone-demodb diff --git a/bookings/generate_next_day.sql b/bookings/generate_next_day.sql index 00010be..58afdc8 100644 --- a/bookings/generate_next_day.sql +++ b/bookings/generate_next_day.sql @@ -4,6 +4,7 @@ DECLARE v_max_book_date timestamptz; v_start_date timestamptz; v_end_date timestamptz; + v_bookings_cnt bigint; v_jobs integer := COALESCE(current_setting('bookings.jobs', true), '1')::integer; v_init_days integer := COALESCE(current_setting('bookings.init_days', true), '1')::integer; v_start_cfg text := COALESCE(current_setting('bookings.start_date', true), '2017-01-01'); @@ -38,4 +39,10 @@ BEGIN PERFORM pg_sleep(1); END LOOP; PERFORM dblink_disconnect(unnest(dblink_get_connections())); + + -- Если данных нет, останавливаемся с понятной ошибкой + SELECT COUNT(*) INTO v_bookings_cnt FROM bookings.bookings; + IF v_bookings_cnt = 0 THEN + RAISE EXCEPTION 'Генератор demodb завершился, но bookings.bookings пустая. Проверьте применение патчей и логи генератора.'; + END IF; END $$; diff --git a/bookings/patches/engine_jobs1_sync.patch b/bookings/patches/engine_jobs1_sync.patch index d2faefb..f85141e 100644 --- a/bookings/patches/engine_jobs1_sync.patch +++ b/bookings/patches/engine_jobs1_sync.patch @@ -1,17 +1,6 @@ --- a/engine.sql +++ b/engine.sql -@@ - SELECT count(*) > 0 - FROM pg_stat_activity - WHERE application_name = 'Airlines processor' -- AND state != 'idle'; -+ AND state != 'idle' -+ AND pid <> pg_backend_pid(); - END; - -@@ - TRUNCATE TABLE gen.stat_jobs; - +@@ -165,16 +165,22 @@ -- disconnect all previously opened connections PERFORM dblink_disconnect(unnest(dblink_get_connections())); @@ -41,3 +30,16 @@ + RAISE NOTICE 'Starting job %: %', i, res; + END LOOP; + END IF; + + -- re-create booking.now() + EXECUTE format( +@@ -230,7 +236,8 @@ + SELECT count(*) > 0 + FROM pg_stat_activity + WHERE application_name = 'Airlines processor' +- AND state != 'idle'; ++ AND state != 'idle' ++ AND pid <> pg_backend_pid(); + END; + + /* diff --git a/bookings/patches/install_drop_if_exists.patch b/bookings/patches/install_drop_if_exists.patch index 0582bfd..bbe459a 100644 --- a/bookings/patches/install_drop_if_exists.patch +++ b/bookings/patches/install_drop_if_exists.patch @@ -1,11 +1,5 @@ --- a/install.sql +++ b/install.sql -@@ -10,7 +10,7 @@ - THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - +@@ -13,1 +13,1 @@ -DROP DATABASE demo; +DROP DATABASE IF EXISTS demo WITH (FORCE); - CREATE DATABASE demo; - \c demo - CREATE EXTENSION btree_gist;