avva: (Default)
[personal profile] avva
Пару слов о баге, который проявился у многих пользователей в последние сутки-двое, при котором невозможно было посмотреть свою ленту друзей.

Будет интересно программистам, знающим Перл (и не знающим тоже, впрочем).

Баг включался вот при каких обстоятельствах. У кого-то на компьютере неправильно проставлена дата. Но не просто в будущем или в прошлом (это, кстати, бывает очень часто), а настолько всё плохо, что бывают невозможные даты. Скажем, 31-е апреля или 30-е февраля.

Когда сервер ЖЖ принимает дату записи от клиента (или от джаваскрипта пользовательского браузера), он в принципе должен проверять её корректность. В прошлом или в будущем она вполне может быть, это не запрещается, но невозможной быть не должна. Эта провека не срабатывала (почему? ещё проверяется), и невозможная дата попадала в базу данных. Это, однако, до поры до времени никому не мешало. Всё равно ленты друзей, например, сортируются по серверной дате, а не той, которую даёт клиент. Дата, которую даёт клиент, используется только для сортировки главной страницы журнала, а также календарных страниц; и ещё её показывают всюду, ясно.

Итак, в процессе постройки ленты друзей эти даты не используются для сортировки; но они всё равно обрабатываются для показа. В процессе обработки они переводятся из внутреннего формата базы данных MySQL в некий другой формат. Для этого вызывается перловская функция Time::Local::timegm(), которая берёт набор чисел - год, месяц, день, час, минута, секунда - и возвращает число секунд, прошедшее с полуночи первого января 1970-го года до этого времени (так называемое Unix epoch time). Потом это число в свою очередь преобразовывается в нужный формат, позже.

Что случилось? Вчера все серверы, обслуживающие запросы ЖЖ, были все переведены с версии Перла 5.6 на версию 5.8. В обоих версиях Перла фунцкия timegm(), если ей не нравятся переданные ей данные, "умирает" с ошибкой. Однако в перле 5.6 проверка правильности даты, в частности числа дня в месяце, несколько, гм, упрощённая:

croak "Day '$_[3]' out of range 1..31" if $_[3] > 31 || $_[3] < 1;

(т.е. число, в данном случае $_[3], проверяется только на >31 и <1)

В перле 5.8 проверку ужесточили:
my $md = $MonthDays[$month];
++$md unless $month != 1 or $year % 4 or !($year % 400);
croak "Day '$mday' out of range 1..$md" if $mday > $md or $mday < 1;

Т.е. число $mday сравнивается не с 31, а с правильной предельной датой для данного месяца, хранящейся в массиве MonthDays. И даже високосные годы учтены (вторая строка).

Поэтому внезапно вчера Перл начал умирать, когда ему передают невозможные даты записей типа 31-го апреля. Т.к. со стороны кода ЖЖ никто такую возможность не учитывал, код ЖЖ в таком случае тоже умирал и обработчик самой внешней оболочки ловил это падение, не понимал, в чём дело, и выдавал пользователю невнятную ошибку вида "Technical difficulties".

Конечно, перед тем как перевести серверы на Perl 5.8, всё проверяли, но эту проблему не отловили, т.к. настолько неверные даты встречаются очень-очень редко (зато когда всё же встречаются, то сразу хлопаются френд-ленты всех друзей данного юзера или сообщества, поэтому очень заметно). Собственно, довольно долгое время часть серверов ЖЖ, примерно четверть, бежали под Perl 5.8, и у них случалась эта проблема, значит; но т.к. пользователи, после нажатия Reload в браузере, попадали на другой случайный сервер, который с большой вероятностью был Perl 5.6 и всё показывал, они считали, что это просто проблемы с нагрузкой или чем-нибудь таким.
Page 1 of 3 << [1] [2] [3] >>

Date: 2005-04-14 06:07 pm (UTC)
From: [identity profile] alesk.livejournal.com
Какой красивый баг, однако

Date: 2005-04-14 06:09 pm (UTC)
From: [identity profile] squadette.livejournal.com
понятно, почему от пользователя прячут gory details, но зачем от девелопера её прятать?

у нас, например, работает мониторилка error_log'ов, которая их шлёт в список рассылки, и если туда что-то приходит, то этот вопрос рассматривается и фиксится. Чрезвычайно полезно.

Date: 2005-04-14 06:15 pm (UTC)
From: [identity profile] humbly.livejournal.com
познавательно, спасибо)

Date: 2005-04-14 06:17 pm (UTC)
From: [identity profile] dimrub.livejournal.com
Вообще, очень здорово, во-первых, что ты об этом рассказываешь, во-вторых - как.

Я сегодня тоже интересный баг имел (точнее, баг имел меня). Но я не уверен, что этот баг интересен кому-то, кроме меня :).

Date: 2005-04-14 06:27 pm (UTC)
From: [identity profile] toyvo.livejournal.com
Клёво.
Интересно, а как может быть передана неисправная дата? Я не верю что ОС дата может быть неисправной, ни в Виндах, ни в Юниксолинухах.
Вероятно в каком-то клиенте есть глюк, который позволяя выставлять кастом дату для постинга не проверяет её на корректность.

Date: 2005-04-14 06:32 pm (UTC)
From: [identity profile] valshooter.livejournal.com
В жж очень много постят из скриптов программно по жжшным протоколам. Причём постят все кому не лень, это очень просто сделать.

