From 9264b6636aefde0b55e69b6b0c2670f8075ffff9 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Wed, 7 Oct 2026 22:55:33 +0700 Subject: [PATCH] =?UTF-8?q?chore(test):=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D1=82=D1=8C=20=D0=BD=D0=B0=D1=81=D1=82=D0=BE=D1=8F?= =?UTF-8?q?=D1=89=D0=B8=D0=B9=20UDP=20collector=20=D0=B8=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ux-ui-external-acceptance.md | 2 +- docs/ux-ui-plan.md | 2 +- docs/ux-ui-progress.md | 14 +++++- docs/ux-ui-stage-12.md | 14 +++++- docs/ux-ui-test-server.md | 4 ++ .../acceptance/netflow-worker-2026-10-07.json | 50 +++++++++++++++++++ 6 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 docs/ux-ui/acceptance/netflow-worker-2026-10-07.json diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index f19bf435..ef4d3549 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -25,7 +25,7 @@ Приложение использует pg_dump -Fc и pg_restore --single-transaction --clean --if-exists. Транзакционный режим описан в [документации PostgreSQL](https://www.postgresql.org/docs/current/app-pgrestore.html). Проверка пяти байтов PGDMP проверяет заголовок, но не полноту и не доверие к архиву. Для rollback нужен сценарий с ошибкой исполнения restore, а не только отказ HTTP до его начала. -В локальном блоке12.5.8 добавлено ожидание текущих scheduler jobs с закрытием admission, но этот код ещё не развёрнут на стенде673e5ba. Блок12.5.9 добавляет отдельный graceful shutdown worker для database operation, serial flush, pool.end и обязательные acknowledgement/exit0. Локальные protocol tests прошли, но настоящий collector/UDP/длительный SQL ещё не проверен и код не развёрнут. Ручные API writers, вспомогательные writers и экземпляры на других хостах также требуют отдельного контроля. PG-6 остаётся открытым до наблюдаемого подтверждения; восстановление стенда выполняется после его получения. Реальные тесты backend, способные очищать таблицы, запускаются только против выделенной тестовой БД. +В локальном блоке12.5.8 добавлено ожидание текущих scheduler jobs с закрытием admission, но этот код ещё не развёрнут на стенде673e5ba. Блок12.5.9 добавляет отдельный graceful shutdown worker для database operation, serial flush, pool.end и обязательные acknowledgement/exit0. Локальные protocol tests и настоящий isolated collector/UDP/blocked SQL drain12.5.10 прошли: [evidence](ux-ui/acceptance/netflow-worker-2026-10-07.json). Основной код на стенде ещё не обновлён; app-wide quiescence этим не подтверждена. Ручные API writers, вспомогательные writers и экземпляры на других хостах также требуют отдельного контроля. PG-6 остаётся открытым до наблюдаемого подтверждения; восстановление стенда выполняется после его получения. Реальные тесты backend, способные очищать таблицы, запускаются только против выделенной тестовой БД. После bootstrap достаточно следующих запросов чтения для начальной проверки, без вывода секретов: diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 1772e66d..a0d5d3df 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,6 +1,6 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-07: блок12.5.9 завершён локально — отдельный shutdown NetFlow закрывает UDP, сериализует flush, закрывает worker PG pool и требует acknowledgement плюс штатный exit. Четыре lifecycle tests, database HTTP/JWT и build прошли. На стенде остаётся source673e5ba. Следующий12.5.10 — реальные worker/UDP/длительная запись в выделенной проверочной БД и контроль остальных writers; PG-6/restore остаются открытыми. +Актуальное продолжение 2026-10-07:12.5.10 завершён в границах настоящего isolated NetFlow collector: UDP→SQL, ожидание blocked write, освобождение socket до drain, ack/exit0, delta1500bytes и0worker connections подтверждены. Основной runtime остаётся673e5ba. Следующий12.5.11 — admission/drain ручных API и аудит вспомогательных writers перед restore. PG-6 целиком ещё открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-07. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 7a854a72..84ff3bf0 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-07: блок12.5.9 завершён локально — отдельный shutdown NetFlow закрывает UDP, сериализует flush, закрывает worker PG pool и требует acknowledgement плюс штатный exit. Четыре lifecycle tests, database HTTP/JWT и build прошли. На стенде остаётся source673e5ba. Следующий12.5.10 — реальные worker/UDP/длительная запись в выделенной проверочной БД и контроль остальных writers; PG-6/restore остаются открытыми. +Актуальное продолжение 2026-10-07:12.5.10 завершён в границах настоящего isolated NetFlow collector: UDP→SQL, ожидание blocked write, освобождение socket до drain, ack/exit0, delta1500bytes и0worker connections подтверждены. Основной runtime остаётся673e5ba. Следующий12.5.11 — admission/drain ручных API и аудит вспомогательных writers перед restore. PG-6 целиком ещё открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -34,6 +34,18 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в описанных границах:12.3.83,main1186/1186,context221/221. Этап остаётся в работе: стенд12.5.1–3 развёрнут,bootstrap/smoke проверены;остальные сценарии12.5 не выполнены. | +## 12.5.10 — настоящий NetFlow collector: UDP и ожидание SQL перед выходом (2026-10-07) + +На161.104.46.222 запущен временный docker compose run --rm --no-deps backend с актуальным compiled dist изsourcef8da3e0; основной backend/frontend не пересоздавались. DATABASE_URL в памяти тестового процесса/унаследованного worker ограничен отдельной mmapp_acceptance_20261007. Приложение не подключено к этой БД. [Очищенный отчёт](ux-ui/acceptance/netflow-worker-2026-10-07.json), SHA256 архива и worker JS совпали с локальными файлами. Секреты/дампы не передавались в репозиторий. + +Настоящий traffic-flow-collector-worker слушал127.0.0.1:4749 только внутри временного контейнера; синтетический NetFlowv5 datagram отправлен через реальный UDP socket, exporter map сопоставил127.0.0.1→server1. SQL-транзакция удерживала ACCESS EXCLUSIVE lock traffic_flow_settings, независимый pg_stat_activity наблюдатель увидел Lock/relation в проверочной БД. После shutdown и500ms worker ещё не вышел/stop promise не завершился. Успешная привязка нового probe socket к4749 доказала освобождение UDP до завершения SQL drain. После ROLLBACK lock полученыshutdown-complete иexit0; pool connections worker после выхода0. + +Независимый SQL сравнил baseline1500bytes и итог3000bytes/20packets в двухflow rows: ровно+1500bytes одного тестовогоdatagram. Baseline обязателен: предыдущая неуспешная попытка оставила тестовую запись в этой выделенной БД. Первые попытки не завершили сценарий: staging mount /app/acceptance не находил backend dependency dotenv (выявлено после добавления диагностики); mount перенесён в /app/backend/acceptance. Затем10сек ожидания lock истекли; окончательный запуск дал initial tick2500ms перед observation и прошёл всеassertions. Это исправления harness, продуктовый код в этом блоке не менялся. + +Проверочная БД теперь содержит синтетические flow rows и изменённые collector counters; прежнее сравнение12.5.7 описывает состояние на момент backup, не нынешнюю идентичность БД. Временный контейнер удалён штатным--rm, worker остановлен. Основной /health ok/version1.0.0-test.673e5ba/alivefalse/boundfalse, оба serverID/IP иuptime retention14 сохранены. КонфигурацияCHR/traffic-flow на маршрутизаторах не менялась. + +Принята частьPG-6 для isolated collector/drain, не весь app-wide сценарий. Ручные API writers, вспомогательные writers, параллельные экземпляры и API restore не проверены; новый код ещё не развёрнут в основном приложении. Следующий12.5.11 — admission/drain ручных запросов и аудит остальных писателей, затем deployment и полнаяPG-6/PG-3/4 проверка. Локальный коммит безpush. + ## 12.5.9 — подтверждённая остановка NetFlow worker перед операцией с БД (2026-10-07) Добавлена отдельная IPC команда shutdown для database operation; обычный stop остальных потребителей не подменён. Worker прекращает приём datagrams, закрывает UDP socket/таймер, ждёт принудительный flush без prune и pool.end(), затем отправляет shutdown-complete и закрывает parentPort. Основной процесс требует и acknowledgement, и exit0. Timeout30сек, неподтверждённый exit и ошибки отменяют database operation без принудительного terminate. Неуспешный stop остаётся latched: попытка restart не уничтожает worker с неподтверждёнными записями и возвращает существующее listenerError предупреждение. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index edc678a2..d3477f18 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-07: блок12.5.9 завершён локально — отдельный shutdown NetFlow закрывает UDP, сериализует flush, закрывает worker PG pool и требует acknowledgement плюс штатный exit. Четыре lifecycle tests, database HTTP/JWT и build прошли. На стенде остаётся source673e5ba. Следующий12.5.10 — реальные worker/UDP/длительная запись в выделенной проверочной БД и контроль остальных writers; PG-6/restore остаются открытыми. +Актуальное продолжение 2026-10-07:12.5.10 завершён в границах настоящего isolated NetFlow collector: UDP→SQL, ожидание blocked write, освобождение socket до drain, ack/exit0, delta1500bytes и0worker connections подтверждены. Основной runtime остаётся673e5ba. Следующий12.5.11 — admission/drain ручных API и аудит вспомогательных writers перед restore. PG-6 целиком ещё открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -1030,3 +1030,15 @@ Flush engine сериализован общей очередью: заверш Проверки: четыре новых pure/protocol tests прошли — ack без exit недостаточен, exit без ack/exit1/timeout отменяют операцию, final flush ждёт in-flight rejected flush, настоящий worker thread подтверждает shutdown и штатно выходит. Это worker fixture для транспорта, не настоящий UDP collector с PostgreSQL. Новый тест включён в test:system-database. Существующие7pure database tests, HTTP/JWT scripts прошли; contracts/backend build после окончательных изменений passed; diff-check passed. Тесты с очисткой БД не запускались. PG-6 ещё открыт: тест с реальным collector/UDP и длительным SQL, конкурирующие ручные API writers, вспомогательные writers и другие экземпляры не проверены. flushPending сохраняет прежнюю best-effort обработку ошибок отдельных хранилищ: подтверждение означает завершение попыток записи/закрытие pool, а не гарантию сохранения каждого packet. Новый код пока не развёрнут, активный source673e5ba; данные стенда/RouterOS не менялись, API restore основной БД не запускался. Следующий12.5.10 — запуск текущего collector в выделенной mmapp_acceptance_20261007, наблюдение UDP/SQL drain и безопасный контроль остальных writers перед развёртыванием/PG-3/4. Локальный коммит без push. + +## 12.5.10 — настоящий NetFlow collector: UDP и ожидание SQL перед выходом (2026-10-07) + +На161.104.46.222 запущен временный docker compose run --rm --no-deps backend с актуальным compiled dist изsourcef8da3e0; основной backend/frontend не пересоздавались. DATABASE_URL в памяти тестового процесса/унаследованного worker ограничен отдельной mmapp_acceptance_20261007. Приложение не подключено к этой БД. [Очищенный отчёт](ux-ui/acceptance/netflow-worker-2026-10-07.json), SHA256 архива и worker JS совпали с локальными файлами. Секреты/дампы не передавались в репозиторий. + +Настоящий traffic-flow-collector-worker слушал127.0.0.1:4749 только внутри временного контейнера; синтетический NetFlowv5 datagram отправлен через реальный UDP socket, exporter map сопоставил127.0.0.1→server1. SQL-транзакция удерживала ACCESS EXCLUSIVE lock traffic_flow_settings, независимый pg_stat_activity наблюдатель увидел Lock/relation в проверочной БД. После shutdown и500ms worker ещё не вышел/stop promise не завершился. Успешная привязка нового probe socket к4749 доказала освобождение UDP до завершения SQL drain. После ROLLBACK lock полученыshutdown-complete иexit0; pool connections worker после выхода0. + +Независимый SQL сравнил baseline1500bytes и итог3000bytes/20packets в двухflow rows: ровно+1500bytes одного тестовогоdatagram. Baseline обязателен: предыдущая неуспешная попытка оставила тестовую запись в этой выделенной БД. Первые попытки не завершили сценарий: staging mount /app/acceptance не находил backend dependency dotenv (выявлено после добавления диагностики); mount перенесён в /app/backend/acceptance. Затем10сек ожидания lock истекли; окончательный запуск дал initial tick2500ms перед observation и прошёл всеassertions. Это исправления harness, продуктовый код в этом блоке не менялся. + +Проверочная БД теперь содержит синтетические flow rows и изменённые collector counters; прежнее сравнение12.5.7 описывает состояние на момент backup, не нынешнюю идентичность БД. Временный контейнер удалён штатным--rm, worker остановлен. Основной /health ok/version1.0.0-test.673e5ba/alivefalse/boundfalse, оба serverID/IP иuptime retention14 сохранены. КонфигурацияCHR/traffic-flow на маршрутизаторах не менялась. + +Принята частьPG-6 для isolated collector/drain, не весь app-wide сценарий. Ручные API writers, вспомогательные writers, параллельные экземпляры и API restore не проверены; новый код ещё не развёрнут в основном приложении. Следующий12.5.11 — admission/drain ручных запросов и аудит остальных писателей, затем deployment и полнаяPG-6/PG-3/4 проверка. Локальный коммит безpush. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index e0e0b88d..ec124b2b 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -81,3 +81,7 @@ ssh -N -L 3000:127.0.0.1:3000 -L 8000:127.0.0.1:8000 root@161.104.46.222 ## Локальный NetFlow shutdown patch — 2026-10-07 В12.5.9 добавлена командаshutdown с подтверждением послеflush/pool.end и ожиданиемexit0;4pure/protocol tests, database HTTP/JWT и build passed. На стенд ещё не развёрнуто, source673e5ba остаётся активным. Реальный collector/UDP/длительный SQL и прочие writers требуют отдельной проверки12.5.10 в mmapp_acceptance_20261007. Подтверждение завершения flush не гарантирует сохранение всех пакетов при прежних best-effort ошибках engine; PG-6/restore не приняты. + +## Настоящий isolated collector — 2026-10-07 + +[12.5.10 evidence](ux-ui/acceptance/netflow-worker-2026-10-07.json): актуальныйworker изf8da3e0 в отдельном временном контейнере, выделеннаяmmapp_acceptance_20261007, UDP4749 только внутриконтейнера. Shutdown дождался blocked SQL/освободилsocket, ack+exit0, delta1500bytes,0worker connections. Контейнер удалён--rm. ПроверочнаяБД теперь содержит синтетические flow rows/counters; архив12.5.7 остаётся исходным snapshot. Основной runtime673e5ba/healthok/serverID1–2/retention14 сохранён. App-wide PG-6/ручные API writers/restore ещё открыты; следующий12.5.11 — аудит и admission остальных писателей. diff --git a/docs/ux-ui/acceptance/netflow-worker-2026-10-07.json b/docs/ux-ui/acceptance/netflow-worker-2026-10-07.json new file mode 100644 index 00000000..6102cc82 --- /dev/null +++ b/docs/ux-ui/acceptance/netflow-worker-2026-10-07.json @@ -0,0 +1,50 @@ +{ + "date": "2026-10-07", + "source": "f8da3e0", + "database": "mmapp_acceptance_20261007", + "mode": "isolated real collector with synthetic NetFlow v5 over real UDP", + "mainDatabaseTouched": false, + "baseline": { + "bytes": "1500" + }, + "blockedQueries": [ + { + "wait_event_type": "Lock", + "wait_event": "relation" + } + ], + "waitedForBlockedWrite": true, + "udpSocketClosedBeforeDrain": true, + "acknowledgedAndCleanExit": true, + "persistedFlow": { + "rows": 2, + "bytes": "3000", + "packets": "20" + }, + "workerConnectionsAfterExit": 0, + "limits": [ + "Dedicated collector process only; app-wide/manual writer admission not tested", + "Synthetic UDP exporter; no RouterOS traffic-flow configuration changed", + "No API restore performed; production-style multi-instance quiescence not accepted" + ], + "archiveSha256": "104a047247681193d75daff82892b9f5111f6082df9273078cc4f4f2c3e43b0c", + "workerSha256": "3d5ef90c63699e6a449faa680f23ced8196b183e59fb8c3d26d22d7568842b9e", + "attempts": [ + "Initial worker could not resolve dotenv from /app/acceptance; diagnostic rerun exposed missing dependency", + "Mount moved under /app/backend/acceptance; first 10s lock observation timed out", + "Final rerun recorded baseline and allowed initial tick before observation; delta1500bytes and exit0 confirmed" + ], + "healthAfter": { + "status": "ok", + "timestamp": "2026-10-07T15:53:54.621Z", + "version": "1.0.0-test.673e5ba", + "eventLoopDelayMs": 20, + "flowWorker": { + "alive": false, + "bound": false, + "pendingSize": 0, + "dropped": 0, + "packetsReceived": 0 + } + } +} \ No newline at end of file