RedisЩо нового в Redis 8.12: діагностика та збір звітів при таймаутах тестів
Реліз присвячений покращенню Tcl-тестового фреймворку: збір детальних crash-репортів серверів та стек-трейсів клієнтів у разі зависання тесту замість раптового завершення процесу.
Реліз від 28 вересня 2026 · оновлено 9 листопада 2026
Головне
- Генерація повного crash report сервера через SIGSEGV у разі таймауту тесту
- Збір стек-трейсів Tcl-клієнтів за допомогою сигналу SIGUSR1 та пакета Tclx
- Коректна обробка процесів-зомбі через функцію is_running замість перевірки kill -0
- Зміни стосуються виключно Tcl-тестів і не впливають на продакшн-рантайм
Коротко
Реліз Redis 8.12 зосереджений на вдосконаленні діагностики зависань у тестовому середовищі Tcl. Замість раптового завершення всіх процесів за допомогою SIGKILL у разі спрацьовування --timeout, фреймворк попередньо збирає діагностичні дані: crash-звіти серверів та стек-трейси клієнтів. Зміни обмежені механізмом обробки таймаутів у тестах і не впливають на поведінку сервера в продакшні чи рантайм.
Нові можливості
Збір діагностики сервера під час таймауту
Раніше, коли клієнти не демонстрували прогресу впродовж часу --timeout, функція test_server_cron лише виводила останній зафіксований стан клієнтів і примусово завершувала всі сервери через force_kill_all_servers за допомогою SIGKILL. Оскільки прапорець --dump-logs спрацьовував тільки у разі падіння тесту або виникнення помилки, зависання залишалося без логів.
Тепер тестовий сервер збирає докази перед завершенням роботи:
- Генерація crash report для серверів: Активні інстанси Redis зі списку
::active_serversотримують сигналSIGCONT(якщо процес було зупинено), а потімSIGSEGV. СигналSIGSEGVініціює викликprintCrashReport: сервер логує стек-трейс кожного зі своїх потоків, інформаціюINFO, перелік клієнтів і конфігурацію, після чого завершується. Оскільки обробник виконується на тому потоці, який перехопив сигнал, звіт формується навіть за заблокованого event loop. - Друк звітів із логів: Логи серверів знаходяться за їхнім pid у директорії
tests/tmp. Процедураdump_crash_reportвиводить вміст логу, починаючи з 10 рядків перед заголовкомREDIS BUG REPORT STARTдля контексту, або останні 256 КБ логу, якщо звіт про падіння відсутній. - Виправлення очікування процесів: Оскільки сервери є дочірніми процесами клієнта, що завис, після падіння вони можуть залишатися зомбі-процесами. Перевірка
kill -0сприймала їх як живі; тепер замість цього стан перевіряється черезis_running(за допомогоюps), яка інтерпретує зомбі як завершені процеси.
Збір стек-трейсів клієнтів
Тестовий фреймворк збирає інформацію про конкретне місце тесту, на якому зупинився кожен клієнт:
- Фіксація рядка зупинки: Завершення серверів через crash report розблоковує з'єднання клієнта: з'єднання обривається, генерується помилка, а верхньорівневий обробник клієнта фіксує змінну
$::errorInfo(Tcl стек-трейс із зазначенням конкретного рядка коду). - Підтримка SIGUSR1 через Tclx: Клієнти передають свій OS pid під час події
readyта опціонально повідомляють про можливістьsigusr1-traceза наявності пакета Tclx. Клієнтам, які залишилися заблокованими, надсилається сигналSIGUSR1. Завдяки командіsignal errorіз Tclx сигнал перетворюється на Tcl-помилку та формує стек-трейс. Це перериває блокуючі операції читання, тривалі викликиafterта цикли опитування. Використання Tclx є необов’язковим: без нього стек-трейс клієнта просто не формується. - Послідовність збору: Збір звітів серверів виконується суворо до збору стек-трейсів клієнтів. Якщо розблокувати клієнт раніше, процедура
start_serverзавершить роботу потрібних інстансів до фіксації їхніх звітів.
Виправлення та покращення
- Запобігання реентрантності під час таймауту: Змінна
::in_timeout_reportблокує повторний запускtest_server_cron, усуває фатальну обробку пакетів під час генерації звіту та запобігає збоям у роботі обробника. - Виправлення обробки відключення клієнта: Усунуто помилку
expected non-negative integerу процедуріread_from_test_client. Раніше вона виникала у випадках, коли клієнт відключався під час формування звіту та виконання event loop: тепер некоректна довжина більше не викликає зациклення чи збою обробника.
Огляд підготовлено автоматично за офіційними release notes за допомогою ШІ та перевірено на відповідність джерелу. Точні формулювання дивіться в оригіналі. Як ми працюємо