А бага конечно красивая. Её фиг поймаешь слёту.

Всё-таки в вебе часто бывает ощущение, что "само прошло" . F5/Ctrl+F5/restart browser - и нет ошибки

Date: 2005-04-14 06:33 pm (UTC)
From: [identity profile] avva.livejournal.com
Это не специально. В большинстве случаев даже и юзер видит ошибку. Например, на этой записи (это она положила френд-ленты двух тысяч подписчиков [livejournal.com profile] msk_consumer, кскати. Сама юзерша ни в чём не виновата. Ну, подумаешь, живёт в 2010-м году. Гостья из будущего ;)) выдавалась ошибка [Error: Day '31' out of range 1..30 at /home/lj/cgi-bin/ljlib.pl line 2092 @ w30], которая помогла мне очень быстро найти проблему. Трудность была в том, чтобы эту запись найти, т.к. календари не работали итп.

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

Date: 2005-04-14 06:33 pm (UTC)
From: [identity profile] jerom.livejournal.com
Очень интересно и познавательно. А пользователь сделал это специально? Я слабо представляю в какой ОС и как это можно сделать...

Date: 2005-04-14 06:34 pm (UTC)
From: [identity profile] jerom.livejournal.com
А, выше [livejournal.com profile] valshooter пояснил про протокол и кривого клиента.

Date: 2005-04-14 06:35 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет, пользователь живёт в будущем и в своём дневнике, см. ссылку выше в моём ответе [livejournal.com profile] squaddette. Явно не специально. Да и это только один пример, на весь ЖЖ за сутки таких штук 10-15 наверное набралось самых разных, в суппорте была куча обращений.

Date: 2005-04-14 06:36 pm (UTC)
From: [identity profile] toyvo.livejournal.com
а-фи-геть!
Это чисто ЖЖшный глюк!
Если из веб интерфейса ручками исправить дату нового поста на некорректную, то ЖЖ её честно завает.
Правьте короче:)

Date: 2005-04-14 06:37 pm (UTC)
From: [identity profile] valshooter.livejournal.com
Это одна из версий просто =)

Date: 2005-04-14 06:37 pm (UTC)
From: [identity profile] toyvo.livejournal.com
http://www.livejournal.com/users/toyvo/40964.html
Вот. Из Веб интерфейса, без каких-либо проблем.

Date: 2005-04-14 06:38 pm (UTC)
From: [identity profile] avva.livejournal.com
(сейчас эта запись помечена 30-го июня, но это уже Брэд баг исправил, точнее залатал. Она 31-го июня на самом деле в базе данных)

Date: 2005-04-14 06:38 pm (UTC)
From: [identity profile] valshooter.livejournal.com
Кстати по-моему не до конца пофиксили багу. Если на вашей ссылке (http://www.livejournal.com/community/msk_consumer/2121670.html) нажать на ссылку "30" (http://www.livejournal.com/community/msk_consumer/2010/06/30/), то будет пустой день.

Date: 2005-04-14 06:38 pm (UTC)
From: [identity profile] toyvo.livejournal.com
Если смотреть по ссылке - 30.04, если с фронтпейджа журнала, то 31.

Date: 2005-04-14 06:39 pm (UTC)
From: [identity profile] avva.livejournal.com
Исправим, исправим ;)

Date: 2005-04-14 06:39 pm (UTC)
From: [identity profile] valshooter.livejournal.com
С проблемами:
http://www.livejournal.com/users/toyvo/2005/04/31/
http://www.livejournal.com/users/toyvo/2005/04/30/

Date: 2005-04-14 06:40 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет, это правильно. Запись-то на самом деле 31-го, это код делает вид, что она 30-го, чтобы не падать. Заплатка такая временная. См. http://www.livejournal.com/community/msk_consumer/2010/06/31/ .

Date: 2005-04-14 06:40 pm (UTC)
From: [identity profile] avva.livejournal.com
Или лучше http://www.livejournal.com/community/msk_consumer/2010/06/ ,
т.к.
http://www.livejournal.com/community/msk_consumer/2010/06/31/
всё ещё падает ;) видимо, в другом месте те же функции вызываются.

Date: 2005-04-14 06:41 pm (UTC)
From: [identity profile] toyvo.livejournal.com
Не, "без проблем" в смысле - дало запостить.
Понятно, что после этого система глючит как не в себя:))
Кстати, в френд-ление уже вроде всё ОК - пишет 30.04

Date: 2005-04-14 06:41 pm (UTC)
From: [identity profile] valshooter.livejournal.com
и календарь у тойво упал =) надо ещё латать (http://www.livejournal.com/users/toyvo/calendar)

Date: 2005-04-14 06:42 pm (UTC)
From: [identity profile] valshooter.livejournal.com
там с заплаткой вообще теперь классно глючит =)

Date: 2005-04-14 06:44 pm (UTC)
From: [identity profile] toyvo.livejournal.com
Хнык.

Date: 2005-04-14 06:48 pm (UTC)
From: [identity profile] squadette.livejournal.com
не, 404 Not Found -- это отдельный вопрос, они естественно никому не интересны (хотя у нас 404 Not Found, приехавшая с нашего же сайта, считается ошибкой -- для ЖЖ это явно не подходит...). Они тихо возвращают 404.

но вот die внутри обработчика страницы -- их отслеживать надо.
Page 1 of 3 << [1] [2] [3] >>

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 12:21 am
Powered by Dreamwidth Studios