fix(tradein): enable deactivate_stale_avito schedule on prod (#759) #1096

Merged
bot-reviewer merged 1 commit from feat/759-enable-deactivate-schedule into main 2026-06-06 19:08:23 +00:00
Owner

Closes #759 (follow-up к QA-находке 06.06).

Проблема

QA выявил: task deactivate_stale_avito заведён в коде (scheduler.py), но scrape_schedules id=111 в проде имеет enabled=false → задача ни разу не отработала (last_run_id=NULL, 0 прогонов, next_run_at=2026-06-01 в прошлом).

Root cause

Миграция 090_scrape_schedules_seed_deactivate_stale_avito.sql использует ON CONFLICT (source) DO NOTHING. На проде строка source='deactivate_stale_avito' уже существовала с enabled=false (pre-release seed) → DO NOTHING молча пропустил INSERT, оставив enabled=false. Seed-дефолт в 090 уже enabled=true (для fresh DB корректно) — чинить нужно было только существующую прод-строку.

Fix

  • data/sql/100_enable_deactivate_stale_avito.sql — идемпотентный UPDATE ... SET enabled=true, next_run_at=NOW() WHERE source='deactivate_stale_avito' AND enabled=false (guard enabled=false → повторный прогон = 0 строк). Авто-применяется на деплое через _schema_migrations.
  • +7 тестов в tests/test_deactivate_stale_avito.py (existence, source, SET enabled, idempotency, BEGIN/COMMIT, no psycopg-trap, next_run_at reset).

Verify

39 passed (23 existing + 7 new + 9 scheduler), ruff check clean.

После мержа+деплоя задача начнёт деактивировать stale-avito (TTL 10д) в ночном окне 06:00 UTC.

Closes #759 (follow-up к QA-находке 06.06). ## Проблема QA выявил: task `deactivate_stale_avito` заведён в коде (`scheduler.py`), но `scrape_schedules` id=111 в проде имеет `enabled=false` → задача **ни разу не отработала** (`last_run_id=NULL`, 0 прогонов, `next_run_at=2026-06-01` в прошлом). ## Root cause Миграция `090_scrape_schedules_seed_deactivate_stale_avito.sql` использует `ON CONFLICT (source) DO NOTHING`. На проде строка `source='deactivate_stale_avito'` уже существовала с `enabled=false` (pre-release seed) → `DO NOTHING` молча пропустил INSERT, оставив `enabled=false`. Seed-дефолт в `090` уже `enabled=true` (для fresh DB корректно) — чинить нужно было только существующую прод-строку. ## Fix - `data/sql/100_enable_deactivate_stale_avito.sql` — идемпотентный `UPDATE ... SET enabled=true, next_run_at=NOW() WHERE source='deactivate_stale_avito' AND enabled=false` (guard `enabled=false` → повторный прогон = 0 строк). Авто-применяется на деплое через `_schema_migrations`. - +7 тестов в `tests/test_deactivate_stale_avito.py` (existence, source, SET enabled, idempotency, BEGIN/COMMIT, no psycopg-trap, next_run_at reset). ## Verify 39 passed (23 existing + 7 new + 9 scheduler), `ruff check` clean. После мержа+деплоя задача начнёт деактивировать stale-avito (TTL 10д) в ночном окне 06:00 UTC.
lekss361 added 1 commit 2026-06-06 19:01:37 +00:00
fix(tradein): migration 100 — enable deactivate_stale_avito schedule on prod (#759)
All checks were successful
CI / changes (push) Successful in 7s
CI / backend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
af2b540ac2
Root cause: migration 090 used ON CONFLICT (source) DO NOTHING; prod already had
a row source='deactivate_stale_avito' with enabled=false (inserted before 090 ran),
so the INSERT was silently skipped. The scheduler's WHERE enabled=true filter meant
the task never fired (last_run_id=NULL, next_run_at=2026-06-01 expired).

Fix: add migration 100 — idempotent UPDATE SET enabled=true, next_run_at=NOW()
WHERE source='deactivate_stale_avito' AND enabled=false. Safe to re-run: 0 rows
matched once the row is already enabled. Auto-applied on next deploy via
_schema_migrations tracking in deploy-tradein.yml.

Migration 090 seed (enabled=true + ON CONFLICT DO NOTHING) is already correct for
fresh installs — no change needed there.

Tests: 7 new assertions in test_deactivate_stale_avito.py for migration 100
(exists, UPDATE source, SET enabled=true, idempotent guard, BEGIN/COMMIT, no
psycopg trap, next_run_at reset). 39 tests pass total.

Refs #759
bot-reviewer reviewed 2026-06-06 19:08:17 +00:00
bot-reviewer left a comment
Collaborator

APPROVE

Точечный idempotent prod-hotfix QA-находки #759:

  • Номер 100 свободен в tradein-mvp/backend/data/sql/ (проверил дерево main — highest 099, нет коллизии; gendesign 100_tradein_fdw_role.sql — другое дерево).
  • Идемпотентность: UPDATE ... SET enabled=true, next_run_at=NOW() WHERE source='deactivate_stale_avito' AND enabled=false — guard enabled=false → повторный прогон = 0 строк. Non-destructive (одна конкретная disabled-строка).
  • Root-cause верен: 090 ON CONFLICT (source) DO NOTHING оставил pre-seed disabled-строку; fix чинит только её, не трогая 090 seed-default (там уже enabled=true для fresh DB).
  • BEGIN/COMMIT (sql.md); без bind-params → CAST-trap неприменим (тест no_psycopg_trap подтверждает). Авто-apply через _schema_migrations (deploy-tradein.yml).
  • 7 тестов (existence/source/SET enabled/idempotency-guard/BEGIN-COMMIT/no-trap/next_run_at), 39 passed total.

Merge → deploy-tradein verify. NB: для DDL-PR прод-health недостаточен (миграция до compose-up) — подтверждение «schedule enabled» (scrape_schedules.enabled=true для deactivate_stale_avito) за postgres-tradein/qa-окном.

<!-- gendesign-review-bot: sha=af2b540 verdict=approve --> ✅ **APPROVE** Точечный idempotent prod-hotfix QA-находки #759: - **Номер 100 свободен** в `tradein-mvp/backend/data/sql/` (проверил дерево main — highest 099, нет коллизии; gendesign `100_tradein_fdw_role.sql` — другое дерево). - **Идемпотентность**: `UPDATE ... SET enabled=true, next_run_at=NOW() WHERE source='deactivate_stale_avito' AND enabled=false` — guard `enabled=false` → повторный прогон = 0 строк. Non-destructive (одна конкретная disabled-строка). - **Root-cause верен**: 090 `ON CONFLICT (source) DO NOTHING` оставил pre-seed disabled-строку; fix чинит только её, не трогая 090 seed-default (там уже enabled=true для fresh DB). - BEGIN/COMMIT (sql.md); без bind-params → CAST-trap неприменим (тест `no_psycopg_trap` подтверждает). Авто-apply через `_schema_migrations` (deploy-tradein.yml). - 7 тестов (existence/source/SET enabled/idempotency-guard/BEGIN-COMMIT/no-trap/next_run_at), 39 passed total. Merge → deploy-tradein verify. NB: для DDL-PR прод-health недостаточен (миграция до compose-up) — подтверждение «schedule enabled» (`scrape_schedules.enabled=true` для deactivate_stale_avito) за postgres-tradein/qa-окном.
bot-reviewer merged commit 8815239e02 into main 2026-06-06 19:08:23 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1096
No description provided.