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, и поддержке за архиполезные советы. ![]() |
Автор: | 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, это была ирониэ ![]() |
Автор: | Phricker [ 05 фев 2014, 17:05 ] |
Заголовок сообщения: | Re: BGDataLoader: 100% процессора и NullPointerException |
Подумаешь тег оффтопа не поставил ))) |
Автор: | dimOn [ 05 фев 2014, 17:23 ] |
Заголовок сообщения: | Re: BGDataLoader: 100% процессора и NullPointerException |
Phricker писал(а): Подумаешь тег оффтопа не поставил ))) Да тут излишне будет, тут весь топик уже оффтоп, примерно в духе "вроде как сам накосячил, но вы всё равно ![]() |
Автор: | 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 штук и следуя вашей логике нужно везде ставить проверки . Т.е представим что-то где что упало и информативное сообщение было брошено, то потом нужно везде добавлять проверки на все возможные случаи ? Ну смотрите: приходит такой человек с первым сообщением на форум и делится проблемой, ему начинают отписываться, сообщать о тех или иных видимых косяках, ну обычное в общем-то дело. Но в ответ оказывается что они "форумные знатоки" и поленились за автора полазать в исходниках и изучить где и что было у него неправильно настроено. Заодно досталось и разработчикам пара сообщений со смайлами вида " ![]() Так я к чему всё это: товарищ-то, наверно, лучше знает нужны или нет эти 300 проверок ![]() |
Автор: | 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/ |