3 мин чтения#engineering#infrastructure

168 877 молчаливых ошибок

Открыл вечером свой проект vox.csylabs.com проверить одну мелочь. В списке участников — «Онлайн — 28». Пятница, 22:00. Быть там не должно никого.

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


Первая: автоматическая уборка «призраков» не работала с декабря.

В приложении раз в минуту должна запускаться фоновая задача — проверить, кто ещё на связи в голосовых каналах, а кого можно убрать (браузер закрылся, сеть отвалилась, телефон заблокировали). Схема рабочая, программа написана аккуратно. Не хватает одной мелочи — секретного пароля, которым эта служебная задача доказывает, что она своя.

Пароля в настройках не оказалось. Каждый запуск отбивался «чужой, не входи». Система честно это записывала. К пятнице вечером в журнале накопилось 168 877 таких ошибок подряд. Ни одного успеха. В таблице — 8 давно ушедших пользователей. Самый старый «висит» уже двенадцать дней.

Вторая: для пометки самого пользователя (зелёный значок у имени) уборки вообще не было.

Одно дело — голосовой канал. Другое — пометка «в сети» у имени в списке. Её обновляет сам браузер, пока вкладка открыта: двинул мышь — я здесь, 5 минут тишины — «отошёл», закрыл вкладку — не в сети.

Ломается на грязном закрытии: iPhone выгрузил приложение из памяти, браузер упал, сеть отвалилась, крышку ноутбука захлопнули. Браузер не успел сказать «я ухожу» — и пользователь навсегда остаётся «в сети».

К пятнице накопилось 29 таких. Один висел с 1 марта. Другой — со 2 марта. Третий — с 8 апреля.

Встроенная функция, которая должна была этих «призраков» отпускать, в программе была — написана ещё в декабре. Её просто забыли включить в расписание.

Третья: без неё вторая не могла бы работать в принципе.

Когда приложение записывает «такой-то в сети» — оно сохраняет саму пометку, но не сохраняет время последнего сигнала. А автоматическая уборка сравнивает именно время: «последний сигнал был более двух минут назад — значит, уже не в сети». А сигнала нет.

Даже если бы уборку включили с первого дня — сравнивать ей было бы нечего. Окно «кто сейчас на связи» всегда пустое.


Починил первую проблему — сразу вылезла четвёртая. Сервер пошёл в базу не туда, куда надо: смотрел на один адрес, а настроен был другой. Ошибка лежала в программе всё это время, просто первая проблема отсекала запрос раньше — до того, как он добирался до базы. Первая ошибка прятала четвёртую своим более ранним отказом.

Это и есть самое интересное в истории. Две ошибки могут держать друг друга на плаву. Чинишь верхнюю — кажется, что ты что-то сломал. А на самом деле просто обнажилась нижняя, которая всё это время там была.


После двух правок:

былостало
8 «зомби» в голосовых каналах0
29 «призраков» в сети0

Автоматическая уборка наконец работает каждую минуту. Закрыл вкладку — через две минуты ты больше не в сети. Вышел из голосового канала — через минуту тебя уже нет в списке.


Что вынес:

→ Две проблемы часто прячут друг друга. Верхняя отсекает запрос раньше — и кажется, будто глубже всё в порядке. Чинишь верхнюю — и думаешь, что сломал. А просто проявилась нижняя → 168 тысяч ошибок в журнале — это не наблюдение, а белый шум. Пока их никто не читает, их как будто нет. Настройка сигналов тревоги — в план → Программа, которую написали, но не включили в работу — классика. «Написали, не подключили, забыли»

Дальше — по мере поступления.

Читать по теме