fix(mcp): ELK-лейаут блокирует event loop всего сервера — вынести в worker_thread [T0.1] #482

Closed
opened 2026-07-11 01:51:20 +03:00 by agent_vscode · 1 comment
Collaborator

Суть. packages/mcp/src/lib/drawio-layout.ts:152-173 (капы :21-36, координаты — develop@363f20ab, перед работой перегенерировать): elkjs синхронный; Promise.race с setTimeout(5s) — иллюзия: таймер не сработает, пока event loop заблокирован (комментарий в коде сам это признаёт). На in-app хосте layout:"elk" исполняется в процессе основного NestJS по запросу LLM.

Сценарий отказа. Агент подаёт патологический граф у капа 500 узлов → секунды блокировки event loop → зависают ВСЕ HTTP-запросы, SSE-стримы и loopback-вызовы тулов. LLM-триггеримый DoS + усилитель «стрим дёргается».

Правка.

  1. Вынести elk.layout() в worker_thread, создаваемый по требованию; честный таймаут через worker.terminate() — единственный способ прервать синхронный код.
  2. До появления воркера — снизить капы до значений с worst-case в десятки мс.
  3. Убрать вводящий в заблуждение комментарий «can never wedge the server».

Тесты. Unit на terminate-по-таймауту; бенчмарк-гард на worst-case граф у капа (верификация на реальном worst-case графе, не на синтетике).

Зависимости. Нет — независимый мелкий PR.

**Суть.** `packages/mcp/src/lib/drawio-layout.ts:152-173` (капы :21-36, координаты — develop@363f20ab, перед работой перегенерировать): `elkjs` синхронный; `Promise.race` с `setTimeout(5s)` — иллюзия: таймер не сработает, пока event loop заблокирован (комментарий в коде сам это признаёт). На in-app хосте `layout:"elk"` исполняется в процессе основного NestJS **по запросу LLM**. **Сценарий отказа.** Агент подаёт патологический граф у капа 500 узлов → секунды блокировки event loop → зависают ВСЕ HTTP-запросы, SSE-стримы и loopback-вызовы тулов. LLM-триггеримый DoS + усилитель «стрим дёргается». **Правка.** 1. Вынести `elk.layout()` в `worker_thread`, создаваемый по требованию; честный таймаут через `worker.terminate()` — единственный способ прервать синхронный код. 2. До появления воркера — снизить капы до значений с worst-case в десятки мс. 3. Убрать вводящий в заблуждение комментарий «can never wedge the server». **Тесты.** Unit на terminate-по-таймауту; бенчмарк-гард на worst-case граф у капа (верификация на реальном worst-case графе, не на синтетике). **Зависимости.** Нет — независимый мелкий PR.
Author
Collaborator

Заменено итерационным ишью #486 (коммит 1). Закрыто как дубль.

Заменено итерационным ишью #486 (коммит 1). Закрыто как дубль.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#482