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

BGDataLoader: 100% процессора и NullPointerException
http://forum.bitel.ru/viewtopic.php?f=22&t=8923
Страница 1 из 1

Автор:  SpaceCommander [ 05 фев 2014, 15:31 ]
Заголовок сообщения:  BGDataLoader: 100% процессора и NullPointerException

Имеется Bgbilling 6.0 с последним апдейтом на Centos 6.5 (i386).
OpenJDK 1.7.0 из стандартных пакетов.

Проблема: процесс BGDataLoader кушает 100% ядра процессора,
при этом во все файлы /usr/local/BGBillingServer/log/dataloader*.log непрерывно пишется одно и то же сообщение:
Код:
02-05/13:17:52 ERROR [Thread-0] dataloader -
java.lang.NullPointerException
        at bitel.billing.server.DataLoader.run(DataLoader.java:107)

Как давно это началось, не заметил.
По логам не проверить, т.к. они заполняются ошибкой буквально за пару минут.

Процесс:
Код:
# ps wwll 1072
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0     0  1072     1  25   5 406708 52676 -      SNl  ?        151:55 /usr/bin/java -Dnetworkaddress.cache.ttl=3600 -Djava.net.preferIPv4Stack=true -Djava.endorsed.dirs=/usr/local/BGBillingServer/lib/endorsed:/usr/lib/endorsed -Dboot.info=1 -Dapp.name=BGDataLoader -Dlog4j.configuration=data/log4j.xml -Dlog.dir.path=log/ -Dlog.prefix=dataloader -Xmx256m -cp /usr/local/BGBillingServer:/usr/local/BGBillingServer/lib/ext/bgcommon-boot.jar ru.bitel.common.bootstrap.Boot bitel.billing.server.DataLoader -estart

JAR:
Код:
-rw-r--r--. 1 root root 4621963 Jan 28 03:25 /usr/local/BGBillingServer/lib/app/kernel.jar
md5sum: 5470feeeca4e374ab8360b79fb1b08c0

DataLoader.class: размер 16126 байт, md5sum caaed89e6761357acdeeb026b6a8ea5a.

Из-за чего такое может быть, и как это чинить?

