forum.bitel.ru
http://forum.bitel.ru/

Соединение не найдено в BGInetAccounting
http://forum.bitel.ru/viewtopic.php?f=44&t=7536
Страница 1 из 1

Автор:  vkulakov [ 14 дек 2012, 16:08 ]
Заголовок сообщения:  Соединение не найдено в BGInetAccounting

После запуска сервера BGInetAccounting в логах периодически появляются следующие ошибки:
Код:
mq 12-14/13:54:48 ERROR [event-proc-p-2-t-1] Consumer - Соединение не найдено (connectionId=91168, deviceId=2, servId=17340)
ru.bitel.bgbilling.common.BGException: Соединение не найдено (connectionId=91168, deviceId=2, servId=17340)
        at ru.bitel.bgbilling.modules.inet.accounting.Accounting.onConnectionCommand(Accounting.java:1919)
        at ru.bitel.bgbilling.modules.inet.accounting.Accounting.notify(Accounting.java:1878)
        at ru.bitel.bgbilling.kernel.event.AbstractConsumer.notify(AbstractConsumer.java:344)
        at ru.bitel.bgbilling.kernel.event.Consumer.notify(Consumer.java:1)
        at ru.bitel.bgbilling.kernel.event.Consumer.onMessage0(Consumer.java:112)
        at ru.bitel.bgbilling.kernel.event.Consumer$EventListenerRunnable.runImpl(Consumer.java:51)
        at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)
        at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40)

С чем они связаны и как их побороть?

Автор:  Amir [ 14 дек 2012, 16:22 ]
Заголовок сообщения:  Re: Соединение не найдено в BGInetAccounting

Похоже radius.connection.checkDuplicate=2|3 пытается завершить сессию (Access отправляет команду Accounting'у), но сессии уже нет.
Или не было - возможно, после lock wait timeout возникли записи в inet_connection_ со status>0 без соответствующей записи в inet_session_.

Автор:  vkulakov [ 14 дек 2012, 16:27 ]
Заголовок сообщения:  Re: Соединение не найдено в BGInetAccounting

И что с этим делать?
Можно как-то вычистить из базы левые записи, или со временем всё само устаканится?

Автор:  Amir [ 14 дек 2012, 16:35 ]
Заголовок сообщения:  Re: Соединение не найдено в BGInetAccounting

Если есть такие записи - лучше удалить запросом:
Код:
DELETE FROM inet_connection as cc LEFT JOIN inet_session as ss ON ss.connectionId=cc.id WHERE cc.connectionStatus>0 AND ss.id IS NULL

Автор:  vkulakov [ 15 дек 2012, 19:16 ]
Заголовок сообщения:  Re: Соединение не найдено в BGInetAccounting

Базу почистили ещё вчера. С тех пор в базе нет соединений без сессий.
В логах по-прежнему наблюдаются указанные сообщения об ошибках.

Автор:  Amir [ 16 дек 2012, 00:15 ]
Заголовок сообщения:  Re: Соединение не найдено в BGInetAccounting

В конфигурации присутствует параметр radius.connection.checkDuplicate=2|3 ?

Автор:  vkulakov [ 17 дек 2012, 10:35 ]
Заголовок сообщения:  Re: Соединение не найдено в BGInetAccounting

Не успел дописать в субботу - компьютер сдох :(.
Да, параметр radius.connection.checkDuplicate=2 присутствует, и как показало небольшое расследование, ошибки были связаны с ним.
Вообще, логика работы данного параметра не до конца понятна. Сейчас (при radius.connection.checkDuplicate=2), если сессия висит и приходит Access-Request, то выдаётся Access-Reject с кодом Too many sessions и тут же сбрасывается существующая сессия. Но почему бы сначала не сбрасывать сессию, а потом выдавать нормальный Access-Accept?
При radius.connection.checkDuplicate=1 понятно, что нужно сначала дождаться ответа. А что будет, если ответ не придёт, или NAS вернёт ошибку? Ждать пока сессия по таймауту не закроется?

Автор:  vkulakov [ 18 дек 2012, 11:34 ]
Заголовок сообщения:  Re: Соединение не найдено в BGInetAccounting

Вопрос ещё актуален. Что будет, если установлена опция radius.connection.checkDuplicate=1 и
1. ответ от NAS на дисконнект не пришёл,
2. NAS вернул ошибку (типа "сессия не найдена"),
3. в промежутке между запросом на дисконнект и получением стоп-пакета было ещё несколько попыток поднять сессию?

Автор:  Amir [ 18 дек 2012, 16:52 ]
Заголовок сообщения:  Re: Соединение не найдено в BGInetAccounting

radius.connection.checkDuplicate практически дублирует функционал из dialup.
При radius.connection.checkDuplicate=1 идет просто попытка сброса на NAS (изначально в dialup просили такой режим, зачем - не знаю).
Т.е. пока так и не придет стоп пакет или сессия не завершится по таймауту - не пустит.
При radius.connection.checkDuplicate=2 попытается сбросить, а потом завершить сессию в базе (вот тут и возникает ошибка в логах - он просто пытается завершить сессию, которая успела уже все-таки завершиться).
При radius.connection.checkDuplicate=3 - просто завершает а базе.

Т.е. еще в dialup было сделано с тем условием, что сессия отваливается редко и не страшно, если клиенту придется два раза переподключиться после отваливания.

Можем попробовать добавить дополнительные режимы.

Автор:  vkulakov [ 18 дек 2012, 17:38 ]
Заголовок сообщения:  Re: Соединение не найдено в BGInetAccounting

Проблема тогда получается вот в чём:
При radius.connection.checkDuplicate=1 и если сессия на NAS'е уже завершилась, то при попытке завершить эту сессию биллингом, NAS вернёт ошибку, и придётся ждать таймаут (~30 мин). Это не очень хорошо.
При radius.connection.checkDuplicate=2 если всё-таки приходит Stop-пакет, то в логах возникает ошибка "Соединение не найдено", и в результате не понятно, то ли это не найдена просто подвисшая сессия, то ли это реальная проблема... Можно ли для данной опции вызывать не Exception и ERROR, а просто писать в лог WARN с комментарием типа "Пришёл стоп-пакет для подвисшей сессии"?

Автор:  Amir [ 19 дек 2012, 14:55 ]
Заголовок сообщения:  Re: Соединение не найдено в BGInetAccounting

Цитата:
Можно ли для данной опции вызывать не Exception и ERROR, а просто писать в лог WARN с комментарием типа "Пришёл стоп-пакет для подвисшей сессии"?
Сегодня выложим билд.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/