fix(uptime): защитить пару устройств и атомарно сохранить результат

This commit is contained in:
Denozordec committed 2026-10-07 15:12:41 +07:00
1 parent 08ea416989
commit a3fcba0d43
9 files changed
+218 -70

No files matched your search

+2
View File
@@ -18,6 +18,7 @@
| PG-4 | Ошибка внутри реального pg_restore | Восстановление не объявляется успешным. Проверить rollback по контрольным бизнес-строкам и схеме, отдельно проверить последовательности | Ошибка процесса, HTTP/UI и независимые запросы до/после |
| PG-5 | Два конкурентных backup/restore запроса | Advisory lock исключает конкурирующее выполнение; второй запрос сообщает конфликт | Два request ID, HTTP-коды, журнал фактических процессов |
| PG-6 | Длительная фоновая запись и UDP-приём во время подготовки restore | Подтверждена остановка всех writers и отсутствие записей в критическом интервале; после операции потребители восстановлены либо показано предупреждение | Процесс/worker lifecycle, счётчики приёма/записей, состояния jobs |
| PG-8 | Ошибка записи speed snapshot/history и потеря commit acknowledgement | Снимок/история атомарны; неизвестный commit не выдаётся за гарантированный rollback и не вызывает автоматический повтор native test | Состояние PG после восстановления соединения, runId, HTTP/UI |
| PG-7 | Неавторизованный пользователь и обычный settings writer | Backup/restore требуют settings admin, отказ происходит до выполнения процесса | 401/403, неизменные контрольные данные, отсутствие pg_dump/pg_restore |
Реализация: [bootstrap](../backend/src/db/bootstrap.ts), [migrations](../backend/src/db/migrate.ts), [0008](../backend/drizzle/0008_alert_outbox_outcomes.sql), [0009](../backend/drizzle/0009_alert_outbox_resolution.sql), [database operation](../backend/src/services/system-database-operation.ts), [restore execution](../backend/src/services/system-database-restore-execution.ts).
@@ -61,6 +62,7 @@ SELECT min(resolution_version), max(resolution_version) FROM alert_outbox;
| ROS-4 | Home→JH и JH↔Exit с асимметричной скоростью | Направления DL/UL соответствуют клиентской стороне; model limits применяются к правильному направлению |
| ROS-5 | OSPF preview → действие → перечитывание templates | Preview соответствует исправленным RX/DL и TX/UL. Применение подтверждается фактическим cost; частичный отказ не становится полным успехом |
| ROS-6 | WireGuard/IPsec/GRE/VXLAN/Firewall/BGP/маршруты | Проблема→устройство→форма→подтверждённое действие→возврат сохраняет контекст. Права и повторное нажатие проверены; фактическая конфигурация и connectivity сверены |
| ROS-8 | Смена пары/удаление speed-пробы до запуска и во время теста | Preflight409 до команды; при поздней смене новый snapshot не перезаписан, actual run сохранён без stale probe association |
| ROS-7 | Удаление/отсутствие доступа/частичный отказ одного устройства | Ошибка не стирает форму, последний снимок и объекты остальных устройств; неизвестные метрики не превращаются в0 |
Для ROS-1/ROS-2 зафиксировать версию RouterOS и очищенный сырой ответ. Строковый status подтверждается по [официальному CLI reference](https://manual.mikrotik.com/docs/cli-reference/tool/bandwidth-test/); несовместимый REST shape требует отдельной коррекции контракта. Тест скорости способен нагрузить канал — длительность и endpoints выбираются для выделенного стенда. Команды и правила маршрутизации этой UX/UI-серией не расширялись.
+1 -1
View File
@@ -1,6 +1,6 @@
# План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-07: 12.4.8 main1176/1176 passed на579e816,34.9min;12.5.0 protocol подготовлен. Следующий12.3.77: привязка speed-пробы к паре устройств и атомарная запись snapshot/history; затем12.4.9 context. Stage12 не завершён, внешняя12.5 не выполнена.
Актуальное продолжение 2026-10-07: 12.4.8main1176/1176 passed;12.3.77 endpoint ownership/atomic speed persistence завершён (25pure/5browser/backend build). Следующий12.4.9: общийcontext. Затем проверить сброс snapshot при изменении пары в каталоге (12.3.78). Внешний protocol12.5 подготовлен, приёмка не выполнена.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-04. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
+1 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации
Актуальное продолжение 2026-10-07: 12.4.8 main1176/1176 passed на579e816,34.9min;12.5.0 protocol подготовлен. Следующий12.3.77: привязка speed-пробы к паре устройств и атомарная запись snapshot/history; затем12.4.9 context. Stage12 не завершён, внешняя12.5 не выполнена.
Актуальное продолжение 2026-10-07: 12.4.8main1176/1176 passed;12.3.77 endpoint ownership/atomic speed persistence завершён (25pure/5browser/backend build). Следующий12.4.9: общийcontext. Затем проверить сброс snapshot при изменении пары в каталоге (12.3.78). Внешний protocol12.5 подготовлен, приёмка не выполнена.
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения.
+9
View File
@@ -860,3 +860,12 @@ Source review: stopScheduler очищает таймеры, stopTrafficFlowListe
2026-10-07. Runtime HEAD579e816:1176/1176passed,0unexpected/skipped/flaky,34.9min. Edge/1worker/retries0/maxFailures12. После старта добавлен только внешний протокол docs5fedf7a; runtime diff579e816→current проверен пустым. [Итог main](ux-ui/acceptance/main-final-2026-10-07.json) записан отдельно от исторического12.4.6. Сырой JSON сохранён в tmp/ux-main-final-20261007.json. Исторические PNG, перегенерированные тестами, восстановлены по проверенному списку tmp/ux-main-regenerated-screens-20261007.json. Чужие skill/AGENTS/config/cache изменения не включены.
Этот общий прогон содержит новые large pool/site captions, direction/scope/nullable POST и6mobile geometry cases. Старый terminal focus race в этом прогоне не повторился. Source review дополнительно нашёл обновление speed probe только по id без endpoint ownership; snapshot update и run insert были отдельными операциями. Следующий небольшой12.3.77 защищает привязку пары и атомарность этих двух записей, без смены RouterOS команд; затем12.4.9 полныйcontext. Внешняя12.5 отдельно.
## 12.3.77 — пара устройств и атомарная запись speed-run
2026-10-07. Preflight сверяет probeId/srcServerId/dstServerId до создания RouterOS client/команды, mismatch/deleted даёт409. UPDATE snapshot success/error содержит id AND source AND destination и RETURNING id. Если пара изменилась/проба удалена за время native test, её snapshot не обновляется, история actual endpoints сохраняется с probeId=null. Snapshot и run insert теперь внутри одной Drizzle transaction для success и failure. Ad-hoc run без probeId сохраняет историю без обновления пробы. Команды, параметры, locks, permissions/schema не менялись.
25 pure/DI tests (9новых persistence: preflight, zero, source/destination/delete race, update/insert/pre-commit failures,ad-hoc;4rate,3status,9scheduler),5browser speed-test (новый409 и прежние ошибки/timeout/nullable/foreignrun), targeted test lint и backend build passed. Pure transaction в памяти моделирует rollback и отказ до commit, не доказывает потерю реального PG commit acknowledgement. Source placement и SQL predicates просмотрены; PG concurrency/transaction semantics требуют12.5.
Полный main1176 относится к579e816 до backend delta; frontend runtime после него не менялся, добавлен1профильный409тест. Следующий12.4.9context; после него12.3.78: adapter каталога сохраняет observations по id, нужно проверить смену пары и local publish после config save. Текущий77защищает пару при запуске/результате, не является CAS полной версии параметров пробы.