Давно я что-то не ныл в дневничьке.
Прилетает мне, значит, письмо от начальства: «Котик, посмотри чегой-та у нас там отчёт со статистикой отвалился». Смотрю, значит, на отчёт, и действительно, за последние две недели данных нет. Радостно подумав, что движок не самопальный, так что в ним заведомо всё в порядке, лезу в логи шедулера, который утилиту импорта дёргает. Ошибочка у вас, говорит нам в логах утилита, connection closed.
А надо сказать, что ошибка эта, судя по трейсу, вылезает в недрах библиотэки, отвечающей за интерфейс с MS SQL. Естественно, я тут же ловлю нашего сисадмина за хвост, и проникновенно спрашиваю: а что ты делал в ночь с 20 июня на 21 июля с моим SQL-сервером? Не сознаётся, говорит, пыхпых — обновлял, ноду — обновлял, сиквель не трогал. Ага, ноду обновлял, значится. И когда? Увы, за три дня до того, как данные пропали, не в ней дело.
Отпускаю сисадмина, со вздохом погружаюсь в сырцы. Вроде всё как всегда: тот же лес скобочек, тот же спёртый воздух await'ов и та же лапша кода — но не работает. Ну раз проблема с соединением, переписал настройки по феншую текущей документации вместо честнокраденого с какого-то сайта. Не помогло. Переписал класс-обёртку, чтобы был реюзабельным и не надо было создавать два экземпляра. Не помогло. Выход один: пора гуглить.
На удивление, гугление по тексту ошибки почти сразу принесло важную информацию: оказывается, функция пакетной загрузки выдаёт ошибку 'connection closed' в случае (барабанная дробь) когда ей не нравятся входные данные. Прямо в ШитХабе разрабов багрепорт, где человек честно загружает легитимные данные, а в ответ получает эту ошибку. Разработчики ему ещё и пеняют: что это вы тут депрекейтнутый формат используете? Мы, знаете ли, библиотеку в свободное время пилим, и подобные багфиксы унылы и не дают нам достаточного положительного подкрепления.
Дальше я сходил на обед, и всё стало гораздо проще. Одна строчка печати в консоль, и стало ясно, что из опрашиваемой системы прилетает пустой массив (привет, сезон отпусков!), а значит пустой массив прилетает и в функцию пакетной загрузки. Добавляем сторожа перед вызовом функции, и всё путём.
Ну, не всё, конечно, потому что нода умеет отслеживать ссылки только в одном потоке. Стоит им появиться в другом, и объект будет жить вечно. Так что вешаем таймер, взводим флажок, и обеспечиваем отстрел ненужного соединения. Теперь скрипт сам завершается, а не душится шедулером.
Ура! Осталось только обновить отчёт, и всё в шоколаде. Тут и обнаружилось, что на самом деле статистика собиралась, просто вываливались запуски в то время, когда в одной из систем никто не работал. Но для подневной статистики это не сильно принципиально, так что данные всё-таки были. А сломалась в отчёте таблица сопоставления логина и ФИО, генерируемая из LDAP. Кто-то из админов, ничтоже сумняшеся прямо в боевом контейнере завёл пользователей с именем Иванов Иван Иванович, чем порушил условие уникальности на поле. На этом обновление благополучно падало, а за мониторинг никто не подумал.
Мораль: рукожопы, они везде. |