openjdk.ruOpenJDK на русском

JEP 279: Improve Test-Failure Troubleshooting

Улучшение диагностики причин сбоев тестов

ОтветственныйIgor Ignatyev
ТипFeature
ОбластьImplementation
СтатусClosed / Delivered
Выпуск9
Обсуждениеhotspot dash dev at openjdk dot java dot net, core dash libs dash dev at openjdk dot java dot net
ТрудоёмкостьXS
ДлительностьXS
Связан сJEP 228: Add More Diagnostic Commands
JEP 102: Process API Updates
РецензентыAleksandre Iline, Brian Goetz
ОдобренMikael Vidstedt
Создан2015/03/20 17:09
Обновлён2024/05/20 14:54
Задача8075621

Аннотация

Автоматически собирать диагностическую информацию, которую можно использовать для дальнейшего поиска причин сбоев и тайм-аутов тестов.

Цели

Для диагностики сбоев и тайм-аутов тестов собирать следующую информацию:

  • О Java-процессах, которые продолжают работать на хосте после сбоя или тайм-аута теста:
    • стеки C и Java;
    • дампы памяти (core dumps; в Windows — минидампы);
    • статистика кучи.
  • Об окружении:
    • запущенные процессы;
    • загрузка процессора и ввода-вывода;
    • открытые файлы и сокеты;
    • свободное место на диске и свободная память;
    • последние системные сообщения и события.

Мы разработаем библиотеку с этой функциональностью и разместим её исходный код рядом с кодом продукта.

Мотивация

Если об окружении, в котором выполнялись тесты, нет никакой информации, выяснить причины нестабильных сбоев тестов трудно. Такие сбои часто зависят от порядка выполнения тестов и от их параллельного выполнения, поэтому воспроизвести их крайне сложно.

Описание

Сейчас в тестовой оболочке (test harness) jtreg есть две точки расширения. Первая — обработчик тайм-аутов, который jtreg запускает, когда время выполнения теста истекает. Вторая — наблюдатель, который реализует шаблон проектирования «наблюдатель» и отслеживает различные события при прогоне тестов. Мы используем эти точки расширения для сбора диагностической информации и разработаем собственные наблюдатель и обработчик тайм-аутов для jtreg.

Информация об окружении и процессах, не относящихся к Java, будет собираться выполнением команд, специфичных для платформы. Информация о Java-процессах будет собираться с помощью доступных диагностических команд, набор которых значительно расширен в JEP 228, например команды print_vm_state, которая собирает информацию, аналогичную файлам hs_err. Собранная информация будет сохраняться вместе с результатами тестов для последующего анализа. Наблюдатель будет собирать информацию по событиям finishedTest, когда тесты завершаются сбоем.

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

Исходный код библиотеки будет размещён в каталоге test репозитория верхнего уровня, а make-файлы будут обновлены так, чтобы собирать её и включать в состав тестовых пакетов.

Тестирование

Мы запланируем регулярное тестирование с использованием этой библиотеки. Когда результаты и выполнение тестов станут стабильными, мы расширим использование библиотеки на другие компоненты.

Риски и допущения

  • Риск зависания некоторых команд. Чтобы свести этот риск к минимуму, каждая команда будет выполняться только в течение отведённого времени, после чего будет прерываться.
  • Нехватка места на диске хоста. Планируется архивировать информацию, ограничить объём сохраняемой информации и проверять свободное место на диске перед сбором информации.
  • Инструменты недоступны на платформе или хосте. Если инструмент недоступен на конкретном хосте или платформе, команды, зависящие от отсутствующих инструментов, будут пропускаться, а в файл журнала будет добавляться предупреждение. Другое возможное решение — загружать нужные инструменты из известного репозитория инструментов.
  • Исчерпание системных ресурсов. Некоторые сбои могут приводить к исчерпанию разных видов системных ресурсов (процессор, память, место на диске и т. д.) или быть вызваны блокировкой ресурсов. Поскольку в таких ситуациях запустить команды для сбора информации не получится, выполнение команд будет пропускаться, чтобы не допустить дальнейшей деградации системы.
  • Получение деревьев процессов в Java. Для получения дерева процессов в Java нужен новый API для работы с процессами, описанный в JEP 102. Использование тестируемого JDK в качестве стабильного JDK (то есть JDK, в котором работает тестовая оболочка jtreg) может повлиять на результаты тестов. Чтобы снизить этот риск, мы разработаем альтернативную реализацию дерева процессов. Эта реализация упростит бэкпортирование этого проекта в JDK 8.