[devel] Last outage of packages.altlinux.org. Post Mortem.

Igor Zubkov igor.zubkov на gmail.com
Вт Июл 5 21:33:27 MSK 2016


Hi,

Я хочу рассказать что было, почему пошло не так и что было сделано.

10 мая я начал работу по переводу prometheus2.0 движка с rails 4.2 на
rails 5.0. Задача вполне себе стандартная, перевести проект с одной
версии рельсы на другую. Семь дней назад это был закончено и готово к
выкатыванию. Было немного рефакторинга и много тестов. Было много
обновлено используемых rubygems (в том числе и из upstream git),
добавлено немного фич (я надеюсь их заметили :) ) и общие улучшения
для облегчения поддержки всего этого в будущем.

Потом было стандартное выкатывание. Которое (на удивление) не вызвало
никаких проблем. Веб часть как работала так и работала. И я читал логи
которые мне присылает сам prometheus2.0. Через пару часов я обнаружил
в логах дубликаты пакетов и отключил обновление.

Пока веб часть работала, я выяснял что пошло не так. Post Mortem
показал что не работали Observer'ы. Observer это такой шаблон
проектирования. Это когда один объект сообщает другому что он
изменился и надо выполнить какой-то код. Через механизм обсерверов я
переписал то, как работает импорт пакетов и их удаление. Тесты
показывали что все работает и все бы работать если бы не баг в
реализации rails-observers (это rubygem такой). Эти обсерверы просто
не вызывались. В документации написано, сделайте так и у вас они
заработают. Но как оказалось, не с rails 5. Как результат, каша в
базе.

И так, что было сделано что бы это исправить. Вариант, удалить все и
заимпортить заново не рассматривался. Как слишком долгих и тяжелый.
Это было бы 1-1,5 недели. Я удалил из базы все пакеты которые были
добавлены в базу дважды для одного бранча. Удалил кеш redis (в нем
лежит информация о том, был ли пакет добавлен или нет).
Перегенерировал кеш и снял с паузы обновления. Сейчас ситуация
стабилизировалась, но если Вы увидите что, что-то идет не так, пишите.
Буду исправлять.

Ну и что было сделано что бы такого больше не было. Первое, я
отказался от observers. rails-observers. Наверно их не зря выкинули из
ядра rails в отдельный rubygem. Я (опять) переписал этот код. Второе,
я починил скрипт восстановления кеша redis. Ну и третье, я хотел
написать валидацию что в одном бранче может быть только один пакет с
именем (e.g. glibc), но не сейчас это не возможно. Подробности будет
отдельным письмом.

Спасибо за внимание!

-- 
Igor Zubkov
http://hi.im/ice


Подробная информация о списке рассылки Devel