A validator that failed the self-check of an address no longer gets that address
again in the current round (ClaimNextQueued skips it); the validator itself stays
in service and takes all other addresses. The verdict fail is set when the number
of failed self-checks of an address reaches settings.self_check_max_attempts
(1..50, default 5, independent of the number of validators); max_retries and
retry_count are no longer used for self-check. If every working validator has
already failed the address, a new round starts and the exclusions lapse.
Migration 0012: ip_self_check_failures (permanent history per registry address),
ip_queue.sc_failures and sc_round_start_cycle (cycle_id is used instead of
attempt_number, which restarts when a queue row is recreated), the setting.
db.FailSelfCheck does it in one transaction; re-submission starts a new series.
API: self_check_max_attempts in GET/PUT /admin/config/orchestrator,
self_check_failed_on in /admin/ips/{ip} and /admin/registry/{ip}. Dashboard: the
field on /settings and the line "Self-check не прошёл на: ..." on the address
pages. Docs, plan and summary in docs/changes/.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
4.9 KiB
4.9 KiB
Итог: повтор после сбоя self-check — на другом валидаторе
План: 2026-10-04_08-01_self-check-exclude-validator-plan.md. Статус: код написан и проверен (gofmt, build, vet, test, миграция на копии боевой БД); стенд не пересобирался.
Что изменено
- Миграция
0012_self_check_failures.sql(версия схемы 12): таблицаip_self_check_failures(история сбоев по адресу, поregistry_id, без внешних ключей); колонкиip_queue.sc_failuresиip_queue.sc_round_start_cycle; настройкаsettings.self_check_max_attempts(DEFAULT 5, допустимо 1…50). db.ClaimNextQueuedпропускает адреса, на которых этот валидатор провалил self-check в текущем раунде; адрес остаётся в очереди для других валидаторов.db.FailSelfCheck(одна транзакция): записывает сбой, увеличиваетsc_failures; приsc_failures >= потолка—fail; иначе возвращает адрес в очередь без измененияretry_count; если рабочих валидаторов без сбоя в раунде не осталось — новый раунд. Позднее сообщение (адрес не у этого валидатора) —ErrInvalidState.- Оркестратор (
SelfCheckResult→failSelfCheck): потолок читается из настроек на каждом сбое. События:retry_or_fail(приfail— со списком валидаторов) иvalidator_excluded.max_self_check_retriesне используется (поле в YAML осталось). SubmitIPsAs/SeedQueue: перепостановка начинает новую серию (sc_failures = 0, новый раунд); история остаётся.- API:
GET/PUT /admin/config/orchestrator— полеself_check_max_attempts(400 вне 1…50; в PUT необязательно);self_check_failed_onвGET /admin/ips/{ip}(фильтр по запуску) иGET /admin/registry/{ip}(все запуски). - Дашборд: поле «Потолок провалов self-check на адрес» на
/settings; строка «Self-check не прошёл на: …» на/ips/{ip}и/registry/{ip}. - Документы:
USAGE.md(новый раздел «Повтор после сбоя self-check»),API.md,DASHBOARD.md,ADMIN_CLEANUP.md(новая таблица в сценариях 3.1 и 3.4),README.md.
Отступления от плана
- Раунд хранится как
sc_round_start_cycle(номерcycle_id), а неsc_round_start_attempt:attempt_numberсбрасывается при удалении и повторном создании строки очереди, а история остаётся — новая строка получила бы чужие исключения.cycle_idпо адресу не повторяется. Поведение для оператора то же. - Значение 5 задано
DEFAULT 5колонки (покрывает и существующую строкуsettings, и чистую установку),config.goне менялся. - В
PUTпотолок необязателен — старые клиенты без поля не получают 400. validator_excludedне пишется, если начался новый раунд (исключение сразу теряет силу).
Проверки
gofmt -l— пусто;go build ./...,go vet ./...— без ошибок;go test ./...— все пакетыok. Две проверки версии схемы в старых тестах миграций (TestMigration0010…,TestMigration0011…) обновлены с 11 на 12.- Новые тесты: БД (
queries_selfcheck_test.go), оркестратор (сценарий на трёх валидаторах, потолок, один и два валидатора, смена настройки), API, дашборд. - Миграция
0012на копии боевой БД: версия 11 → 12,self_check_max_attempts = 5, повторное открытие без ошибок, таблица сбоев пуста.
Выкладка
Не выполнена. Нужны пересборка и перезапуск control-api и admin-dashboard по процедуре (проверка пустой очереди, копия БД, тег отката pre-self-check-exclude, миграция 0012); на стенде в очереди сейчас 6489 адресов done, queued нет.