Jump to content

Новая сборка СТГ 2.4


Recommended Posts

...

Как вообще код СТЖ попадает в перехватчик сигналов ?????

 

У меня при такой реализации код вообще не выходил из главного цикла при SIGINT например......А тупо прерывался где хотел. Ибо не понятно какя именно нить получит сигнал. Или что то я не понимаю.....

 

А что касается того что я говорил:

 

Для неотделенного (PTHREAD_CREATE_JOINABLE) потока очень важно, чтобы после того, как он завершится, к нему присоединился другой поток, - иначе ресурсы этого потока не будут освобождены для использования новыми потоками. Это обычно приводит к утечке памяти. Если не требуется создавать поток, который будет присоединен, нужно создавать его ОТДЕЛЬНЫМ.

 

 

вообщем спорить здесь нечего - у меня все завелось и работает в отличие от СТЖ

 

а разработчику советую поссмотреть в сторону sigwait и в сторону отключаемых потоков и еще поссмотри здесь. Думаю здесь самое правильно решение http://damao.net/vhosts/node.to/sigtest.tgz

 

а то что завелся одиночный поток - это еще не показатель.

По первому. Перехватчики сигналов определены в main.cpp. В частности, CatchTERM:

void CatchTERM(int sig)
{
/*
*Function Name:CatchINT
*Parameters: sig_num - номер сигнала
*Description: Обработчик сигнала INT
*Returns: Ничего
*/
STG_LOGGER & WriteServLog = GetStgLogger();
WriteServLog("Shutting down... %d", sig);

//nonstop = false;
nonstop.Stop(__FILE__, __LINE__);

struct sigaction newsa, oldsa;
sigset_t sigmask;

sigemptyset(&sigmask);
sigaddset(&sigmask, SIGTERM);
newsa.sa_handler = SIG_IGN;
newsa.sa_mask = sigmask;
newsa.sa_flags = 0;
sigaction(SIGTERM, &newsa, &oldsa);

sigemptyset(&sigmask);
sigaddset(&sigmask, SIGINT);
newsa.sa_handler = SIG_IGN;
newsa.sa_mask = sigmask;
newsa.sa_flags = 0;
sigaction(SIGINT, &newsa, &oldsa);
}

отвечает за обработкe сигналов SIGTERM и SIGINT:

///////
sigemptyset(&sigmask);
sigaddset(&sigmask, SIGTERM);
newsa.sa_handler = CatchTERM;
newsa.sa_mask = sigmask;
newsa.sa_flags = 0;
sigaction(SIGTERM, &newsa, &oldsa);
...

///////
sigemptyset(&sigmask);
sigaddset(&sigmask, SIGINT);
newsa.sa_handler = CatchTERM;
newsa.sa_mask = sigmask;
newsa.sa_flags = 0;
sigaction(SIGINT, &newsa, &oldsa);

Приводит к останову главноого цикла:

while (nonstop.GetStatus())
   {
   if (needRulesReloading)
       {
       needRulesReloading = false;
       traffCnt->Reload();
       }            
   stgUsleep(100000);
   }

За которым следует код остановки всех подсистем.

 

Все порождаемые stg нити работают от старта до останова системы. По этому, даже если после их завершения остались неосвобожденные ресурсы (тут я согласен, по документации joinable threads оставляют ресурсы до pthread_join) - они буду освобождены ОС, т.к. после останова потоков программа завершает свою работу.

Да, во многих потоках которые блокируются на прослушке порта останов реализован посылом dummy packet. Хорошее или плохое это решение - хз. Ничем не хуже посыла потоку сигнала (pthread_kill), который приведет к снятию блокировки с возвратом -1 и errno = EINTR.

Link to post
Share on other sites
  • Replies 545
  • Created
  • Last Reply

Top Posters In This Topic

to madf, stg34

 

СОВЕТУЮ ПРОЧЕСТЬ

 

http://publib.boulder.ibm.com/infocenter/s...cNode=int_14825

 


Обработчики сигналов и маски сигналов

Обработчики сигналов относятся к уровню процесса. Для ожидания сигналов настоятельно рекомендуется применять функцию sigwait. Функцию sigaction применять не рекомендуется, так как список обработчиков сигналов хранится на уровне процесса, и любая нить процесса может изменять его. Если две нити указали один и тот же сигнал в обработчике сигналов, то вторая нить, вызвавшая функцию sigaction, переопределит параметры, заданные первой нитью; предсказать порядок, в котором будут выполняться нити, в общем случае невозможно.

Маски сигналов обслуживаются на уровне нитей. У каждой нити может быть свой набор сигналов, доставку которых она заблокирует. Для работы с маской сигналов вызывающей нити следует применять функцию sigthreadmask. Функцию sigprocmask не следует применять в программах с несколькими нитями - это может привести к непредсказуемым результатам.

