Здравствуйте.
Ситуация следующая:
ночью сегодня BGRadius на границе месяцев выполнял сброс сессий (Month break).
Некоторое количество клиентов скинул нормально.
Далее, я предполагаю, Radius обрабатывал ответы от NAS'ов и съел максимальное
количество коннектов к БД, которые ему отведены (это 1500).
В течении 20 минут он их все 1500 держал активными (radius.sh status так показывал).
innotop не показывал бешеной загрузки и медленных запросов.
В логах BGRadius много вот таких ошибок:
Код:
radius 09-01/00:02:59 ERROR [radiusListener-p-3-t-732] ServerUtils -
java.lang.NullPointerException
at ru.bitel.bgbilling.server.util.ServerUtils.closeConnection(ServerUtils.java:659)
at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:138)
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)
Как будто closeConnection пытается закрыть con = null
А ещё До предыдущей ошибки были вот такие Exception
Код:
java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2325)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2310)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.j
at bitel.billing.server.contract.bean.BalanceUtils.setContractAccount(BalanceUtils.java:216)
at bitel.billing.server.dialup.bean.DialUpSessionUtils.setContractAccountFromSessionAccount(DialUp
at ru.bitel.bgbilling.modules.dialup.radius.DialUpNasConnection.stopConnectionImpl(DialUpNasConnec
at ru.bitel.bgbilling.modules.dialup.radius.DialUpNasConnection.stopConnection(DialUpNasConnection
at ru.bitel.bgbilling.modules.dialup.radius.DialUpNas.doSessionStop(DialUpNas.java:594)
at ru.bitel.bgbilling.modules.dialup.radius.DialUpNas.stopConnection(DialUpNas.java:568)
at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accounting(RadiusProcessor.java:456)
at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.accounting(DialUpRadiusProcessor
at ru.bitel.bgbilling.modules.dialup.radius.DialUpRadiusProcessor.accounting(DialUpRadiusProcessor
at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accountingRequest(RadiusProcessor.java
at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:176
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)
jstack не показал блокировок.
Прошу помочь разобраться с ошибкой.
P.S.
Помимо этого в коде, класса ConnectionBreaker
есть такие строки
Код:
while (Setup.getSetup().getMasterPoolLoad() > 0.2D)
{
((DialUpSessionRealtime)con.getSession()).addLogInfo("Month break skip by database load");
sleep(random.nextInt(5000));
}
Может тут предусмотреть количество попыток для проверки, а то в подобном случае можно говорить о бесконечном цикле.