История одного бага

Как мы уже говорили (и не раз), одна из серьезных техническиx проблем, стоящих перед коммьюнити Fedora, это наша строгая политика насчет обновлений GCC - любое большое обновление ведет за собой пересборку всего дерева пакетов. Повторимся, это очень непросто - с первой попытки порой не получается скомпилировать около 10% пакетов, и мэйнтейнеры самостоятельно или с помощью разработчиков upstream пишут патчи. Между прочим, это порядка тысячи патчей с каждой пересборки, отправленных в upstream проекты, в полном согласии с другим нашим правилом - "уведомлять проекты о том, какие изменения мы вносим". Некоторые маргинальные дистрибутивы пропускают этот этап, считая, что достаточно увеличить номер версии GCC в дистроспецифичном "рецепте сборки", чтоб публично объявить, что "в нашем настраиваемом под себя дистрибутиве уже давно самый свежий GCC, а вы только его включаете". Наоборот, включение нового GCC (да и вообще нового ПО) в Fedora происходит куда более технически грамотно и гораздо более основательно.

Очень мало только просто собрать сам GCC, мало и пересобрать все ПО с новым GCC - надо еще исправить проблемы, которые возникнут. Тут все зависит от квалификации коммьюнити. В нашем сообществе, в отличие от маргинальных дистрибутивов, люди крайне высокой квалификации (и этой магией они с удовольствием поделятся с вами - приходите к нам, на темную сторону Силы! бросайте ваши уютные самосборные дистрибутивы - у нас есть печеньки!) - ключевые участники основных Open Source проектов, люди с богатым опытом разработки, и просто способная молодежь, которая запросто переписывает аудио- и init-подсистемы. Некоторые ошибки исправляются легко, небольшими патчами, что под силу и небольшому коммьюнити вокруг самосборного дистрибутива из нерадивых студентов, у которых полно свободного времени, а некоторые - с большим трудом. Что бывает, когда баг требует квалифицированного вмешательства признанных специалистов мы сейчас расскажем.

Пользователи Fedora на PowerPC / PPC64 столкнулись с неприятной проблемой - Firefox, начиная с версии 10, быстро зависает на первой же странице (или даже при старте, если у вас много дополнений). О проблеме нам сообщил в середине апреля 2012 года инженер IBM и участник Fedora PPC, Gustavo Luiz Duarte (ранее бывший участником коммьюнити Ubuntu). Заявку тут же подобрал мэйнтейнер продуктов Mozilla Foundation в Fedora Martin Stránský и отправил в MoFo bugzilla. Почти сразу там указали на возможную проблему и предложили патч. Несмотря на то, что патч действительно решил одну из ошибок, она оказалась не относящейся к обсуждаемой проблеме.

Спустя еще неделю разработчик Mozilla, Terrence Cole сделал предположение, что ошибка происходит в модуле регулярных выражений. После подтверждения от Martin, что ошибка имеет место лишь на Fedora 17 (на тот момент еще не вышедшая), Gustavo определил, что она возникает лишь в Firefox и Xulrunner, скомпилированных GCC 4.7.0, причем на тот момент, ситуация не изменялась, если использовать последний снапшот GCC (т.е. она не была исправлена). Еще через пару дней, Gustavo сумел создать минимальный test-case, приводящий к ошибке и поиграв с опциями компилятора определил, что если использовать опцию gcc --disable-optimize, то как минимум проходятся unit-тесты. Стало понятно, что проблема определенно в новом GCC, но где именно?

Прошла еще неделя, и Gustavo с коллегами по IBM сумел создать минимальный патч, который позволяет обойти проблему. С этим уже можно обращаться в багтрекер GCC, что и было сделано в тот же день инженером IBM William J. Schmidt. О причине ошибки почти ту же сделал предположение инженер Cavium Networks Andrew Pinski, которое оказалось правильным. Незамедлительно, инженер SuSE/Novell Richard Guenther предложил патч, который проверил William и подтвердил, что он исправляет ошибку. Патч был добавлен в master-бранч на следующий день, а бэкпортирован в ветку 4.7.0 спустя еще неделю. Одновременно с приемом патча в ветку gcc 4.7.0 был успешно пересобран для платформ PowerPC/PPC64 Xulrunner с патчем из bugzilla MoFo, и Firefox наконец-то заработал.

Это, на самом деле, типичная история для нашего сообщества. По результатам многочисленных сборок и разборок были закрыты две ошибки в двух разных известных Open Source проектах и предложен один временный workaround, что пойдет на пользу всем дистрибутивам, а не только Fedora.

Конечно, у нас еще много незакрытых ошибок (нас все еще слишком мало, чтоб реагировать оперативно на все проблемы, плюс на некоторые проблемы мы вообще не можем прореагировать, в том числе и из-за несовершенства нашей инфраструктуры, работа над улучшением которой ведется), конечно, вы можете легко нагуглить и печальные истории о том, как заявки в багзилле не закрываются месяцами и даже годами, но мы и исправляем огромное количество непростых ошибок. Нас действительно порой называют бета-тестерами, пытаясь этим уязвить и почему-то полагая, что сообщать и исправлять ошибки в открытом ПО, это что-то постыдное и оскорбительное (на наш же взгляд, бета-тестеров надо, как минимум, благодарить). Но если уж мы и правда тестеры, то всего опенсорса, в том числе и вашего дистрибутива. То, с чем столкнулись мы, скорее всего вы больше не увидите, получая спустя полгода-год-полтора отлаженное ПО.

А в коммьюнити вашего дистрибутива какие бывают истории? Ну, конечно, если ваш главарь публично сообщает, что ваше коммьюнити не интересуется низкоуровневой разработкой (все, кроме нескучных обоев и дизайна окошек), то может возникают какие-нибудь загадки при переносе кнопок слева направо или справа налево?