Автор:  skyb [ 05 фев 2014, 15:37 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

для начала поставить 6 версию явы

Автор:  dimOn [ 05 фев 2014, 15:38 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

разбираться с чем-то таким имеет смысл только после замены OpenJDK на OracleJDK и 7 на 6

Автор:  SpaceCommander [ 05 фев 2014, 16:13 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

dimOn писал(а):
разбираться с чем-то таким имеет смысл только после замены OpenJDK на OracleJDK и 7 на 6

Вы представляете, какой это геморрой - сносить стандартный jdk, проходить оракловскую регистрацию, скачивать-перекачивать их неизвестно насколько специфический пакет и т.д.,
после чего обнаружить, что проблема сохранилась?
Только потому, что форумным знатокам лень заглянуть в DataLoader.java и увидеть перед 107 строкой
Код:
101:        con = this.setup.getDBConnectionFromPool();
103:        String query = "SELECT task_load.id, dt, param FROM task_load INNER JOIN source ON task_load.param=source.id AND source.source_type IN (1, 2) WHERE le < date_sub( now(), interval ? hour ) AND count>0";
107:        PreparedStatement psSelectTaskLoad = con.prepareStatement(query);

Очевидно же, что con равен null, но разработчики не считают нужным проверить его сразу после присвоения в 101 строке, поэтому возникает исключение в 107 строке.
По 103 строке понятно, что проблема связана с MySQL, по 101 - что отсутствием связи с ним.

Разобрался с MySQL и проблема решилась.
Зачот разработчикам за качественную диагностику и размещение вызовов sleep до catch, и поддержке за архиполезные советы. :facepalm:

Автор:  dimOn [ 05 фев 2014, 16:18 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

Цитата:
Вы представляете, какой это геморрой - сносить стандартный jdk, проходить оракловскую регистрацию, скачивать-перекачивать их неизвестно насколько специфический пакет и т.д.,

Можете ничего из этого не делать и продолжать пользоваться неподходящей JDK, которая в некоторых местах вызывает гарантированные проблемы.

Автор:  dimOn [ 05 фев 2014, 16:26 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

Цитата:
Только потому, что форумным знатокам лень заглянуть в DataLoader.java и увидеть перед 107 строкой

Напротив, никто не пишет, т.к. все бросились проверять свои jar-ки на предмет того что там на 107 строке в DataLoader.java.
Цитата:
и поддержке за архиполезные советы.
На форуме поддержки не ведётся. Приходите ещё!

Автор:  Amir [ 05 фев 2014, 16:30 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

Цитата:
Очевидно же, что con равен null, но разработчики не считают нужным проверить его сразу после присвоения в 101 строке, поэтому возникает исключение в 107 строке.
Зачем, если Java VM сама проверит и бросит исключение?
И если con null - значит до этой ошибки была другая, по которой можно было проще определить, что что-то не так с соединием к БД.
А если настроить оповещение http://bgbilling.ru/v6.0/doc/ch01s10s03.html , то и на почту будет приходить сообщение, что проблема с БД.

Автор:  SpaceCommander [ 05 фев 2014, 16:36 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

dimOn писал(а):
неподходящей JDK, которая в некоторых местах вызывает гарантированные проблемы.

Можно про это подробнее?
Гугл по запросу "bgbilling openjdk" находит только viewtopic.php?f=1&t=6101&start=30
В http://bgbilling.ru/v6.0/doc/ch01s05s02.html сказано про Оракл, но версия "1.6.0, либо выше", а не "только 6".

Автор:  SpaceCommander [ 05 фев 2014, 16:46 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

Amir писал(а):
con null - значит до этой ошибки была другая, по которой можно было проще определить, что что-то не так с соединием к БД.

Т.к. диагностика предыдущей ошибки не делается, определить ее можно только по исходным текстам.
Было бы намного понятнее так: if (con == null) throw new Exception("DBConnectionPool is empty, check your database connection!");

Кроме того, sleep делается внутри блока try-catch, т.е. при исключениях не вызывается.
Т.е. любое исключение заполнит логи за несколько минут.

Автор:  Phricker [ 05 фев 2014, 16:58 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

dimOn писал(а):
все бросились проверять свои jar-ки на предмет того что там на 107 строке в DataLoader.java.

Не нашел DataLoader.java. Только DataLoader.class
В нем тоже самое
Код:
 Connection con = null;
      try
      {
        con = this.setup.getDBConnectionFromPool();

        String query = "SELECT task_load.id, dt, param FROM task_load INNER JOIN source ON task_load.param=source.id AND source.source_type IN (1, 2) WHERE le < date_sub( now(), interval ? hour ) AND count>0";

        PreparedStatement psSelectTaskLoad = con.prepareStatement(query);

Автор:  dimOn [ 05 фев 2014, 17:00 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

Phricker, это была ирониэ :umnik:

Автор:  Phricker [ 05 фев 2014, 17:05 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

Подумаешь тег оффтопа не поставил )))

Автор:  dimOn [ 05 фев 2014, 17:23 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

Phricker писал(а):
Подумаешь тег оффтопа не поставил )))
Да тут излишне будет, тут весь топик уже оффтоп, примерно в духе "вроде как сам накосячил, но вы всё равно пи неправильно пишете, а я д'артаньянъ" :mrgreen:

Автор:  stark [ 05 фев 2014, 18:06 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

SpaceCommander писал(а):
Amir писал(а):
con null - значит до этой ошибки была другая, по которой можно было проще определить, что что-то не так с соединием к БД.

Т.к. диагностика предыдущей ошибки не делается, определить ее можно только по исходным текстам.
Было бы намного понятнее так: if (con == null) throw new Exception("DBConnectionPool is empty, check your database connection!");

Кроме того, sleep делается внутри блока try-catch, т.е. при исключениях не вызывается.
Т.е. любое исключение заполнит логи за несколько минут.


Информативное сообщение было где-то выше, о недоступности mysql. Вы ужаснетесь, но в коде таких вызовов 300 штук и следуя вашей логике нужно везде ставить проверки . Т.е представим что-то где что упало и информативное сообщение было брошено, то потом нужно везде добавлять проверки на все возможные случаи ?

Автор:  dimOn [ 05 фев 2014, 18:26 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

stark писал(а):
Информативное сообщение было где-то выше, о недоступности mysql. Вы ужаснетесь, но в коде таких вызовов 300 штук и следуя вашей логике нужно везде ставить проверки . Т.е представим что-то где что упало и информативное сообщение было брошено, то потом нужно везде добавлять проверки на все возможные случаи ?
Ну смотрите: приходит такой человек с первым сообщением на форум и делится проблемой, ему начинают отписываться, сообщать о тех или иных видимых косяках, ну обычное в общем-то дело. Но в ответ оказывается что они "форумные знатоки" и поленились за автора полазать в исходниках и изучить где и что было у него неправильно настроено. Заодно досталось и разработчикам пара сообщений со смайлами вида " :facepalm: "
Так я к чему всё это: товарищ-то, наверно, лучше знает нужны или нет эти 300 проверок :idea:

Автор:  SpaceCommander [ 05 фев 2014, 18:42 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

stark писал(а):
Информативное сообщение было где-то выше, о недоступности mysql.

Если даже и было, оно через пару минут оказалось затёрто сотнями тысяч сообщений
про NullPointerException, которое генерируется без задержек в бесконечном цикле и забивает все логи.

Именно поэтому я и написал про sleep - его желательно вызывать в конце цикла for(;;), а не до catch().

Автор:  SpaceCommander [ 05 фев 2014, 19:13 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

dimOn писал(а):
за автора полазать в исходниках

Ну если Вы считаете, что наоборот, за разработчиков проприетарного софта "лазать в исходники" должны заказчики, тогда конечно.

Автор:  SpaceCommander [ 05 фев 2014, 19:20 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

stark писал(а):
Вы ужаснетесь, но в коде таких вызовов 300 штук и следуя вашей логике нужно везде ставить проверки .

Если целых 300 штук, тогда пишутся tryGetDBConnectionFromPool() и однострочная обертка вокруг неё - getDBConnectionFromPool()
tryGet возвращает null, get в случае null швыряет SQLException.
Это лучше, чем 500к сообщений NullPointerException.

Автор:  stark [ 06 фев 2014, 17:06 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

Обновление выложено

Автор:  Phricker [ 06 фев 2014, 17:07 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

Цитата:
1668 06.02.2014 17:06:08 ИСПРАВЛЕНО Корректная обработка отсутствия соединения к базе в Dataloader.

А остальные 299 мест тоже будут? :) Обновляться сейчас или подождать.

Автор:  stark [ 06 фев 2014, 17:19 ]
Заголовок сообщения:  Re: BGDataLoader: 100% процессора и NullPointerException

Phricker писал(а):
Цитата:
1668 06.02.2014 17:06:08 ИСПРАВЛЕНО Корректная обработка отсутствия соединения к базе в Dataloader.

А остальные 299 мест тоже будут? :) Обновляться сейчас или подождать.


нет смысла .. Тут проблема была в загрузке процессора больше из-за отсутствия sleep. Заодно проверили планировщик - он этим не страдает. Тут просто при выдаче соединения в первый раз выдается ошибка информативная, а потом 5 секунд выдается null. Ну вот оно за эти 5 секунд успевало забить все логи, так как не было sleep в этом случае и грузило процессор бесконечным циклом . В остальных случаях если раз в 5 секунд будет выдаваться сообщение о недоступности базы, то, думаю, его можно заметить.

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