test:int: устранить утечку open handles (сейчас замаскировано forceExit) + разобраться, почему destroyTestDb зависал #382
Reference in New Issue
Block a user
Delete Branch "%!s()"
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?
Контекст
После фикса ESM-трансформа
@docmost/prosemirror-markdownв jest-конфигах (коммит8e125799) 4 ранее не парсившиеся интеграционные спеки впервые начали реально выполняться:share-alias-one-per-page.int-spec.tsduplicate-page-shared-attachment.int-spec.tspage-recursive-cte-cycle-guard.int-spec.tspage-move-cycle.int-spec.tsИ сразу всплыло, что суита
pnpm --filter server test:int(apps/server/test/jest-integration.json,maxWorkers: 1) не может завершиться: все тесты проходят (66 passed), после чего в логеJest did not exit one second after the test run has completed.и ~14 минут простоя до отсечки по 20-мин таймауту джобы.CI-прогон, где это видно: https://github.com/vvzvlad/gitmost/actions/runs/28755705055 (джоба
test / test, шагRun server integration tests).До этого фикса те 4 спеки падали на этапе загрузки (
SyntaxError), модули не поднимались — поэтому процесс выходил и зависания не было. То есть течь была латентной и вскрылась, когда спеки заработали.Что уже сделано (временный пластырь)
Быстрый фикс (в develop), чтобы разблокировать CI:
apps/server/test/jest-integration.json→"forceExit": true— jest принудительно выходит после прогона.apps/server/test/integration/db.ts→destroyTestDb()теперь закрывает пул черезsql.end({ timeout: 5 })(ограниченный shutdown) вместоKysely.destroy()— потому чтоai-chat-stream.int-spec.tsпадал: егоafterAll(await destroyTestDb()) упирался в 60-сек таймаут хука, т.к. postgres.js.end()без таймаута ждёт незавершённые соединения вечно.forceExitмаскирует первопричину — открытые handles остаются, просто процесс убивается при выходе. Это тех-долг, его и надо закрыть по-настоящему.Что нужно сделать (нужен стенд с Postgres + Redis)
Локально/на стенде поднять pg+redis (creds для теста:
docmost/docmost_dev_pw, maintenance-БДdocmost, redis :6379 — см.apps/server/test/integration/db.tsиglobal-setup.ts) и запустить:(в
jest-integration.jsonвременно убратьforceExit, иначе jest выйдет до отчёта об утечке).Найти и закрыть источники висящих handles. Подозреваемые:
ai-chat-stream.int-spec.ts—makeRealResponse()поднимает реальныйhttp.createServer+ сокет-клиент и гоняет реальный стрим с heartbeat-таймерами (AiChatService.stream). Проверить, что heartbeat-интервал и сокеты гарантированно закрываются, и разобраться, какое соединение из пула оставалось занятым, из-за чегоdestroyTestDb()зависал (это отдельный симптом той же течи).app.close()/teardown.Definition of Done
pnpm --filter server test:intзавершается сам, БЕЗforceExit, за ~90с (jest не пишет «did not exit»).--detectOpenHandlesчист."forceExit": trueизjest-integration.json(пластырьdestroyTestDbс таймаутом можно оставить как защиту).ai-chat-streamстабильно зелёный без 60-сек залипания вafterAll.Связанные артефакты
8e125799apps/server/test/jest-integration.json,apps/server/test/integration/db.ts,apps/server/test/integration/ai-chat-stream.int-spec.ts