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.