fix(migration-133): dedup via cascade-delete, not child re-point (prod hotfix) #1914
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1914
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/migration-133-offer-price-history-collision"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🔥 Прод-хотфикс — миграция 133 (из #1912) падала на проде, блокируя tradein-деплой (deployed SHA застрял на
4eaf184, 133 отсутствует в_schema_migrations).Корень
offer_price_historyимеетUNIQUE (listing_id, change_time), но re-point-UPDATE переносил ВСЕ loser-строки на keeper →duplicate key violation. Deep-review валидировал на throwaway schema subset, где этого констрейнта не было. Хуже: keeper-onlyNOT EXISTSтоже недостаточен — несколько loser'ов одной группы несут одинаковый change_time → коллизия МЕЖДУ loser'ами в одном UPDATE (та же дыра у listings_snapshots PK + external_valuations partial-UNIQUE).Фикс
Убраны все data-child re-point'ы; полагаемся на
FK ON DELETE CASCADE(все 4 FK =confdeltype='c') — дети loser'ов удаляются автоматически при DELETE loser. Оставлен только collision-freemerged_intore-point. Это дубли ОДНОГО оффера → keeper хранит свою полную историю, история loser-дублей избыточна.Прод dry-run (
BEGIN…ROLLBACK, ничего не записано)9840 дубль-групп на проде (дедуп реально нужен). Миграция 133 нигде не применялась (нет в
_schema_migrations) → правка in-place безопасна.Урок: destructive-миграцию валидировать dry-run'ом на РЕАЛЬНОЙ прод-схеме (
BEGIN…ROLLBACK), а не на hand-built subset — subset пропустил реальный констрейнт.Refs #1773