Files
install b9bcb01322
Continous integration / Tests (push) Canceled after 0s
Testing clients / Build beanstalkd (push) Canceled after 0s
Continous integration / Docker build (push) Canceled after 0s
Testing clients / Test Pheanstalk PHP (push) Canceled after 0s
Testing clients / Test Greenstalk Python (3.9) (push) Canceled after 0s
Testing clients / Test Pystalk Python (3.10) (push) Canceled after 0s
Initialize
2026-10-15 10:52:58 +05:00

6.2 KiB
Raw Permalink Blame History

06. Supervisor И Эксплуатация

Статус: не начат. Зависимости: 02, 03; итоговая интеграция 04, 05.

Цель

Сделать многопроцессный сервер управляемым сервисом с единой конфигурацией, предсказуемым запуском и корректной реакцией на сбои.

Задачи

  1. Ввести supervisor, запускающий owners/frontend с явно заданными ролями, slot IDs, generations и топологией.
  2. Обеспечить один активный процесс на slot. Перед заменой подтвердить завершение прежнего процесса; PID reuse не является подтверждением его идентичности.
  3. Организовать startup barrier: проверка config, locks и топологии, восстановление WAL, IPC handshake, готовность к клиентским операциям.
  4. Корректно закрывать лишние унаследованные listening/client/IPC/WAL descriptors. Не наследовать живые jobs/сессии через fork как способ совместного владения данными.
  5. Интегрировать выбранные CLI/config, -u, TCP/Unix sockets и socket activation. Проверить границы привилегий и права на IPC/data root.
  6. Реализовать согласованную обработку SIGUSR1 drain и остановки. Drain прекращает новые put во всём логическом сервере, но не означает остановку выдачи существующих jobs.
  7. Ввести restart policy с ограничением частоты/числа попыток и диагностикой. Во время недоступности slot его имена не передаются другим owners.
  8. Определить поведение при смерти supervisor: оставшиеся процессы не продолжают принимать изменения без действующей управляющей эпохи; исключить запуск второго независимого сервера поверх тех же slots.
  9. Обеспечить логи с role/slot/generation и метрики IPC backlog, restart count, owner readiness, загрузки и WAL ошибок.
  10. Обновить эксплуатационную документацию: запуск, проверки готовности, restart, drain, резервное копирование/восстановление при остановленном сервере, запрет несогласованного изменения карты.

Матрица Отказов

Событие Требуемое свойство
Смерть frontend Владельцы освобождают ссылки/ожидания/резервации всех его сессий; старое поколение больше не принимается
Смерть owner Затронутые сессии обрабатываются по контракту 01; очистка связанных сессий у остальных owners; перезапуск только того же slot
Разрыв IPC Неизвестные результаты не повторяются автоматически; endpoint/session fencing исключает поздние изменения
Смерть supervisor Нет бесконтрольных orphan writers и двух поколений активного сервера
Ошибка WAL Явная диагностика и согласованная политика отказа; не тихое переключение на другой owner
SIGUSR1 Глобально согласованный drain, включая owners/frontend, перезапущенные во время drain
Остановка Нет новых принятых операций после согласованного барьера; bounded shutdown, явная политика незавершённых ответов

Приёмка

  • Запускаются один и несколько owners/frontend с одинаковой картой; ошибочная конфигурация не оставляет работающих дочерних процессов и занятых sockets.
  • Попытка второго владельца slot отвергается как с WAL, так и без WAL.
  • Kill/restart владельца сохраняет маршруты остальных tubes и не создаёт дубль упавшего slot.
  • Затронутые клиенты получают документированный отказ/закрытие, а не NOT_FOUND из-за отсутствующего процесса.
  • После перезапуска во время drain новый процесс не принимает put до снятия/завершения drain по контракту.
  • Проверены supervisor/frontend/owner crashes, частичный startup failure, сигналы и отсутствие утечек FD/zombie-процессов.
  • Запуск и платформы соответствуют выбранной в 01 политике перехода. Если legacy сохраняется, его startup и поддерживаемые платформы не регрессируют; неподдерживаемая платформа нового режима выдаёт явный отказ сборки/запуска.
  • Обновлены руководство и примеры запуска; статусы/метрики позволяют определить недоступный slot без анализа PID по догадкам.

Точки Кода

main.c, serv.c, net.c, util.c, платформенные event backends, Makefile, doc/beanstalkd.ronn, README.md, testserv.c.