napTu Опубликовано: 10 грудня, 2008 Опубликовано: 10 грудня, 2008 Периодически поступают жалобы на невозможность пользоваться интернетом. Авторизатор нормально подключается и отключается, но скрипты не отрабатываются. Лог подключений абонента не меняется и выглядит так: ... 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 Опубліковано: 10 грудня, 2008 Автор Опубліковано: 10 грудня, 2008 еще пару наблюдений: у проблемного абонента похоже не меняется статус в конфигураторе - постоянно висит онлайн (не уверен, пронаблюдаю в след.раз если нужно); сервер не убивается быстро (как обычно менее минуты) по killall stargazer, а висит дольше обычного. Я его добиваю по kill -12
Kucher2 Опубліковано: 10 грудня, 2008 Опубліковано: 10 грудня, 2008 Проверьте загрузку сервера, может СТГ что-то мешает. Можно иногда проверять работоспособность СТГ и ребутить его, по типу этого: http://local.com.ua/forum/index.php?showtopic=10568 И ещё, у человека похожая трабла: http://local.com.ua/forum/index.php?showtopic=13048 Так же попробуйте ввести "inet_ntoa error" в строке поисковика - возможно это поможет вам понять суть проблемы.
napTu Опубліковано: 10 грудня, 2008 Автор Опубліковано: 10 грудня, 2008 хм... Проверьте загрузку сервера, может СТГ что-то мешает. - не мешаетМожно иногда проверять работоспособность СТГ и ребутить его, по типу этого:http://local.com.ua/forum/index.php?showtopic=10568 - мне проще самому найти ошибку в сервере, чем его кроном ребутить псевдослучайным образом в такт когда у одного из тысячи абонентов случается траблИ ещё, у человека похожая трабла:http://local.com.ua/forum/index.php?showtopic=13048 - этим человеком я и есть, траблу давно порешали.Так же попробуйте ввести "inet_ntoa error" в строке поисковика - возможно это поможет вам понять суть проблемы. это я сделал в первую очередь
trinity0333 Опубліковано: 11 грудня, 2008 Опубліковано: 11 грудня, 2008 # INET_NTOA (выражение). Принимает сетевой адрес в виде числа (4- или 8-байтного), возвращает адрес, представленный строкой, состоящей из четырех чисел, разделенных точкой. mysql> SELECT INET_NTOA(3520061480); -> '209.207.224.40' Функция INET_NTOA () появилась в MySQL 3.23.15. что-то мне подсказывает что айпи этого абонента вбит криво в базу.. может пробелы, или какие-то другие символы ..
madf Опубліковано: 11 грудня, 2008 Опубліковано: 11 грудня, 2008 Было-бы неплохо глянуть консольный лог старгейзера. К стати, это поможет увидеть чем он занимается при остановке. Да, и к стати: какая версия, какие модули?
napTu Опубліковано: 11 грудня, 2008 Автор Опубліковано: 11 грудня, 2008 Функция 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 Опубліковано: 11 грудня, 2008 Опубліковано: 11 грудня, 2008 Количество Executers на это не влияет. Интересует именно консольный лог, а не то что он пишет в /var/log/stargazer.log Для этого нужно собрать его в debug-режиме ($ ./build debug) - он перестанет дэмонизироваться и будет выводить в консоль, из которой запущен, много ценной информации.
napTu Опубліковано: 11 грудня, 2008 Автор Опубліковано: 11 грудня, 2008 Количество Executers на это не влияет.Интересует именно консольный лог, а не то что он пишет в /var/log/stargazer.log Для этого нужно собрать его в debug-режиме ($ ./build debug) - он перестанет дэмонизироваться и будет выводить в консоль, из которой запущен, много ценной информации. про консольный лог я проигнорировал, ибо это гемор. будет время, займусь. а из выдержка из /var/log/stargazer.log - ответ на вопрос "какая версия, какие модули?"
napTu Опубліковано: 11 грудня, 2008 Автор Опубліковано: 11 грудня, 2008 глянул общий лог на предмет подобных ошибок, стало страшно - с десяток за день набежало, но абоненты в большинстве случаев нормально потом отключались и подключались заново. в 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 Опубліковано: 12 грудня, 2008 Опубліковано: 12 грудня, 2008 inet_ntostr(currIP) != "[inet_ntoa error]" - не выполнится никогда Читать про указатели в С
napTu Опубліковано: 12 грудня, 2008 Автор Опубліковано: 12 грудня, 2008 а компилятор только предупреждает о неопределонном поведении: 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 Опубліковано: 13 грудня, 2008 Опубліковано: 13 грудня, 2008 inet_ntoa возвращает указатель на char. "[inet_ntoa error]" - это тоже указатель на char. Сравнение указателей не эквивалентно сравнению строк. А поскольку эти две страки буду распределены в совершенно разной памяти - указатели никогда не совпадут. Именно по этому это условие никогда не выполнится. Класс std::string имеет переопределенный оператор ==, что позволяет записыват сравнение строк с его использованием.
madf Опубліковано: 13 грудня, 2008 Опубліковано: 13 грудня, 2008 Откуда вобще возникает эта ошибка. Дело в том, что функция inet_ntoa ни разу не thread-safe. Она использует статически распределенный буфер для хранения результатов своей работы. Одновременный ее вызов приводит к неопределенному поведению.
madf Опубліковано: 13 грудня, 2008 Опубліковано: 13 грудня, 2008 find/grep/wc показал около 11 вхождений inet_ntoa (в основном - отладочный вывод) и аж 67 inet_ntostr - обёртки над inet_ntoa. К стати, это так же может быть причиной падений, обсуждаемых тут:http://local.com.ua/forum/index.php?showtopic=12719
madf Опубліковано: 13 грудня, 2008 Опубліковано: 13 грудня, 2008 К стати, проверка currIP > 0 тоже не нужна. currIP - это PROPERTY, проинстанцированный для типа uint32_t, который не может принимать отрицательных значений.
napTu Опубліковано: 13 грудня, 2008 Автор Опубліковано: 13 грудня, 2008 Снимаю шляпу, извиняюсь за безграмотность в данном вопросе. Дк может просто переписать inet_ntostr без использования inet_ntoa. Я так понял inet_ntoa это не встроенная функция...
madf Опубліковано: 13 грудня, 2008 Опубліковано: 13 грудня, 2008 Извиняться незачто. Если бы не этот топик - вряд-ли я когда-нибуть обратил бы внимание на эту проблему. Переписать inet_ntostr на использование inet_ntop (к стати, inet_ntoa сейчас обозначена как deprecated) можно. Но она сама по себе не thread-safe и проблема не исчезнет. Сейчас из дому почему-то не могу получить доступа к CVS, но решение проблемы есть. Оставил запись в багтреккере. В понедельник постараюсь заняться ней...
napTu Опубліковано: 13 грудня, 2008 Автор Опубліковано: 13 грудня, 2008 Я так понял что inet_ntoa переводит четырехбайтное значение в пямяти в стринговое "хх.хх.хх.хх". Если это так, то такое преобразование можно наваять и без использования внешних функций. В этом случае это будет threadsafe?
madf Опубліковано: 13 грудня, 2008 Опубліковано: 13 грудня, 2008 Зачем ваять то что уже сделано? 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); Короче, задача решаема.
madf Опубліковано: 22 грудня, 2008 Опубліковано: 22 грудня, 2008 Есть результаты? Можешь кинуть мне патчи (относительно stg-2.405)?
napTu Опубліковано: 23 грудня, 2008 Автор Опубліковано: 23 грудня, 2008 сообщение 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 Опубліковано: 23 грудня, 2008 Опубліковано: 23 грудня, 2008 Дело в том, что: $ find ./ -name \*cpp -exec grep inet_ntostr {} \; | wc -l 67
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас