Перейти до

Inet_ntoa Error


Рекомендованные сообщения

Периодически поступают жалобы на невозможность пользоваться интернетом. Авторизатор нормально подключается и отключается, но скрипты не отрабатываются. Лог подключений абонента не меняется и выглядит так:

...

D 2008.12.08-19.30.03 192.168.8.231 29.032278

C 2008.12.08-19.30.08 192.168.8.231 29.032278

D 2008.12.08-22.54.43 192.168.8.231 29.032278

C 2008.12.10-15.05.08 192.168.8.231 22.580666

D 2008.12.10-16.45.45 192.168.8.231 22.580666

C 2008.12.10-19.23.34 [inet_ntoa error] 22.580666

 

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

Есть лекарство?

Ссылка на сообщение
Поделиться на других сайтах

еще пару наблюдений:

у проблемного абонента похоже не меняется статус в конфигураторе - постоянно висит онлайн (не уверен, пронаблюдаю в след.раз если нужно);

сервер не убивается быстро (как обычно менее минуты) по killall stargazer, а висит дольше обычного. Я его добиваю по kill -12

Ссылка на сообщение
Поделиться на других сайтах

Проверьте загрузку сервера, может СТГ что-то мешает.

Можно иногда проверять работоспособность СТГ и ребутить его, по типу этого:

http://local.com.ua/forum/index.php?showtopic=10568

 

И ещё, у человека похожая трабла:

http://local.com.ua/forum/index.php?showtopic=13048

 

Так же попробуйте ввести "inet_ntoa error" в строке поисковика - возможно это поможет вам понять суть проблемы.

Ссылка на сообщение
Поделиться на других сайтах

хм...

Проверьте загрузку сервера, может СТГ что-то мешает.
- не мешает
Можно иногда проверять работоспособность СТГ и ребутить его, по типу этого:

http://local.com.ua/forum/index.php?showtopic=10568

- мне проще самому найти ошибку в сервере, чем его кроном ребутить псевдослучайным образом в такт когда у одного из тысячи абонентов случается трабл
И ещё, у человека похожая трабла:

http://local.com.ua/forum/index.php?showtopic=13048

- этим человеком я и есть, траблу давно порешали.
Так же попробуйте ввести "inet_ntoa error" в строке поисковика - возможно это поможет вам понять суть проблемы.
это я сделал в первую очередь
Ссылка на сообщение
Поделиться на других сайтах

# INET_NTOA (выражение). Принимает сетевой адрес в виде числа (4- или 8-байтного), возвращает адрес, представленный строкой, состоящей из четырех чисел, разделенных точкой.

mysql> SELECT INET_NTOA(3520061480); -> '209.207.224.40'

Функция INET_NTOA () появилась в MySQL 3.23.15.

 

 

что-то мне подсказывает что айпи этого абонента вбит криво в базу.. может пробелы, или какие-то другие символы ..

Ссылка на сообщение
Поделиться на других сайтах

Было-бы неплохо глянуть консольный лог старгейзера. К стати, это поможет увидеть чем он занимается при остановке.

Да, и к стати: какая версия, какие модули?

Ссылка на сообщение
Поделиться на других сайтах
Функция INET_NTOA () появилась в MySQL 3.23.15.

что-то мне подсказывает что айпи этого абонента вбит криво в базу.. может пробелы, или какие-то другие символы ..

mysql тут не при чем - используется файловая(текстовая) база данных

айпи не вбит криво, ибо оно работало нормально до того, и работает нормально после перезапуска.

 

Возможно что происходит накладка в момент записи в базу данных и одновременного чтения для выполнения процедуры подключения. Кстати, используется три вспомогательных процесса:

# Кол-во запускаемых процессов stg-exec.

# Эти процессы отвечают за выполнение скриптов OnConnect, OnDisconnect, ...

# Кол-во процессов означает сколько скриптов могут выполнятся одновременно.

# Значения: 1...1024

ExecutersNum = 3

 

 

Было-бы неплохо глянуть консольный лог старгейзера. К стати, это поможет увидеть чем он занимается при остановке.

Да, и к стати: какая версия, какие модули?

 

версия stg-2.405.9.8, хотя в стартапе пишет 2.404

 

2008-12-10 19:44:53 -- Stg started successfully.

2008-12-10 19:44:53 -- Module: 'Stg configurator v.0.07'. Start successfull. 220

2008-12-10 19:44:53 -- Module: 'Always Online authorizator v.1.0'. Start successfull. 70

2008-12-10 19:44:53 -- Module: 'InetAccess authorizator v.1.2'. Start successfull. 50

2008-12-10 19:44:53 -- Module: 'netflow_cap v.1.3.4'. Start successfull. 15

2008-12-10 19:44:53 -- Traffcounter started successfully.

2008-12-10 19:44:53 -- Users started successfully.

2008-12-10 19:44:53 -- Storage plugin: file_store v.1.02. Loading successfull.

2008-12-10 19:44:52 -- Timer thread started successfully.

2008-12-10 19:44:52 -- Message queue created successfully. msgKey=5555 msgID=1572864

2008-12-10 19:44:52 -- Stg v. Stg 2.404

Ссылка на сообщение
Поделиться на других сайтах

Количество Executers на это не влияет.

Интересует именно консольный лог, а не то что он пишет в /var/log/stargazer.log

Для этого нужно собрать его в debug-режиме ($ ./build debug) - он перестанет дэмонизироваться и будет выводить в консоль, из которой запущен, много ценной информации.

Ссылка на сообщение
Поделиться на других сайтах
Количество Executers на это не влияет.

Интересует именно консольный лог, а не то что он пишет в /var/log/stargazer.log

