Вчера тихим сапом подкралась неприятность: неочевидный отказ системы доступа.
[показать]
Неочевидный – потому, что вроде как все работает, все события мониторятся и пишутся в базу данных.
Отказ – потому, что конфигурацию обновить невозможно, любая попытка завершается сообщением об ошибке.
1. Перезапустил сервис, не помогло.
2. Начал работать с лог-файлами приложения, нашел повторяющиеся записи:
2017-MM-DD hh:mm:ss,264 [33] ERROR .........Hardware.Manager.......HardwareManager Func: Dispose Dev: CommLine Msg: Disposing TCP Connection. IP=XXX.XXX.XXX.XXX:XXX
Явно указан характер сообщения: Error, указана причина: разрыв соединения.
3. Виновата сеть?
Да, работы с сетью проводятся, меняется оборудование и топология, вводятся новые политики.
Потратили с коллегой немало времени, но пришли к общему мнению – сеть не виновата.
4. Рушится сокет?
Исследовал лог-файлы операционной системы – никаких намеков на неприятности.
Не то.
5. Виноваты апдейты?
Проверил и уверен, что в этот раз апдейты не виноваты.
6. Проблемы с лицензией софта?
Снес лицензии, установил и снова активировал, а проблема осталась.
7. Обратился в суппорт,
отправил скриншоты, лог-файлы, открыл суппорту доступ к серверу. Подключились, стали смотреть. Неглубоко. Пришлось доказывать, что сеть не причем: состояние соединений (netstat –an) и записи в логах. И тут я увидел то, на что раньше внимания не обратил:
2017-MM-DD hh:mm:ss,168 [5] ERROR ....Hardware.Manager.....HardwareManager Func: ....OperationQueue.ExecuteAll Dev: 13 Msg: General error Exception : System.FormatException: Input string was not in a correct format. at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) at ....Hardware.Controllers.V7.....V7Controller.SetData(List`1 users, Dictionary`2 intervals, List`1 automaticFunctions, List`1 holidays, Boolean reset, OnProgress callbackOnOperationProgress, Boolean sendTables) at ....Hardware.Manager.....OperationSetData.Do(I....Controller controller) at ....Hardware.Manager.....OperationBase.ExecuteOn(I....Controller controller) at ....Hardware.Manager.....OperationQueue.ExecuteAll(ControllerContainer cc)
Стало ясно, что проблема в приложении, что подготовка данных для отправки завершается ошибкой, после чего и соединение разрывается. Характер сообщения почти прямо указывает на ошибку в данных.
Суппорт переправил проблему производителю системы, а я продолжил искать.
8. Проблемы с базой данных?
Остановил сервис и тотально проверил все базы данных на сервере (системные и данные):
mysqlcheck –c –u root –p –all-databases
Проблем не обнаружено.
9. Если проблема с данными, то как проверить?
Старая истина: в правильно поставленном вопросе содержится до 50% ответа!
Создаю новый обьект, подключаю и конфигурирую новый контроллер. Для начала определяю, что доступ никому не разрешен.
Проверка и тут-же предчуствие успеха: данные доставлены!
Создаю нового пользователя и разрешаю доступ к новому обьекту: данные доставлены!
Начинаю проверять существующие группы: одна из групп приводит к ошибке.
Далее проверяю пользователей из этой группы, метод дихотомии мне в помощь. Очень быстро обнаруживаю проблемного пользователя. Распечатываю его профиль, удаляю из системы и создаю заново.
Работоспособность восстановлена!
Отзвонил в суппорт: там не поняли (или я не сумел внятно донести) мои методы, но обрадовались успеху. Сказали, что обязательно дождутся ответа от производителя. Мне это самому интересно.
Пятница, вечер: неделя завершилась позитивно.