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

"Размазаная" логика.

Недавно неделю убил на один глюк. История поучительная. В общем передали мне приложение - на сокетах, сервер плюс клиент написанное на java. Сервер управляет логикой и посылает/принимает сигналы с клиента. Плюс имеется диспетчерское приложение на делфе, которое я не трогаю (ну и слава богу ;)). Связь не ахти какая, да и просто доступность клиентов не гарантируется. Вот.
Ну и очень грубо описание... Требовалось обеспечить выполнение длительных процессов, автоматических, управляемых сервером, в которых с клиентов только выбирали задания, а потом получали уточнения о ходе выполнения. Для блокировок заданий между сеансами клиентов, используется таблица со звучным названием "block". В неё записывается id клиента, и тип блокировки (грубое представление).
Я всё это протестил, кое где потом поставили, вроде работало. (Система не единая, разбита на полностью независимые группы). И в одной такой группе повалились глюки. Задания не выбирались в автоматическом режиме.
Перешерстили весь код клиента и сервера, по ходу исправили пару узких мест (это плюс), но никак не могли понять в чём дело. У нас работает, у заказчика нет, причём видно, что нарушается логика обработки заданий. В тех логах, что имелись, было не ясно, что происходит. В БД нет возможности отследить состояние на момент возникновения глюка и эмулировать проблему.
Постепенно, частично уже от отчаянья, вышли на уровень проверки всех программ. И, в итоге, выяснилось, что Делфийская программа, при определённых условиях "вычищала" блокировки клиентов и логика заданий просто рушилась. Причём, чистка зависела от настроек и пр.
Комментировать не буду. В общем учитесь на чужих ошибках.

Комментариев нет: