Voydevich
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 за допомогою ШІ та перевірено на відповідність джерелу. Точні формулювання дивіться в оригіналі. Як ми працюємо