|
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 9s
CI / frontend-tests (pull_request) Has been skipped
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 / openapi-codegen-check (pull_request) Successful in 2m22s
CI / backend-tests (pull_request) Successful in 17m12s
devs_key = ",".join(developers) — список джойнился как пришёл, а приходит он прямо
из тела запроса (`developers` в admin_scrape, порядок произвольный). Один и тот же
набор в другом порядке давал ДРУГОЙ ключ: синглтон молча переставал быть
синглтоном, два свипа шли параллельно по одним и тем же разработчикам.
Второе следствие того же корня: force_release_lock строит ключ этой же функцией.
Оператор, снимающий залипший лок и перечисливший разработчиков в ином порядке,
молча не снимал ничего.
sorted(set(...)) закрывает оба случая: порядок и повторы ('A','A' ≡ 'A').
Про переход: формат ключа меняется, поэтому лок, удерживаемый ПРЯМО СЕЙЧАС под
старым ключом, осиротеет и истечёт по TTL. Практического риска нет — kn-свип
не отрабатывает с 28.06 (DOM.РФ отдаёт страницу блокировки, см. #2443).
Тесты сравнивают ЗНАЧЕНИЯ ключей, поэтому красное на origin/main — про разошедшиеся
ключи, а не про отсутствующую функцию:
один набор в двух порядках → два разных ключа → падает
повтор в списке меняет ключ → падает
разные наборы остаются разными — контроль, зелёный с обеих сторон
регион остаётся в ключе — контроль, зелёный с обеих сторон
None/[] по-прежнему дают '*' — контроль, зелёный с обеих сторон
Первый контроль не для симметрии: ловит «починку» через огрубление ключа
(отбросить developers вовсе) — тогда свипы по разным разработчикам блокировали бы
друг друга.
Прогоны: -k "scrape_kn or lock" — 114 passed rc=0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| __init__.py | ||
| backfill_zone_regulations.py | ||
| cbr_macro_sync.py | ||
| connection_capacity_sync.py | ||
| developer_registry_refresh.py | ||
| ekb_krt_sync.py | ||
| ekb_ppt_tep_sync.py | ||
| ekburg_permits_sync.py | ||
| etl_newbuilding_crossload.py | ||
| forecast.py | ||
| full_report.py | ||
| genplan_zones_sync.py | ||
| gisogd_permits_sync.py | ||
| gknspecial_harvest.py | ||
| ird_harvest.py | ||
| izyatie_ocr_ingest.py | ||
| krt_geometry_sync.py | ||
| location_refresh.py | ||
| mv_sales_tracker_refresh.py | ||
| noise_sync.py | ||
| nspd_denorm_backfill.py | ||
| nspd_geo.py | ||
| nspd_sync.py | ||
| objective_etl.py | ||
| okn_objects_sync.py | ||
| opportunity_harvest.py | ||
| pat_subzones_load.py | ||
| planning_harvest.py | ||
| poi_sync.py | ||
| pzz_sync.py | ||
| refresh_analytics.py | ||
| refresh_layout_velocity.py | ||
| refresh_quarter_price_index.py | ||
| reservation_ingest.py | ||
| riasurt_sverdl_harvest.py | ||
| rosstat_macro_sync.py | ||
| scrape_cadastre.py | ||
| scrape_freshness_check.py | ||
| scrape_kn.py | ||
| scrape_kn_catalog_flats.py | ||
| scrape_kn_catalog_objects.py | ||
| scrape_objective.py | ||
| supply_layers_refresh.py | ||
| utility_infrastructure_sync.py | ||
| zone_regulation_refresh.py | ||