Снятие устаревших объявлений работает только там, где есть пересбор #3526

Merged
lekss361 merged 1 commit from fix/deactivate-only-collected-regions into main 2026-09-15 07:32:51 +00:00
Owner

Зачем

Джоба снятия читает молчание как «объявление ушло». Это верно только там, где есть регулярный обход: без пересбора «давно не видели свежим» неотличимо от «мы туда ни разу не ходили после разовой загрузки».

Регулярный сбор сегодня идёт только по Свердловской области. Объявления Москвы и области залиты вручную 10-12 сентября и с тех пор не обновлялись.

Источник Срок жизни Кандидатов разом Когда
ДомКлик 14 дней 40 410 около 26.09
ЦИАН 30 дней 60 174 около 10-12.10
Яндекс 30 дней 24 152 около 12.10

Пострадала бы не только Москва. Аварийный потолок стоит на 15 000, а прогон, упёршийся в него, не трогает ни одной строки. То есть чистка Екатеринбурга встала бы вместе с московской, молча, с одним счётчиком в логе.

Что сделано

Параметр region_codes в джобе, значение по умолчанию — только код 66. Значение None означает «взять умолчание», а не «без фильтра»: отключить региональное ограничение целиком нельзя, можно только перечислить регионы явно.

Предикат добавлен и в предварительный подсчёт кандидатов, и в сам UPDATE во всех трёх сегментных ветках, а значение биндится из одной переменной. Потолок считает ровно то, что снимает.

Гейт здоровья, пол переобхода и размер активного пула намеренно не тронуты: их пороги откалиброваны по источнику целиком.

Строки расписаний менять не нужно

Ни одна строка не содержит ключа region_codes, поэтому после деплоя все действующие джобы сразу работают только по 66. Расширять список нужно вместе с появлением расписания сбора по региону, не раньше.

Известное следствие

Строки с пустым регионом больше не снимаются: их 16 930, активных среди них 211. Это легаторые уральские записи, и полигональный резолв относит 2 462 из них к региону 66, так что бэкфилл региона их вернёт в охват.

Проверено

Новый файл тестов, 15 случаев. Фейковая сессия применяет предикат каждого запроса к одному набору строк, поэтому фильтр, потерянный в одной из веток, даёт расхождение чисел, а не проходит мимо. Покрыто: умолчание снимает только 66, чужие регионы не тронуты, число кандидатов совпадает с числом снятых, сто чужих строк не пробивают потолок в десять, а пустой список и нецелые значения дают ошибку до записи.

pytest -k "deactivate or product_handler" — 210 passed, 1 skipped. ruff check и format чисты.

## Зачем Джоба снятия читает молчание как «объявление ушло». Это верно только там, где есть регулярный обход: без пересбора «давно не видели свежим» неотличимо от «мы туда ни разу не ходили после разовой загрузки». Регулярный сбор сегодня идёт только по Свердловской области. Объявления Москвы и области залиты вручную 10-12 сентября и с тех пор не обновлялись. | Источник | Срок жизни | Кандидатов разом | Когда | |---|---|---|---| | ДомКлик | 14 дней | 40 410 | около 26.09 | | ЦИАН | 30 дней | 60 174 | около 10-12.10 | | Яндекс | 30 дней | 24 152 | около 12.10 | Пострадала бы не только Москва. Аварийный потолок стоит на 15 000, а прогон, упёршийся в него, не трогает ни одной строки. То есть чистка Екатеринбурга встала бы вместе с московской, молча, с одним счётчиком в логе. ## Что сделано Параметр `region_codes` в джобе, значение по умолчанию — только код 66. Значение `None` означает «взять умолчание», а не «без фильтра»: отключить региональное ограничение целиком нельзя, можно только перечислить регионы явно. Предикат добавлен и в предварительный подсчёт кандидатов, и в сам UPDATE во всех трёх сегментных ветках, а значение биндится из одной переменной. Потолок считает ровно то, что снимает. Гейт здоровья, пол переобхода и размер активного пула намеренно не тронуты: их пороги откалиброваны по источнику целиком. ## Строки расписаний менять не нужно Ни одна строка не содержит ключа `region_codes`, поэтому после деплоя все действующие джобы сразу работают только по 66. Расширять список нужно вместе с появлением расписания сбора по региону, не раньше. ## Известное следствие Строки с пустым регионом больше не снимаются: их 16 930, активных среди них 211. Это легаторые уральские записи, и полигональный резолв относит 2 462 из них к региону 66, так что бэкфилл региона их вернёт в охват. ## Проверено Новый файл тестов, 15 случаев. Фейковая сессия применяет предикат каждого запроса к одному набору строк, поэтому фильтр, потерянный в одной из веток, даёт расхождение чисел, а не проходит мимо. Покрыто: умолчание снимает только 66, чужие регионы не тронуты, число кандидатов совпадает с числом снятых, сто чужих строк не пробивают потолок в десять, а пустой список и нецелые значения дают ошибку до записи. `pytest -k "deactivate or product_handler"` — 210 passed, 1 skipped. ruff check и format чисты.
lekss361 added 1 commit 2026-09-15 07:13:46 +00:00
fix(tradein): снимать устаревшие объявления только в регионах с пересбором
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / changes (pull_request) Successful in 14s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m20s
a8add67101
Джоба деактивации трактует молчание как «объявление ушло», что верно
только там, где есть регулярный обход. Регионы 77 и 50 залиты разово
10-12.09 и не обновляются: около 26.09 кандидатами стали бы 40 410 строк
ДомКлика, аварийный потолок max_deactivated сработал бы и остановил
снятие ДЛЯ ВСЕХ регионов, включая ЕКБ (skipped_cap_exceeded не трогает
ни одной строки). Позже то же с cian и yandex.

Параметр region_codes (default_params расписания), дефолт (66,).
Предикат добавлен и в preflight count(*), и в UPDATE во всех трёх
сегментных ветках — потолок считает ровно то, что снимает.
lekss361 merged commit 824de24897 into main 2026-09-15 07:32:51 +00:00
lekss361 deleted branch fix/deactivate-only-collected-regions 2026-09-15 07:32:51 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#3526
No description provided.