fix(ptica): lock_timeout в миграции 189 + разбор SQL в репетиции (#2464)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m11s
CI / backend-tests (pull_request) Successful in 17m21s
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m11s
CI / backend-tests (pull_request) Successful in 17m21s
Гейт репозитория поймал упущение: блокирующий DDL без lock_timeout (#2752). Без него ALTER TABLE встаёт в очередь за чужой сессией и уводит за собой запросы приложения. Добавлен `SET LOCAL lock_timeout = '5s'` первой строкой после BEGIN. Пять секунд — про ОЖИДАНИЕ блокировки, не про работу: таблица 297 строк, сам DDL мгновенный. Не дождались — миграция падает, а не подвешивает прод. Заодно переписан разбор миграции в тесте-репетиции. Он дважды подвёл на мне же: 1) пропускал куски, начинающиеся с «--» → терялся DELETE, репетиция падала на ADD CONSTRAINT; 2) резал SQL по «;», встреченной ВНУТРИ текста комментария. Теперь комментарии снимаются ДО разбиения на выражения — оба класса закрыты. Прогон: tests/sql/test_2464_land_reservation_dedup.py — 6 passed rc=0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
0792e34172
commit
03926a5d0b
2 changed files with 15 additions and 9 deletions
|
|
@ -190,15 +190,15 @@ def test_migration_body_runs_on_a_prod_shaped_replica(db) -> None:
|
|||
|
||||
sql = _MIGRATION.read_text()
|
||||
body = sql[sql.index("BEGIN;") + len("BEGIN;") : sql.rindex("COMMIT;")]
|
||||
for chunk in body.split(";"):
|
||||
# Срезаем ведущие строки-комментарии, а не пропускаем кусок целиком:
|
||||
# DELETE в миграции идёт СРАЗУ ПОСЛЕ комментария, и наивный пропуск
|
||||
# «кусков, начинающихся с --» молча выкинул бы его. Первая версия этого
|
||||
# теста так и сделала — репетиция упала на ADD CONSTRAINT, и это было
|
||||
# ровно то, что она и должна ловить.
|
||||
stmt = "\n".join(
|
||||
ln for ln in chunk.splitlines() if ln.strip() and not ln.lstrip().startswith("--")
|
||||
).strip()
|
||||
# Комментарии снимаем ДО разбиения на выражения — иначе точка с запятой внутри
|
||||
# комментария разрежет SQL посередине. Обе ловушки этот тест уже ловил на себе:
|
||||
# сперва пропуск куска, начинающегося с «--» (потерялся DELETE, репетиция упала
|
||||
# на ADD CONSTRAINT), затем «;» в тексте комментария.
|
||||
code = "\n".join(
|
||||
ln for ln in body.splitlines() if ln.strip() and not ln.lstrip().startswith("--")
|
||||
)
|
||||
for chunk in code.split(";"):
|
||||
stmt = chunk.strip()
|
||||
if stmt:
|
||||
db.execute(text(stmt))
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,12 @@
|
|||
|
||||
BEGIN;
|
||||
|
||||
-- #2752: блокирующий DDL обязан иметь lock_timeout — иначе ALTER TABLE встанет в
|
||||
-- очередь за чужой сессией и уведёт за собой запросы приложения. Таблица крошечная
|
||||
-- (297 строк), сам DDL мгновенный; пять секунд — про ОЖИДАНИЕ блокировки, не про
|
||||
-- работу. Не дождались — миграция падает, а не подвешивает прод.
|
||||
SET LOCAL lock_timeout = '5s';
|
||||
|
||||
-- 1) Дедуп: оставляем строку с минимальным id в каждой группе.
|
||||
DELETE FROM land_reservation a
|
||||
USING land_reservation b
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue