fix(ptica): ключ синглтон-лока kn-свипа зависит от множества, а не от порядка (#2464) #2970
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
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#2970
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2464-lock-key-order"
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?
Пункт эпика #2464:
scrape_kn.py:42.Дефект
Список джойнится как пришёл, а приходит он прямо из тела запроса (
developersвadmin_scrape, порядок произвольный).Один и тот же набор в другом порядке даёт другой ключ:
Синглтон молча перестаёт быть синглтоном: два свипа идут параллельно по одним и тем же разработчикам.
Второе следствие того же корня
force_release_lockстроит ключ этой же функцией. Оператор, снимающий залипший лок и перечисливший разработчиков в ином порядке, молча не снимает ничего.Правка
sorted(set(...))— закрывает и порядок, и повторы ('A','A' ≡ 'A').Про переход
Формат ключа меняется, поэтому лок, удерживаемый прямо сейчас под старым ключом, осиротеет и истечёт по TTL. Практического риска нет: kn-свип не отрабатывает с 28.06 — DOM.РФ отдаёт страницу блокировки (#2443).
Тест
Сравнивает значения ключей, поэтому красное на
origin/main— про разошедшиеся ключи, а не про отсутствующую функцию:Первый контроль не для симметрии: ловит «починку» через огрубление ключа (отбросить
developersвовсе) — тогда свипы по разным разработчикам блокировали бы друг друга.Прогоны
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>