BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 25 июн 2025, 02:18

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 21 ] 
Автор Сообщение
СообщениеДобавлено: 05 фев 2014, 15:31 
Не в сети

Зарегистрирован: 26 янв 2014, 18:06
Сообщения: 7
Карма: 0
Имеется 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.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 15:37 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 03 авг 2009, 18:42
Сообщения: 7166
Откуда: Благовещенск
Карма: 241
для начала поставить 6 версию явы

_________________
Код:
  Клиент: вер. 6.2.714 / 25.05.2015 17:27:15
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45
  Сервер: вер. 6.2.881 / 22.05.2015 17:56:55
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45
Помощь по администрированию bgbilling в jabber конференции или Группа в telegram
Стиль программирования - пьяный мастерстер
Разработка мобильных приложений


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 15:38 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
разбираться с чем-то таким имеет смысл только после замены OpenJDK на OracleJDK и 7 на 6

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 16:13 
Не в сети

Зарегистрирован: 26 янв 2014, 18:06
Сообщения: 7
Карма: 0
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:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 16:18 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
Цитата:
Вы представляете, какой это геморрой - сносить стандартный jdk, проходить оракловскую регистрацию, скачивать-перекачивать их неизвестно насколько специфический пакет и т.д.,

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

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 16:26 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
Цитата:
Только потому, что форумным знатокам лень заглянуть в DataLoader.java и увидеть перед 107 строкой

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

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 16:30 
Не в сети
Разработчик
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 16:36 
Не в сети

Зарегистрирован: 26 янв 2014, 18:06
Сообщения: 7
Карма: 0
dimOn писал(а):
неподходящей JDK, которая в некоторых местах вызывает гарантированные проблемы.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 16:46 
Не в сети

Зарегистрирован: 26 янв 2014, 18:06
Сообщения: 7
Карма: 0
Amir писал(а):
con null - значит до этой ошибки была другая, по которой можно было проще определить, что что-то не так с соединием к БД.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 16:58 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
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);

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 17:00 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
Phricker, это была ирониэ :umnik:

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 17:05 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Подумаешь тег оффтопа не поставил )))

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 17:23 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
Phricker писал(а):
Подумаешь тег оффтопа не поставил )))
Да тут излишне будет, тут весь топик уже оффтоп, примерно в духе "вроде как сам накосячил, но вы всё равно пи неправильно пишете, а я д'артаньянъ" :mrgreen:

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 18:06 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
SpaceCommander писал(а):
Amir писал(а):
con null - значит до этой ошибки была другая, по которой можно было проще определить, что что-то не так с соединием к БД.

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

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 18:26 
Не в сети
Аватара пользователя

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

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 18:42 
Не в сети

Зарегистрирован: 26 янв 2014, 18:06
Сообщения: 7
Карма: 0
stark писал(а):
Информативное сообщение было где-то выше, о недоступности mysql.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 19:13 
Не в сети

Зарегистрирован: 26 янв 2014, 18:06
Сообщения: 7
Карма: 0
dimOn писал(а):
за автора полазать в исходниках

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 фев 2014, 19:20 
Не в сети

Зарегистрирован: 26 янв 2014, 18:06
Сообщения: 7
Карма: 0
stark писал(а):
Вы ужаснетесь, но в коде таких вызовов 300 штук и следуя вашей логике нужно везде ставить проверки .

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 фев 2014, 17:06 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Обновление выложено


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 фев 2014, 17:07 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Цитата:
1668 06.02.2014 17:06:08 ИСПРАВЛЕНО Корректная обработка отсутствия соединения к базе в Dataloader.

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

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 фев 2014, 17:19 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Phricker писал(а):
Цитата:
1668 06.02.2014 17:06:08 ИСПРАВЛЕНО Корректная обработка отсутствия соединения к базе в Dataloader.

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


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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
POWERED_BY
Русская поддержка phpBB
[ Time : 0.056s | 57 Queries | GZIP : On ]