Posterous theme by Cory Watilo

Filed under: баг

Mojo. Первый критичный баг

Нашел в Mojo критичный баг, а именно – при запуске сервера как демон-префорк (Mojo::Server::Daemon::Prefork), рабочий процесс (чайлд) падает при работе с пайпами; при запуске сервера как демон или CGI такой проблемы нет.
Подробное описание и тест в рассылке (кстати, мне там сделали замечание, как писать об ошибке). Надеюсь, что я доступно объяснил и показал баг, чтобы автор Mojo и/или кто-нибудь другой нашли решение. Сам пока не нашел.

Реальная задача, которая обнаружила это – отправка сообщения через sendmail в обработчике. Скорее всего ошибка в том, что возникает сигнал завершения потомка и он завершает работу воркера, а не пайпа.

Временное решение проблемы. Есть два варианта:

  • отправлять сообщения не сразу, а накапливать в очередь и какой-нибудь внешний процесс должен заниматься отправкой сообщений (плюс такого решения в том, что некоторые сообщения можно отменять)
  • урлы, в обработчиках которых возможна отправка сообщений, направлять не на демон-префорк, а на чистый демон (легко разруливается через nginx-конфиг)
Mojo настолько хорош, что фикс бага должен обязательно найтись :)

UPD: Решение найдено!  github.com/sharifulin/mojo/commit/416b0b15b637ed0fe8d9bf3ca3ba348e16d07f2b


Original post http://sharifulin.livejournal.com/51179.html

Perl. POE. POE::Wheel::Run. Отловил баг

Собрал проект на POE (транспортный протокол пересылки сообщений), при некорректных данных процесс стал вылетать с ошибкой MySQL:
MySQL server has gone away
Очень злая ошибка, т.к. отлавливал очень долго и всему виной POE::Wheel::Run.

Через Wheel::Run запускаю perl'овые sub'ы, в которых при некорректных данных срабатывает die.
Когда  код в сабах был в виде отдельных скриптов, все было ок.
Но возникла необходимость вынести все в пакет, разнести по сабам, чтобы наглядней и не разрозненно по скриптам было, тем более все скрипты  на Perl.

Так вот - при некорректных данных весь процесс (POE-машина) вылетал, а имеено терялся дескриптор с открытой БД MySQL,  причем Perl-овый дескриптор на БД не терялся, а указывал на вполне опеределенный XS-вектор.
Все это проиходжило из-за die'ев происходивших в sub'ах, хотя эти sub'ы запускаются через Wheel::Run.
Решение - либо eval, либо warn + return.

Вот такой вот баг.
По началу я этот баг обходил стороной, перед каждым запросам к БД делал реконнект, но сегодня я решил разобраться в чем было дело :)
Original post http://sharifulin.livejournal.com/23035.html