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 и всё показывал, они считали, что это просто проблемы с нагрузкой или чем-нибудь таким.

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: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ей из-за того, что кто-то ссылку испортил или ещё чего), что трудно отличить зерна от плевел. А когда появляется новый реальный баг, из-за уровня траффика ошибки, с ним связанные, даже если бы их можно было отделить от остальных, текут таким густым потоком, что никакая рассылка не выдержит. Нужно что-то умное, что умело бы группировать ошибки и отсекать мусор, никто не хочет это писать, наверное.

(no subject)

From: [identity profile] squadette.livejournal.com - Date: 2005-04-14 06:48 pm (UTC) - Expand

(no subject)

From: [personal profile] stas - Date: 2005-04-14 09:17 pm (UTC) - Expand

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

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

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 пояснил про протокол и кривого клиента.

(no subject)

From: [identity profile] valshooter.livejournal.com - Date: 2005-04-14 06:37 pm (UTC) - Expand

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

(no subject)

From: [identity profile] valshooter.livejournal.com - Date: 2005-04-14 06:38 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2005-04-14 06:40 pm (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2005-04-14 06:40 pm (UTC) - Expand

(no subject)

From: [identity profile] valshooter.livejournal.com - Date: 2005-04-14 06:41 pm (UTC) - Expand

(no subject)

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

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

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2005-04-14 06:39 pm (UTC) - Expand

(no subject)

From: [identity profile] shufel.livejournal.com - Date: 2005-04-15 06:38 am (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2005-04-15 08:34 am (UTC) - Expand

(no subject)

From: [identity profile] shufel.livejournal.com - Date: 2005-04-15 11:56 am (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2005-04-15 11:58 am (UTC) - Expand

(no subject)

From: [identity profile] shufel.livejournal.com - Date: 2005-04-15 12:41 pm (UTC) - Expand

(no subject)

From: [identity profile] valshooter.livejournal.com - Date: 2005-04-14 06:39 pm (UTC) - Expand

(no subject)

From: [identity profile] toyvo.livejournal.com - Date: 2005-04-14 06:41 pm (UTC) - Expand

(no subject)

From: [identity profile] valshooter.livejournal.com - Date: 2005-04-14 06:42 pm (UTC) - Expand

Date: 2005-04-14 07:32 pm (UTC)
From: [identity profile] iskatel.livejournal.com
Занятно. И поучительно.

Date: 2005-04-14 09:39 pm (UTC)
From: [identity profile] quirrc.livejournal.com
Если у человека в течение нескольких записей дата сильно вперед, то можно для web и клиентов выводить однократное напоминание об этом.

Date: 2005-04-14 09:56 pm (UTC)
From: [identity profile] penguinny.livejournal.com
Гм. А новые проблемы с юникодом случайно не связаны с новой версий перла? (см., например, мою страницу или тут: http://www.livejournal.com/users/gunilla/friends). Поведение аналогичное: юникод взбрыкивал последнее время регулярно, но после перезагрузки нормальная кодировка, как правило, восстанавливалась.

Date: 2005-04-14 11:00 pm (UTC)
From: [identity profile] meshko.livejournal.com
Да, эти невозможне даты -- это отлично. Ведь новая перловская тоже неполная: она не учитывает, что время может быть невозможным из-за перевода часов.
Видел где-то имплементацию mktime (в BSD-шной libc?), которая проверяет, является ли дата, разбитая на (год, месяц, день, час, мнуту, секунду), "хорошей", путем бинарного поиска по time_t.

Date: 2005-04-14 11:15 pm (UTC)
From: [identity profile] bespechnoepero.livejournal.com
это подтверждает мою давнюю мысль - никогда не нужно делать апгрейды.

Date: 2005-04-15 12:19 am (UTC)
From: [identity profile] madfire.livejournal.com
*ыыыыы* не могу удержаться.... держите меня...ой..... нет не могу - ПЕРЛ СОСЕТ! уфф... вроде стало легче, спасибо.

отличная бага.
только насколько я помню хотя бы тот же php, затолкать некорректную дату в функции даты/времени практически невозможная задача. Как это в перле интересно получается.

Date: 2005-04-15 06:28 am (UTC)
From: [identity profile] bolk.livejournal.com
А что не сосёт?

В PHP при попытке затолкать 31-е апреля, например, мы получим первое мая.

(no subject)

From: [identity profile] madfire.livejournal.com - Date: 2005-04-15 11:57 am (UTC) - Expand

(no subject)

From: [identity profile] bolk.livejournal.com - Date: 2005-04-15 12:17 pm (UTC) - Expand

(no subject)

From: [identity profile] madfire.livejournal.com - Date: 2005-04-15 12:38 pm (UTC) - Expand

(no subject)

From: [identity profile] bolk.livejournal.com - Date: 2005-04-15 12:39 pm (UTC) - Expand

(no subject)

From: [identity profile] madfire.livejournal.com - Date: 2005-04-15 12:41 pm (UTC) - Expand

Кто автор?

From: [identity profile] aburachil.livejournal.com - Date: 2005-04-15 01:38 pm (UTC) - Expand

Re: Кто автор?

From: [identity profile] madfire.livejournal.com - Date: 2005-04-15 01:40 pm (UTC) - Expand

Date: 2005-04-15 01:32 am (UTC)
From: [identity profile] china-cat.livejournal.com
а вот что случилось с полюбившимся мне аплетом в комментариях? раньше открывалось окно без перезагрузки страницу, но пару дней назад все страницы комментов стали выдавать по две ошибки и аплет перестал открываться - теперь чтобы оставить комментарий приходится заново загружать окошко..

Date: 2005-04-15 11:09 pm (UTC)
From: [identity profile] avva.livejournal.com
Увы, не знаю. У меня всё работает, вроде ничего в нём не меняли.

(no subject)

From: [identity profile] china-cat.livejournal.com - Date: 2005-04-16 12:42 am (UTC) - Expand

Date: 2005-04-15 09:58 am (UTC)
From: [identity profile] olkab.livejournal.com
Любопытно.
Только я всё равно не понимаю, как можно запихать неправильную дату. Типа, в окошке поста руками исправить?

Date: 2005-04-15 11:08 pm (UTC)
From: [identity profile] avva.livejournal.com
Например, да. Хотя, кажется, у всяких людей были настолько испорченные системы, что сами такое посылали. Какие именно и как - этого я не знаю.

Date: 2005-04-15 10:18 am (UTC)
From: [identity profile] sobaker.livejournal.com
Анатолий, помните старый добрый фильм "31 июня"?

Кому-то в этот день забраться все-таки удалось :)
From: [identity profile] aburachil.livejournal.com
Пошла по Вашей ссылке на Time::Local::timegm() (http://perldoc.perl.org/Time/Local.html). Там есть потрясающая фраза: "If the timelocal() function is given a non-existent local time, it will simply return an epoch value for the time one hour later." Вполне достойно Стивена Кинга (есть такая его книжка про самолёт, залетевший куда-то, где часть пространства по техническим причинам стала "non-existent").

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. 28th, 2025 10:24 pm
Powered by Dreamwidth Studios