Для этого нужно собрать его в debug-режиме ($ ./build debug) - он перестанет дэмонизироваться и будет выводить в консоль, из которой запущен, много ценной информации.

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

а из выдержка из /var/log/stargazer.log - ответ на вопрос "какая версия, какие модули?"

Ссылка на сообщение
Поделиться на других сайтах

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

в user.cpp внес поправки чтобы не коннектилось с ip==0 и при конвертации с вышеприведенной ошибкой. завтра посмотрим.

STG_LOCKER lock(&mutex, __FILE__, __LINE__);

if (!fakeConnect && currIP > 0 && inet_ntostr(currIP) != "[inet_ntoa error]" )

{

string scriptOnConnect = settings->GetConfDir() + "/OnConnect";

string scriptOnConnectParams;

Ссылка на сообщение
Поделиться на других сайтах

а компилятор только предупреждает о неопределонном поведении:

user.cpp: In member function 'void USER::Connect(bool)':

user.cpp:594: warning: comparison with string literal results in unspecified behaviour

user.cpp:634: warning: comparison with string literal results in unspecified behaviour

 

похоже что это условие игнорируется,

три случая сообщений [inet_ntoa error] за сегодня.

 

про указатели прочел, но куда их пхать в данном случае не понял.

вот так прокатило без ворнингов:

string err="[inet_ntoa error]";

if (!fakeConnect && currIP > 0 && inet_ntostr(currIP) != err )

Ссылка на сообщение
Поделиться на других сайтах

inet_ntoa возвращает указатель на char.

"[inet_ntoa error]" - это тоже указатель на char.

Сравнение указателей не эквивалентно сравнению строк. А поскольку эти две страки буду распределены в совершенно разной памяти - указатели никогда не совпадут. Именно по этому это условие никогда не выполнится.

Класс std::string имеет переопределенный оператор ==, что позволяет записыват сравнение строк с его использованием.

Ссылка на сообщение
Поделиться на других сайтах

Откуда вобще возникает эта ошибка.

Дело в том, что функция inet_ntoa ни разу не thread-safe. Она использует статически распределенный буфер для хранения результатов своей работы. Одновременный ее вызов приводит к неопределенному поведению.

Ссылка на сообщение
Поделиться на других сайтах

find/grep/wc показал около 11 вхождений inet_ntoa (в основном - отладочный вывод) и аж 67 inet_ntostr - обёртки над inet_ntoa. К стати, это так же может быть причиной падений, обсуждаемых тут:http://local.com.ua/forum/index.php?showtopic=12719

Ссылка на сообщение
Поделиться на других сайтах

К стати, проверка currIP > 0 тоже не нужна. currIP - это PROPERTY, проинстанцированный для типа uint32_t, который не может принимать отрицательных значений.

Ссылка на сообщение
Поделиться на других сайтах

Снимаю шляпу, извиняюсь за безграмотность в данном вопросе.

Дк может просто переписать inet_ntostr без использования inet_ntoa. Я так понял inet_ntoa это не встроенная функция...

Ссылка на сообщение
Поделиться на других сайтах

Извиняться незачто. Если бы не этот топик - вряд-ли я когда-нибуть обратил бы внимание на эту проблему.

Переписать inet_ntostr на использование inet_ntop (к стати, inet_ntoa сейчас обозначена как deprecated) можно. Но она сама по себе не thread-safe и проблема не исчезнет. Сейчас из дому почему-то не могу получить доступа к CVS, но решение проблемы есть. Оставил запись в багтреккере. В понедельник постараюсь заняться ней...

Ссылка на сообщение
Поделиться на других сайтах

Я так понял что inet_ntoa переводит четырехбайтное значение в пямяти в стринговое "хх.хх.хх.хх". Если это так, то такое преобразование можно наваять и без использования внешних функций. В этом случае это будет threadsafe?

Ссылка на сообщение
Поделиться на других сайтах

Зачем ваять то что уже сделано?

thread-safe - это когда функция не имеет состояния. В данном случае состоянием является буфер, в который записывается строковое представление. Для того чтобы сделать преобразование thread-safe достаточно принимать на вход внешний буфер, что и делает inet_ntop. Но дело в том, что для этого внешний буфер нужно распределить - а это усложняет использование функции. То есть, вместо, например такого:

printfd(__FILE__, "IP: %s\n", inet_ntoa(ip));

Прийдется писать нечто вроде:

char buff[32];

inet_ntop(AF_INET, ip, buff, 32);

printfd(__FILE__, "IP: %s\n", buff);

Короче, задача решаема.

Ссылка на сообщение
Поделиться на других сайтах

сообщение inet_ntoa_error более не встречается в connect.log (формируется из скриптов OnConnect-Disconnect).

Исправил только в user.cpp

 

void USER::Connect(bool fakeConnect)

{

...

char buff[32];

inet_ntop(AF_INET, &currIP, buff, 32);

strprintf(&scriptOnConnectParams,

"%s \"%s\" \"%s\" \"%f\" \"%d\" \"%s\"",

scriptOnConnect.c_str(),

login.c_str(),

buff,

(double)cash,

id,

dirsStr);

...

 

void USER::Disconnect(bool fakeDisconnect)

{

...

char buff[32];

inet_ntop(AF_INET, &lastIPForDisconnect, buff, 32);

strprintf(&scriptOnDisonnectParams,

"%s \"%s\" \"%s\" \"%f\" \"%d\" \"%s\"",

scriptOnDisonnect.c_str(),

login.c_str(),

buff,

(double)cash,

id,

dirsStr);

...

user.cpp.zip

Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.

×
×
  • Створити нове...