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
6.6 KiB
6.6 KiB
04. Queue Engine И Протокол
Статус: не начат. Зависимости: 02, 03; ID/WAL интегрируются с 05.
Цель
Все операции над заданиями исполняются владельцем соответствующей tube; frontend сохраняет протокольный контракт без общей памяти и центрального глобального планировщика.
Задачи
- Отделить parsing/response I/O от мутаций queue engine в
prot.c. Сохранить существующие heaps, списки и однотредовое исполнение владельца, не переписывая их на shared memory. - Удалить зависимость владения job от локального
Conn*frontend. Использовать логическую сессию и локальное owner-side состояние. - Сделать глобальные реестры и счётчики локальными роли процесса. Один процесс-владелец может сохранить process-local globals, если они не смешиваются с frontend; не вводить контейнеры/абстракции без необходимости.
- Перенести delayed jobs, pause и TTR в timer loop владельца. Согласовать reserve timeout и safety margin с управлением сессиями из 03.
- Реализовать маршрутизацию всех команд по таблице; подтвердить завершение каждой команды только в согласованной точке состояния/WAL.
- Сохранить проверки числовых диапазонов, framing body/CRLF, ошибки нехватки памяти и порядок ответов.
- Реализовать явно выбранную реакцию на multi-watch reserve. Не запретить промежуточный
watch targetпри подключении сdefault.
Маршрутизация
| Команды | Источник владельца/исполнитель |
|---|---|
use, watch, ignore |
Имена tubes и изменение ссылок сессии |
put, peek-ready, peek-delayed, peek-buried, kick |
Текущая use tube |
reserve, reserve-with-timeout |
Единственная наблюдаемая tube плюс состояние deadlines сессии |
peek, delete, release, bury, touch, reserve-job, kick-job, stats-job |
Job ID; не текущая use/watch tube |
pause-tube, stats-tube |
Явно указанное имя |
list-tube-used, list-tubes-watched |
Подтверждённое состояние сессии frontend |
list-tubes, stats |
Сбор данных владельцев/frontend по определённому контракту |
quit |
Закрытие клиентской сессии и cleanup у всех затронутых owners |
Совместимость
- Priority/FIFO сохраняются внутри tube. Текущий
job_pri_lessиспользует(priority, id); изменение ID требует доказательства эквивалентности или отдельного ordering field. reserve-jobне привязывается к watch list и сохраняет выбор ready/buried/delayed job по ID.deleteчужой reserved job недопустим, но ready/delayed/buried jobs доступны по прежним правилам.release,bury,touchпроверяют сессию-владельца резервации.- Disconnect возвращает резервации в очереди; timeout во время передачи body не приводит к use-after-free.
useне меняет watch list, аignoreне освобождает уже зарезервированные jobs.- Недоступный owner не трактуется как пустая tube или отсутствующий job. Ответы
NOT_FOUND/TIMED_OUTне подменяют отказ инфраструктуры.
Статистика
- Суммировать только действительно аддитивные job/command counters с определённым владельцем каждого счётчика.
- Connection/producer/worker/waiting counters считают уникальные клиентские сессии, а не IPC endpoints и не число owner-side копий.
list-tubesобъединяет реальные объекты, не все возможные имена, и не дублируетdefault.- Определить согласованность snapshot при конкурентных изменениях. Не обещать атомарный глобальный snapshot без реализации барьера.
- Для
pid, serverid,uptime,rusage-*и binlog-полей применять контракт 01. Номера сегментов разных WAL нельзя бессмысленно суммировать.
Приёмка
- Каждая строка routing table имеет успешные, ошибочные и межвладельческие тесты, где применимо.
- Полный lifecycle ready/reserved/delayed/buried и приоритеты проходят на двух и более owners.
useодной tube при watch другой корректен, в том числе если owners различны.- Один consumer может держать несколько jobs; смена watch/
reserve-jobне теряет старые резервации. - Нулевая/положительная задержка reserve, safety margin,
touch, pause/unpause и disconnect соответствуют выбранному контракту. - Гонки reserve vs delete, timeout vs touch, pause vs reserve и disconnect vs reply не дают двух активных резерваций или двух ответов.
- Исходный
make checkиспользуется по матрице совместимости 01. Если выбран отдельный legacy-режим, он проходит весь прежний набор, включая multi-tube; ограничение нового режима не переносится на legacy.
Точки Кода
prot.c, conn.c, job.c, tube.c, dat.h, testserv.c, testjobs.c, testheap.c.