Функция pthread_sigmask во многом схожа с функцией sigprocmask. Параметры и способы применения обеих функций одинаковы. При преобразовании существующей программы в версию с поддержкой библиотеки нитей функцию sigprocmask можно заменить на pthread_sigmask.

Link to post
Share on other sites

1. На RSDN все написано верно.

2. В цитате все написано верно.

 

Проблема заключается в том, что ты действительно, видимо, не понимаеш, как работает Stargazer. На самом деле все просто. Обработчик сигналов у нас 1 на все приложение, а не для каждой нити. Практически все нити "висят" на блокирующем read. Также есть главный цикл, который раз в 100 мс проверяет необходимость перезагрузки правил.

Когда происходит прерывание по сигналу - вызывается обработчик. В како нити это произошло - не важно. Обработчик работает с глобальным объектом nonstop:

//-----------------------------------------------------------------------------
class STG_STOPPER
{
public:
   STG_STOPPER() { nonstop = true; }
   bool    GetStatus() { return nonstop; };
   void    Stop(const char * __file__, int __line__)
       {
       #ifdef NO_DAEMON
       printfd(__FILE__, "Stg stopped at %s:%d\n", __file__, __line__);
       #endif
       nonstop = false;
       }
private: 
   bool nonstop;
};
//-----------------------------------------------------------------------------
STG_STOPPER nonstop;
//-----------------------------------------------------------------------------

После вызова метода Stop этого объекта обработчик завершает свою работу и управление передается обратно в точку прерывания.

Максимум через 100 мс главный цикл проверит условие выхода (в нем нет блокирующих вызовов) и завершится. После этого начинается процесс останова системы, который обсудили выше (dummy packets vs. pthread_kill).

 

По поводу необходимости вызова pthread_join я уже писал выше: потоки создаются 1 раз (при старте программы) и завершаются 1 раз (при останове). Утечки памяти не происходит.

 

Я не вижу никаких потиворечий в обработке сигналов с тем, что написано по указанным тобой ссылкам. И не понимаю, почему ты считаеш, что Stargazer не может работать.

Link to post
Share on other sites
И не понимаю, почему ты считаеш, что Stargazer не может работать.

Он и не работает - когда делаешь kill процессу. Кто сказал что он работает?

 

В файлах нули, в фиреберде мусор.

 

Еще раз повторюсь ОС FreeBSD 6.3

 

Если бы писали как рекомендует RSDN - я бы тему не поднимал

Link to post
Share on other sites
Скорее всего потому что за 5 сек не успевает сохраниться инфа в базе.

И всеж пересмотрите работу с потоками., а именно обработчик сигналов.

 

PS

 

BPF подправили?

Link to post
Share on other sites
А что касается глюков fork и POSIX Threads - может все дело не в "старых ядрах", а в не умелом использовании нитей. ;-)

Учить матчасть, и только потом философствовать о потоках.

Link to post
Share on other sites
А что касается глюков  fork и POSIX Threads - может все дело не в "старых ядрах", а в не умелом использовании нитей. ;-)

Учить матчасть, и только потом философствовать о потоках.

Учитесь прислушиваться )) У меня с мат частью все нормально. Я на потоки убил очень много времении и в своем приложении сделал так как все нужно, как книжка пишет.

 

а вам еще раз следует прочитать

 

 

Обработчики сигналов и маски сигналов

 

Обработчики сигналов относятся к уровню процесса. Для ожидания сигналов настоятельно рекомендуется применять функцию sigwait. Функцию sigaction применять не рекомендуется, так как список обработчиков сигналов хранится на уровне процесса, и любая нить процесса может изменять его. Если две нити указали один и тот же сигнал в обработчике сигналов, то вторая нить, вызвавшая функцию sigaction, переопределит параметры, заданные первой нитью; предсказать порядок, в котором будут выполняться нити, в общем случае невозможно.

 

Маски сигналов обслуживаются на уровне нитей. У каждой нити может быть свой набор сигналов, доставку которых она заблокирует. Для работы с маской сигналов вызывающей нити следует применять функцию sigthreadmask. Функцию sigprocmask не следует применять в программах с несколькими нитями - это может привести к непредсказуемым результатам.

 

Функция pthread_sigmask во многом схожа с функцией sigprocmask. Параметры и способы применения обеих функций одинаковы. При преобразовании существующей программы в версию с поддержкой библиотеки нитей функцию sigprocmask можно заменить на pthread_sigmask.

Link to post
Share on other sites

Попытался запустить конвертор, вот что пишет:

./convertor

main.cpp > 23:26:19 > Start

main.cpp > 23:26:19 > Importing admins:

main.cpp > 23:26:19 > - admin

