napTu 4 Опубликовано: 2008-12-10 18:33:10 Share Опубликовано: 2008-12-10 18:33:10 Периодически поступают жалобы на невозможность пользоваться интернетом. Авторизатор нормально подключается и отключается, но скрипты не отрабатываются. Лог подключений абонента не меняется и выглядит так: ... 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 Последняя строка сигнализирует об ошибке, которая лечится только перезапуском сервера. Есть лекарство? Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2008-12-10 18:42:05 Автор Share Опубліковано: 2008-12-10 18:42:05 еще пару наблюдений: у проблемного абонента похоже не меняется статус в конфигураторе - постоянно висит онлайн (не уверен, пронаблюдаю в след.раз если нужно); сервер не убивается быстро (как обычно менее минуты) по killall stargazer, а висит дольше обычного. Я его добиваю по kill -12 Ссылка на сообщение Поделиться на других сайтах
Kucher2 122 Опубліковано: 2008-12-10 19:41:03 Share Опубліковано: 2008-12-10 19:41:03 Проверьте загрузку сервера, может СТГ что-то мешает. Можно иногда проверять работоспособность СТГ и ребутить его, по типу этого: http://local.com.ua/forum/index.php?showtopic=10568 И ещё, у человека похожая трабла: http://local.com.ua/forum/index.php?showtopic=13048 Так же попробуйте ввести "inet_ntoa error" в строке поисковика - возможно это поможет вам понять суть проблемы. Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2008-12-10 20:40:53 Автор Share Опубліковано: 2008-12-10 20:40:53 хм... Проверьте загрузку сервера, может СТГ что-то мешает. - не мешаетМожно иногда проверять работоспособность СТГ и ребутить его, по типу этого:http://local.com.ua/forum/index.php?showtopic=10568 - мне проще самому найти ошибку в сервере, чем его кроном ребутить псевдослучайным образом в такт когда у одного из тысячи абонентов случается траблИ ещё, у человека похожая трабла:http://local.com.ua/forum/index.php?showtopic=13048 - этим человеком я и есть, траблу давно порешали.Так же попробуйте ввести "inet_ntoa error" в строке поисковика - возможно это поможет вам понять суть проблемы. это я сделал в первую очередь Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-11 06:13:38 Share Опубліковано: 2008-12-11 06:13:38 Хм, занятно. Ссылка на сообщение Поделиться на других сайтах
trinity0333 11 Опубліковано: 2008-12-11 08:40:08 Share Опубліковано: 2008-12-11 08:40:08 # INET_NTOA (выражение). Принимает сетевой адрес в виде числа (4- или 8-байтного), возвращает адрес, представленный строкой, состоящей из четырех чисел, разделенных точкой. mysql> SELECT INET_NTOA(3520061480); -> '209.207.224.40' Функция INET_NTOA () появилась в MySQL 3.23.15. что-то мне подсказывает что айпи этого абонента вбит криво в базу.. может пробелы, или какие-то другие символы .. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-11 08:50:58 Share Опубліковано: 2008-12-11 08:50:58 Было-бы неплохо глянуть консольный лог старгейзера. К стати, это поможет увидеть чем он занимается при остановке. Да, и к стати: какая версия, какие модули? Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2008-12-11 09:29:31 Автор Share Опубліковано: 2008-12-11 09:29:31 Функция 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 Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-11 09:49:29 Share Опубліковано: 2008-12-11 09:49:29 Количество Executers на это не влияет. Интересует именно консольный лог, а не то что он пишет в /var/log/stargazer.log Для этого нужно собрать его в debug-режиме ($ ./build debug) - он перестанет дэмонизироваться и будет выводить в консоль, из которой запущен, много ценной информации. Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2008-12-11 13:00:10 Автор Share Опубліковано: 2008-12-11 13:00:10 Количество Executers на это не влияет.Интересует именно консольный лог, а не то что он пишет в /var/log/stargazer.log Для этого нужно собрать его в debug-режиме ($ ./build debug) - он перестанет дэмонизироваться и будет выводить в консоль, из которой запущен, много ценной информации. про консольный лог я проигнорировал, ибо это гемор. будет время, займусь. а из выдержка из /var/log/stargazer.log - ответ на вопрос "какая версия, какие модули?" Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2008-12-11 22:29:23 Автор Share Опубліковано: 2008-12-11 22:29:23 глянул общий лог на предмет подобных ошибок, стало страшно - с десяток за день набежало, но абоненты в большинстве случаев нормально потом отключались и подключались заново. в 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; Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-12 06:24:03 Share Опубліковано: 2008-12-12 06:24:03 inet_ntostr(currIP) != "[inet_ntoa error]" - не выполнится никогда Читать про указатели в С Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2008-12-12 21:59:25 Автор Share Опубліковано: 2008-12-12 21:59:25 а компилятор только предупреждает о неопределонном поведении: 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 ) Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-13 15:18:14 Share Опубліковано: 2008-12-13 15:18:14 inet_ntoa возвращает указатель на char. "[inet_ntoa error]" - это тоже указатель на char. Сравнение указателей не эквивалентно сравнению строк. А поскольку эти две страки буду распределены в совершенно разной памяти - указатели никогда не совпадут. Именно по этому это условие никогда не выполнится. Класс std::string имеет переопределенный оператор ==, что позволяет записыват сравнение строк с его использованием. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-13 15:21:24 Share Опубліковано: 2008-12-13 15:21:24 Откуда вобще возникает эта ошибка. Дело в том, что функция inet_ntoa ни разу не thread-safe. Она использует статически распределенный буфер для хранения результатов своей работы. Одновременный ее вызов приводит к неопределенному поведению. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-13 15:32:45 Share Опубліковано: 2008-12-13 15:32:45 find/grep/wc показал около 11 вхождений inet_ntoa (в основном - отладочный вывод) и аж 67 inet_ntostr - обёртки над inet_ntoa. К стати, это так же может быть причиной падений, обсуждаемых тут:http://local.com.ua/forum/index.php?showtopic=12719 Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-13 15:42:11 Share Опубліковано: 2008-12-13 15:42:11 К стати, проверка currIP > 0 тоже не нужна. currIP - это PROPERTY, проинстанцированный для типа uint32_t, который не может принимать отрицательных значений. Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2008-12-13 18:49:44 Автор Share Опубліковано: 2008-12-13 18:49:44 Снимаю шляпу, извиняюсь за безграмотность в данном вопросе. Дк может просто переписать inet_ntostr без использования inet_ntoa. Я так понял inet_ntoa это не встроенная функция... Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-13 18:56:47 Share Опубліковано: 2008-12-13 18:56:47 Извиняться незачто. Если бы не этот топик - вряд-ли я когда-нибуть обратил бы внимание на эту проблему. Переписать inet_ntostr на использование inet_ntop (к стати, inet_ntoa сейчас обозначена как deprecated) можно. Но она сама по себе не thread-safe и проблема не исчезнет. Сейчас из дому почему-то не могу получить доступа к CVS, но решение проблемы есть. Оставил запись в багтреккере. В понедельник постараюсь заняться ней... Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2008-12-13 21:08:26 Автор Share Опубліковано: 2008-12-13 21:08:26 Я так понял что inet_ntoa переводит четырехбайтное значение в пямяти в стринговое "хх.хх.хх.хх". Если это так, то такое преобразование можно наваять и без использования внешних функций. В этом случае это будет threadsafe? Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-13 21:18:04 Share Опубліковано: 2008-12-13 21:18:04 Зачем ваять то что уже сделано? 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); Короче, задача решаема. Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2008-12-20 21:00:29 Автор Share Опубліковано: 2008-12-20 21:00:29 спасибо, реализовал. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-22 09:44:49 Share Опубліковано: 2008-12-22 09:44:49 Есть результаты? Можешь кинуть мне патчи (относительно stg-2.405)? Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2008-12-23 13:09:40 Автор Share Опубліковано: 2008-12-23 13:09:40 сообщение 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 Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-12-23 13:13:35 Share Опубліковано: 2008-12-23 13:13:35 Дело в том, что: $ find ./ -name \*cpp -exec grep inet_ntostr {} \; | wc -l 67 Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас