понедельник, 16 февраля 2009 г.

Не думай о секундах свысока

Я написал маленькую, но полезную хранимую процедуру. Она делает определенные проверки, а потом рассылает по емейлу предупреждения о возможных проблемах. Все проверил – работает отлично. С помощью SQL Jobs настроил, чтобы она запускалась три раза в день.

На следующий день вижу, что что-то не то. Емейлы с предупреждениями были разосланы несколько раз ночью. Зато днем, когда они как раз и нужны, ничего нет. Ну, я сразу стал вспоминать, что последнее время у нас по ночам были каким-то странные проблемы то ли с сетью, то ли SQL Server. Может, как-то сервер перезапустился, а вместе с ним и jobs запустились в неправильное время?

А все оказалось намного проще. Заполняя расписания запуска jobs, я набирал "9 утра" как "09:00" (без секунд). Поэтому все запустилось в первом часу ночи - в 00:09:00, 00:16:30, 00:21:00 и т.д.



Вспомнил другой забавный глюк, связанный со временем. Я разрабатывал банковскую часть система клиент-банк. Клиентская часть была покупная. В ней много разных проблем, а сроки уже поджимают. Мы хотели подключить первого клиента в день рождения управляющего банка – сделать такой своеобразный подарок. Так что сидим допоздна, работаем.

Вроде уже почти готово, и вдруг в какой-то момент моя программа отказывается принимать тестовые платежи от клиентов. Как же так, вчера же работало? Что же я изменил со вчерашнего дня? Пробую и то, и это... перегенерировал ключи ЭЦП, переставил клиентскую программу, взял более старую версию своих исходников... В какой-то момент все снова начинает работать. В чем было дело, я не понял. Ну да ладно. На следующий день повторяется. Опять пробую и так, и эдак, и в какой-то момент снова начинает работать. Опять не понял, в чем дело. На третий день – опять то же самое. Уже и Windows переставляю, даже пробую заменить Millenium на 2000 (или наоборот?), удаляю ICQ. Опять починилось.

Я понял, что надо сделать code freeze. Точнее, full freeze. Вечером полностью протестировал систему. Таким образом, утром я знал, что вчера работало, а за ночь никак не изменились ни программы, ни моя Windows. И все равно утром не работает!

Оказалось, меня подвела излишняя аккуратность. В те "темные годы" обмен информацией осуществлялся, конечно же, с помощью файлов фиксированной длины. Разработчик дал спецификацию, согласно которой я пытался отправлять и принимать разные файлы (платежые поручения, квитанции, запросы, выписки, информационные сообщения). В спецификации описывались допустимые типы данных. Например, числа надо дополнять пробелами слева, а обычный текст – справа; время надо записывать в формате "ччмм", при необходимости дополняя часы и минуты лидирующими нулями. Как выяснилось, в одном месте разработчики нарушили свою же спецификацию – вместо лидирующего нуля использовали лидирующий пробел. Т.е. 9 утра они записывали как " 900", а не как "0900". Моя же программа исправно браковала такие файлы, поскольку в каком-то поле использовался недопустимый символ (пробел). Получается, что каждое утро день в 9:59 проблема еще была, а в 10 она уже исчезала.

5 комментариев:

bugman комментирует...

Познакомившись пару лет назад поближе с миром opensource, я стал намного лучше понимать необходимость наличия избыточного логгирования (вобычно это ключ вида -v ака verbose). 99% кода, написанного с тех пор, поддерживает многоуровневый вербоз (-v, -vv, -vvv, -vvvv ....) и это очень помогает в вылавливании багов и глюков.

igoriando комментирует...

Вот так всегда, чем дальше тем больше приходится разгребать результаты работы других вместо того чтобы самому создавать :)

Про время у меня тоже был забавный случай. До 19 января 2008г софт ставился, а после - перестал. После длинной разборки выяснил, что софтина сама генерит сертификат сервера сроком на 30! лет. Соответственно, в 2008 году настала у софтины проблема 2038 года...

Z комментирует...

другой забавный случай. В одной конторе по средам не включался компьютер. Но по четвергам и в остальные дни работал.
Короче, в итоге выяснили, что уборщица поливала цветы по средам и в комп заливалась вода, которая за день испарялась...
..Да, было раньше железо...

Valik комментирует...

Еще про уборщицу: в палате интенсивной терапии пациенты постоянно умирали на одной и то же койке. Уже пошли слухи, никто не хотел там лежать. Оказалось, что уборщице не хватало розеток для пылесоса, поэтому она временно выключала аппараты жизнеобеспечения.

А у нас в банке был случай, когда уборщица выкинула диск с квартальными апдейтами к системе SWIFT. Без него банк не мог бы принимать и отправлять международные платежи. Начальство лично копалось в большом мусорном баке на улице. К счастью, мусор еще не успели увезти на свалку.

Valik комментирует...

А вот еще такое: у моего товарища начались проблемы с мышкой. Но не все время - она то хорошо работала, то вообще сдыхала. Оказалось, виновата весна - солнце начинает слишком ярко светить в определенное время, а мышка-то отпическая.

Ratings by outbrain