main.cpp > 23:26:19 > Importing tariffs:

main.cpp > 23:26:19 > - tariff

main.cpp > 23:26:19 > Importing services:

main.cpp > 23:26:19 > Importing corporations:

main.cpp > 23:26:19 > Importing users:

main.cpp > 23:26:19 > - test

main.cpp > 23:26:19 > (adding passed)

convertor in free(): error: chunk is already free

Abort (core dumped)

Link to post
Share on other sites
Попытался запустить конвертор, вот что пишет:

./convertor

main.cpp > 23:26:19 > Start

main.cpp > 23:26:19 > Importing admins:

main.cpp > 23:26:19 > - admin

main.cpp > 23:26:19 > Importing tariffs:

main.cpp > 23:26:19 > - tariff

main.cpp > 23:26:19 > Importing services:

main.cpp > 23:26:19 > Importing corporations:

main.cpp > 23:26:19 > Importing users:

main.cpp > 23:26:19 > - test

main.cpp > 23:26:19 > (adding passed)

convertor in free(): error: chunk is already free

Abort (core dumped)

Откуда и куда конвертиш?

Исходники, бинарники и корку, если не сложно, упакуй и закинь в faust@stg.dp.ua

Link to post
Share on other sites
2Stiff:

баг подтвержден. Ошибка в конфигураторе. Поправляем.

Поправленный выложили? А то 1.88.9 уже и найти не могу, а тарифы в download не становятся...

Link to post
Share on other sites
  • 2 weeks later...

Может немного не по теме но назрела необходимость. Нужно знать какой админ и с какого IP конектился конфигуратором а в логи стг это почемуто не ложит..... Вопрос почему????? (FreeBSD 6.0, stg-2.4-2007.01.06-15.46.32)

Заранее спасибо!

Link to post
Share on other sites

Не врите, молодой человек.

/var/log/stargazer.log:

2008-02-19 16:53:00 -- Admin 'admin', 127.0.0.1: User 'test': 'IP' parameter changed from '10.0.0.10' to '192.168.1.17'.

Уже как минимум год. А может и больше.

Link to post
Share on other sites
2Stiff:

баг подтвержден. Ошибка в конфигураторе. Поправляем.

Поправленный выложили? А то 1.88.9 уже и найти не могу, а тарифы в download не становятся...

sgconfig.1.90.9.win.exe

Link to post
Share on other sites
2Stiff:

баг подтвержден. Ошибка в конфигураторе. Поправляем.

Поправленный выложили? А то 1.88.9 уже и найти не могу, а тарифы в download не становятся...

sgconfig.1.90.9.win.exe

Можно ли узнать кой какую деталь..... Я так понимаю исходников "компонент" относящихся к старгейзеру более не будет? Проект переходит плавно в проект с закрытым кодом?

Link to post
Share on other sites

версия 2.405 в логе высвечивается старая версия:

2008-05-23 08:17:19 -- Stg v. Stg 2.404

2008-05-23 08:17:19 -- Message queue created successfully. msgKey=5555 msgID=589824

2008-05-23 08:17:19 -- Timer thread started successfully.

2008-05-23 08:17:19 -- Storage plugin: file_store v.1.02. Loading successfull.

2008-05-23 08:17:21 -- Users started successfully.

в файле raw_ip_packet.h все так же неисправленно:

inline uint32_t RAW_PACKET::GetLen() const

из-за чего диверт считает мусорный ветер.

за отключение детальной статистики - спасибо.

Link to post
Share on other sites

Гента, 1,8 атлонХп, 256 рам, 40-50 юзеров.

 

stg-2.405.9.8 валится вот с такими вот письменами (собран с дебагом):

 

