From 87aa5bdf0748c4e0a8dc66337f01bc9cfd0c348b Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 29 Aug 2026 19:13:54 +0500 Subject: [PATCH] =?UTF-8?q?fix(tradein):=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=B2=D0=B8=D1=82=D1=80=D0=B8=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=B1=D0=B5=D0=B7=20lock=5Ftimeout=20=E2=80=94=20CI-=D0=B3?= =?UTF-8?q?=D0=B5=D0=B9=D1=82=20#2752=20=D0=BA=D1=80=D0=B0=D1=81=D0=BD?= =?UTF-8?q?=D0=B5=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обе миграции создавали индекс без транзакции и без SET LOCAL lock_timeout. Гейт scripts/check-migration-lock-timeout.py это и поймал: ::error 276_landing_showcase_deals.sql:: блокирующий DDL без lock_timeout (CREATE INDEX IF NOT EXISTS idx_landing_showcase_deals_computed_at ...) Обе обёрнуты в BEGIN + SET LOCAL lock_timeout = '5s' + COMMIT по образцу 272_houses_region_code.sql. Локально гейт зелёный: «проверено новых миграций: 31». --- tradein-mvp/backend/data/sql/276_landing_showcase_deals.sql | 6 ++++++ tradein-mvp/backend/data/sql/277_landing_showcase_runs.sql | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/tradein-mvp/backend/data/sql/276_landing_showcase_deals.sql b/tradein-mvp/backend/data/sql/276_landing_showcase_deals.sql index 7a363ca1..2674773b 100644 --- a/tradein-mvp/backend/data/sql/276_landing_showcase_deals.sql +++ b/tradein-mvp/backend/data/sql/276_landing_showcase_deals.sql @@ -21,6 +21,10 @@ -- части ДКП-строк пуст. Правило проекта: нет величины — пишем NULL, а не -- правдоподобное значение. Отбор в задаче ранжирует такие строки ниже, но не -- запрещает их: пустая витрина хуже витрины без района. +BEGIN; +-- Конвенция проекта (#2752): блокирующий DDL идёт под lock_timeout, иначе он +-- встанет в очередь за чужой сессией и утащит за собой запросы приложения. +SET LOCAL lock_timeout = '5s'; CREATE TABLE IF NOT EXISTS landing_showcase_deals ( id bigserial PRIMARY KEY, @@ -42,3 +46,5 @@ CREATE TABLE IF NOT EXISTS landing_showcase_deals ( -- остаются для сверки «что показывали неделю назад». CREATE INDEX IF NOT EXISTS idx_landing_showcase_deals_computed_at ON landing_showcase_deals (computed_at DESC); + +COMMIT; diff --git a/tradein-mvp/backend/data/sql/277_landing_showcase_runs.sql b/tradein-mvp/backend/data/sql/277_landing_showcase_runs.sql index f0aa708c..f150a8e9 100644 --- a/tradein-mvp/backend/data/sql/277_landing_showcase_runs.sql +++ b/tradein-mvp/backend/data/sql/277_landing_showcase_runs.sql @@ -20,6 +20,10 @@ -- -- computed_at совпадает со строками батча: задача пишет строки и этот итог -- ОДНОЙ транзакцией, а now() в Postgres — время начала транзакции. +BEGIN; +-- Конвенция проекта (#2752): блокирующий DDL идёт под lock_timeout, иначе он +-- встанет в очередь за чужой сессией и утащит за собой запросы приложения. +SET LOCAL lock_timeout = '5s'; CREATE TABLE IF NOT EXISTS landing_showcase_runs ( id bigserial PRIMARY KEY, @@ -36,3 +40,5 @@ CREATE TABLE IF NOT EXISTS landing_showcase_runs ( CREATE INDEX IF NOT EXISTS idx_landing_showcase_runs_computed_at ON landing_showcase_runs (computed_at DESC); + +COMMIT;