fix(tradein): data-layer tail A2+B+C — trgm index, FDW options, matview refresh (Refs #769) #804
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#804
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/769-data-layer-a2b2c"
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?
Что
Хвост #769 (A1+D смержены в #798; E отложен — geo-radius client-facing risk). Закрывает A2/B/C — все низкорисковые, не клиентские.
A2 (#10, index) —
086_deals_address_trgm_index.sqldeals.addressне имел GIN-trgm индекса → seq-scan на street-match.pg_trgm+CREATE INDEX IF NOT EXISTS deals_address_trgm_idx ... gin(address gin_trgm_ops). Идемпот, plainCREATE INDEX(txn-safe).B (#13, FDW) —
087_fdw_server_options.sqlgendesign_remoteбезfetch_size/use_remote_estimate→ плохое планирование 6.8M-row FDW import.DO-block читаетpg_foreign_server.srvoptions→ ADD-or-SET для каждой опции (идемпотентно при любом prior-state),RAISEесли сервера нет.C (#14, matview) —
scheduler.py+088_*.sqlНаходка:
listings_search_mvактивно читаетсяsearch_query.py(/api/v1/search) но никогда не рефрешился (refresh_search_matview.pyсуществует, в beat/scheduler отсутствовал → search гниёт). Fix:trigger_refresh_search_matview_run(по образцуasking_to_sold_ratio, через advisory-lock_claim_run#750,run_in_executorдляREFRESH CONCURRENTLYс autocommit) + dispatch-branch + seedscrape_schedules(03:00–04:00 UTC ночь, до rosreestr-import;ON CONFLICT DO NOTHING).Проверки
ruff clean. SQL — BEGIN/COMMIT, идемпотентны. Post-deploy QA: EXPLAIN deals street-query → Bitmap Index Scan; FDW remote-estimate; matview refresh по расписанию.
Отложено
E (#17 geocode city-centroid флаг) — нужна схема
geo_precision+ правка ST_DWithin radius-match (client-facing) → отдельный follow-up.Refs #769
✅ APPROVE — data-layer tail #769 (A2+B+C), все три части низкорисковые и корректные.
Проверено:
scheduler.py—trigger_refresh_search_matview_runточно повторяет паттернtrigger_asking_to_sold_ratio_run(#648):_claim_run→run_in_executorдля sync DB-op →mark_done/mark_failedчерез отдельнуюSessionLocal. Все хелперы существуют, callablerefresh_search_matview()существует (app/tasks/refresh_search_matview.py:23), dispatch-branch добавлен без правки существующих веток.086trgm — идемпотентно (IF NOT EXISTS), txn-safe (plain CREATE INDEX оправдан — deals наполняется батчами, стартует малой).087FDW — DO-block ADD-or-SET противpg_foreign_server.srvoptions, идемпотентен при любом prior-state,RAISEесли сервера нет.088seed —ON CONFLICT (source) DO NOTHING,next_run_atна завтра 03:00 UTC (паттерн 078/079/082, не стреляет на деплое).Anti-regression: estimator pricing/dedup не тронуты (#755/#753 соблюдены), self-extending файлы не затронуты, секретов нет.
Advisory (не блокер):
task.add_done_callback(lambda t: t.exception() ...)— exception уже ловится внутри_run(), callback всегда вернёт None. Безвредный boilerplate.Post-deploy QA (auto-qa): EXPLAIN deals street-query → Bitmap Index Scan; matview refresh по расписанию 03:00 UTC.