ping.cpp > 11:19:08 > pinger.DelIP 0.0.0.0
         ping.cpp > 11:19:08 > pingerCurrIP.AddIP 10.0.0.78
         user.cpp > 11:19:08 > USER::WriteStat user=Ibragim
   inetaccess.cpp > 11:19:08 > Min8(sizeof(ALIVE_SYN)) = 368
   inetaccess.cpp > 11:19:08 > 1212131990.928739 368 bytes sent to 10.0.0.78:5555 len=368
   inetaccess.cpp > 11:19:08 > Monitor time 1212079955 1212132008
   inetaccess.cpp > 11:19:08 > recv from 10.0.1.133 5555 len=64
   inetaccess.cpp > 11:19:08 > User OliaSh FOUND!
   inetaccess.cpp > 11:19:08 > ======================>   InitEncrypt dont needed
   inetaccess.cpp > 11:19:08 > Monitor time 1212079955 1212132008
   inetaccess.cpp > 11:19:08 > recv from 10.0.0.40 5555 len=64
   inetaccess.cpp > 11:19:08 > User Tarubarova FOUND!
   inetaccess.cpp > 11:19:08 > ======================>   InitEncrypt dont needed
   inetaccess.cpp > 11:19:08 > CONN_ACK
   inetaccess.cpp > 11:19:08 > rnd = 682568960 connAck->rnd=682568961
   inetaccess.cpp > 11:19:08 > Min8(sizeof(ALIVE_SYN)) = 368
   inetaccess.cpp > 11:19:08 > 1212131990.929062 368 bytes sent to 10.0.0.40:5555 len=368
   inetaccess.cpp > 11:19:08 > Monitor time 1212079955 1212132008
   inetaccess.cpp > 11:19:08 > recv from 10.0.3.13 5555 len=64
   inetaccess.cpp > 11:19:08 > User trio FOUND!
   inetaccess.cpp > 11:19:08 > ======================>   InitEncrypt dont needed
   inetaccess.cpp > 11:19:08 > CONN_ACK
   inetaccess.cpp > 11:19:08 > rnd = 116568813 connAck->rnd=116568814
   inetaccess.cpp > 11:19:08 > Min8(sizeof(ALIVE_SYN)) = 368
   inetaccess.cpp > 11:19:08 > 1212131990.930713 368 bytes sent to 10.0.3.13:5555 len=368
   inetaccess.cpp > 11:19:08 > Monitor time 1212079955 1212132008
         user.cpp > 11:19:08 > USER::WriteStat user=hellstad
   inetaccess.cpp > 11:19:08 > recv from 10.0.1.152 5555 len=64
   inetaccess.cpp > 11:19:08 > User BarsovaA FOUND!
   inetaccess.cpp > 11:19:08 > ======================>   InitEncrypt dont needed
   inetaccess.cpp > 11:19:08 > CONN_ACK
   inetaccess.cpp > 11:19:08 > rnd = 283691498 connAck->rnd=283691499
        users.cpp > 11:19:08 > Add IP Idx
 traffcounter.cpp > 11:19:08 > AddUser: BarsovaA
         ping.cpp > 11:19:08 > pinger.DelIP 0.0.0.0
         ping.cpp > 11:19:08 > pingerCurrIP.AddIP 10.0.1.152
Ошибка сегментирования

 

В /var/log/stargazer.log следущее:

 

 

2008-05-29 20:53:35 -- Stg v. Stg 2.404
2008-05-29 20:53:35 -- Message queue created successfully. msgKey=5555 msgID=2031616
2008-05-29 20:53:35 -- Timer thread started successfully.
2008-05-29 20:53:35 -- Storage plugin: mysql_store v.0.67. Loading successfull.
2008-05-29 20:53:35 -- Users started successfully.
2008-05-29 20:53:35 -- Traffcounter started successfully.
2008-05-29 20:53:35 -- Module: 'ipq_cap v.1.1'. Start successfull. 0
2008-05-29 20:53:35 -- Module: 'InetAccess authorizator v.1.2'. Start successfull. 50
2008-05-29 20:53:35 -- Module: 'Always Online authorizator v.1.0'. Start successfull. 70
2008-05-29 20:53:37 -- Module: 'Pinger v.1.01'. Start successfull. 100
2008-05-29 20:53:37 -- Module: 'Stg configurator v.0.07'. Start successfull. 220
2008-05-29 20:53:37 -- Stg started successfully.
2008-05-29 20:53:37 -- +++++++++++++++++++++++++++++++++++++++++++++
2008-05-30 09:29:56 -- User's connect failed. IP '10.0.0.29'. Wrong login or password
2008-05-30 10:29:44 -- User's connect failed. IP '10.0.0.81'. Wrong login or password
2008-05-30 11:35:41 -- Stg v. Stg 2.404
2008-05-30 11:35:41 -- Message queue created successfully. msgKey=5555 msgID=2064384
2008-05-30 11:35:41 -- Timer thread started successfully.
2008-05-30 11:35:41 -- Storage plugin: mysql_store v.0.67. Loading successfull.
2008-05-30 11:35:41 -- Users started successfully.
2008-05-30 11:35:41 -- Traffcounter started successfully.
2008-05-30 11:35:41 -- Module: 'ipq_cap v.1.1'. Start successfull. 0
2008-05-30 11:35:41 -- Module: 'InetAccess authorizator v.1.2'. Start successfull. 50
2008-05-30 11:35:41 -- Module: 'Always Online authorizator v.1.0'. Start successfull. 70
2008-05-30 11:35:41 -- Module: 'Pinger v.1.01'. Start successfull. 100
2008-05-30 11:35:41 -- Module: 'Stg configurator v.0.07'. Start successfull. 220
2008-05-30 11:35:42 -- Stg started successfully.

 

Куда можно покопать?

Link to post
Share on other sites
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...