168 877 молчаливых ошибок
Открыл вечером свой проект vox.csylabs.com проверить одну мелочь. В списке участников — «Онлайн — 28». Пятница, 22:00. Быть там не должно никого.
Начал копать. Нашёл три проблемы, лежавшие одна на другой. Каждая прятала следующую.
Первая: автоматическая уборка «призраков» не работала с декабря.
В приложении раз в минуту должна запускаться фоновая задача — проверить, кто ещё на связи в голосовых каналах, а кого можно убрать (браузер закрылся, сеть отвалилась, телефон заблокировали). Схема рабочая, программа написана аккуратно. Не хватает одной мелочи — секретного пароля, которым эта служебная задача доказывает, что она своя.
Пароля в настройках не оказалось. Каждый запуск отбивался «чужой, не входи». Система честно это записывала. К пятнице вечером в журнале накопилось 168 877 таких ошибок подряд. Ни одного успеха. В таблице — 8 давно ушедших пользователей. Самый старый «висит» уже двенадцать дней.
Вторая: для пометки самого пользователя (зелёный значок у имени) уборки вообще не было.
Одно дело — голосовой канал. Другое — пометка «в сети» у имени в списке. Её обновляет сам браузер, пока вкладка открыта: двинул мышь — я здесь, 5 минут тишины — «отошёл», закрыл вкладку — не в сети.
Ломается на грязном закрытии: iPhone выгрузил приложение из памяти, браузер упал, сеть отвалилась, крышку ноутбука захлопнули. Браузер не успел сказать «я ухожу» — и пользователь навсегда остаётся «в сети».
К пятнице накопилось 29 таких. Один висел с 1 марта. Другой — со 2 марта. Третий — с 8 апреля.
Встроенная функция, которая должна была этих «призраков» отпускать, в программе была — написана ещё в декабре. Её просто забыли включить в расписание.
Третья: без неё вторая не могла бы работать в принципе.
Когда приложение записывает «такой-то в сети» — оно сохраняет саму пометку, но не сохраняет время последнего сигнала. А автоматическая уборка сравнивает именно время: «последний сигнал был более двух минут назад — значит, уже не в сети». А сигнала нет.
Даже если бы уборку включили с первого дня — сравнивать ей было бы нечего. Окно «кто сейчас на связи» всегда пустое.
Починил первую проблему — сразу вылезла четвёртая. Сервер пошёл в базу не туда, куда надо: смотрел на один адрес, а настроен был другой. Ошибка лежала в программе всё это время, просто первая проблема отсекала запрос раньше — до того, как он добирался до базы. Первая ошибка прятала четвёртую своим более ранним отказом.
Это и есть самое интересное в истории. Две ошибки могут держать друг друга на плаву. Чинишь верхнюю — кажется, что ты что-то сломал. А на самом деле просто обнажилась нижняя, которая всё это время там была.
После двух правок:
| было | стало |
|---|---|
| 8 «зомби» в голосовых каналах | 0 |
| 29 «призраков» в сети | 0 |
Автоматическая уборка наконец работает каждую минуту. Закрыл вкладку — через две минуты ты больше не в сети. Вышел из голосового канала — через минуту тебя уже нет в списке.
Что вынес:
→ Две проблемы часто прячут друг друга. Верхняя отсекает запрос раньше — и кажется, будто глубже всё в порядке. Чинишь верхнюю — и думаешь, что сломал. А просто проявилась нижняя → 168 тысяч ошибок в журнале — это не наблюдение, а белый шум. Пока их никто не читает, их как будто нет. Настройка сигналов тревоги — в план → Программа, которую написали, но не включили в работу — классика. «Написали, не подключили, забыли»
Дальше — по мере поступления.