Регистрация

Не работает kill -s SIGUSR2 на Linux

Обсуждение вопросов по администрированию СУБД Progress OpenEdge
Старожил
Сообщения: 94
Зарегистрирован: Чт май 21, 2009 4:41 pm

Не работает kill -s SIGUSR2 на Linux

Сообщение idl » Ср мар 05, 2014 1:06 pm

Добрый день.

OpenEdge 10.2B(SP 04,07,08)
В соответствии с [url]
http://knowledgebase.progress.com/artic ... le/P133912
[/url]
SIGUSR2 (user defined signal 2): terminate the process


На Linux (SuSE, CentOS) _progres не останавливается. Ведет себя похоже на нажатие Ctrl-C
Вот начало strace
Код: Выделить всё
select(1024, [0], NULL, NULL, NULL)     = ? ERESTARTNOHAND (To be restarted)
--- SIGUSR2 (User defined signal 2) @ 0 (0) ---
rt_sigreturn(0xe7e6c0)                  = -1 EINTR (Interrupted system call)
write(1, "\33[46;86H\33[K\33[3;1H", 17) = 17
write(1, "\33[46;91H", 8)               = 8
semctl(688131, 3, SETVAL, 0x2ae600000000) = 0
semctl(688131, 3, SETVAL, 0x2ae600000000) = 0



Для сравнения обработка kill -s SIGTERM
Код: Выделить всё
select(1024, [0], NULL, NULL, NULL)     = ? ERESTARTNOHAND (To be restarted)
--- SIGTERM (Terminated) @ 0 (0) ---
lseek(3, 24138, SEEK_SET)               = 24138
read(3, "%BKILL signal received. (298)\0\0\0"..., 81) = 81
write(6, "[2014/03/05@12:11:47.552+0400] P"..., 105) = 105
write(1, "\33[44;1H\33[7mKILL signal received."..., 38) = 38
lseek(3, 82215, SEEK_SET)               = 82215
read(3, "Database %s was disconnected. (1"..., 81) = 81



Не может ли кто-нибудь подсказать в чем дело?

Старожил
Аватара пользователя
Сообщения: 2871
Зарегистрирован: Ср май 12, 2004 6:03 pm
Откуда: Питер

Re: Не работает kill -s SIGUSR2 на Linux

Сообщение George » Чт мар 06, 2014 10:09 am

Статья в knowledgebase неточно описывает реакцию Progress'а на SIGUSR2. Этот сигнал используется утилитой proshut для отключения пользователя. Proshut устанавливает в разделяемой памяти флаг отключения пользователя (usertodie) и посылает ему сигнал SIGUSR2. В ответ на этот сигнал пользовательская сессия прерывает свою работу, проверяет флаг в разделяемой памяти и отключается от базы. По умолчанию отключение от одной из баз, к которым сессия была подключена, не означает завершение работы этой сессии. Т.е. здесь роль сигнала SIGUSR2 именно в прерывании работы - как и у SIGINT (Ctl+C).

Старожил
Сообщения: 94
Зарегистрирован: Чт май 21, 2009 4:41 pm

Re: Не работает kill -s SIGUSR2 на Linux

Сообщение idl » Чт мар 06, 2014 11:12 am

Мой вопрос и вызван proshut. Я видел, что используется SIGUSR2.
Код: Выделить всё
P-2446       T-47833207651248 I SHUT    9: (542)   Server shutdown started by dba on /dev/pts/3.
P-2079       T-47012949896112 I BROKER  0: (15193) The normal shutdown of the database will cont
P-2079       T-47012949896112 I BROKER  0: (2248)  Begin normal shutdown
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 5
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 6
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 7
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 8
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 11
P-2086       T-47072525036464 I WDOG    5: (2519)  Disconnected.

И видел, по реакции процессов, что это не в чистом виде SIGUSR2.
Огромное спасибо George за разъяснение.

Но мой вопрос был связан, в первую очередь, с разницей реакции _progres на SIGUSR2 в разных системах. Как реагирует Линукс, я уже показал в вопросе.
А вот другие:
AIX
Код: Выделить всё
_select(0, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000) Err#4  EINTR
    Received signal #31, SIGUSR2 [caught]
sigprocmask(2, 0x09001000A0357AC8, 0x0FFFFFFFFFFF9F80) = 0
_sigaction(31, 0x00000001102BD208, 0x0000000000000000) = 0
thread_setmystate(0x0FFFFFFFFFFF9B70, 0x0000000000000000) = 0
klseek(3, 354375, 0, 0x0FFFFFFFFFFF97E0)        = 0
kread(3, " % L R e c e i v e d   s".., 81)      = 81
_getpid()                                       = 15664096
kwrite(6, " [ 2 0 1 4 / 0 3 / 0 4 @".., 114)    = 114
...
...
close(5)                                        = 0
kfcntl(1, F_GETFL, 0x00000000140F03BF)          = 67110914
kfcntl(2, F_GETFL, 0x00000000140F03BF)          = 67110914
_exit(2)

UnixWare
Код: Выделить всё
    Received signal #17, SIGUSR2, in poll() [caught]
      siginfo: SIGUSR2 pid=16411 uid=100
poll(0x08047258, 1, -1)                         Err#4  EINTR
sigprocmask(SIG_SETMASK, 0xBFEC3CE8, 0x00000000) = 0
lseek64(3, 354375, 0)                           = 354375
read(3, " % L R e c e i v e d   s".., 81)       = 81
getpid()                                        = 16476  [ 16394 ]
nuname(0x08045873)                              = 1
write(1, "1B [ 2 8 ; 1 H1B [ 7 m R".., 57)      = 57
lseek64(3, 45522, 0)                            = 45522
read(3, " % L H A N G U P   s i g".., 81)       = 81
...
...
close(5)                                        = 0
_exit(2)

Вот я и пытаюсь понять, почему такая разница.
А практический интерес вызван тем, что не все клиентские сессии отключаются при normal shutdown, хотя это НЕ зависшие, Не транзакционные.
В качестве примера, разная реакция на SIGUSR2 проявляется если его посылать в процесс
$DLC/bin/pro -p _edit

Старожил
Аватара пользователя
Сообщения: 2871
Зарегистрирован: Ср май 12, 2004 6:03 pm
Откуда: Питер

Re: Не работает kill -s SIGUSR2 на Linux

Сообщение George » Чт мар 06, 2014 12:06 pm

idl писал(а):А практический интерес вызван тем, что не все клиентские сессии отключаются при normal shutdown, хотя это НЕ зависшие, Не транзакционные.

Речь о 4GL сессиях или о служебных процессах? Если о последних, то в этой области в V10.2B были баги, которые вроде как исправлены в последних сервис-паках. Со служебными процессами ситуация особенная - некоторым из них разрешается игнорировать флаг останова базы до последнего момента, а где тонко там и рвется.

Если речь 4GL сессиях (да и для служебных процессов тоже), то алгоритм действия прост - послать SIGUSR1 сигнал для получения protrace файла, а затем "обычные" сигналы для останова процессов. SIGUSR2 в список таких сигналов обычно не включают. Поскольку речь идет о процессах, оставшихся после останова базы, то даже kill -9 можно использовать. Protrace файлы нужны, чтобы было с чем разбираться, а сигналы на останов - чтобы караван шел дальше.

Старожил
Сообщения: 94
Зарегистрирован: Чт май 21, 2009 4:41 pm

Re: Не работает kill -s SIGUSR2 на Linux

Сообщение idl » Чт мар 06, 2014 12:27 pm

Да, о 4GL сессиях. Я писал, что процесс _progres, и пример по завершению сессии в редакторе _edit.p

Protrace-файл в данном случае ничего интересного не показывает.
А логи strace или truss показывают как реагирует процесс на SIGUSR2.

Я в самом начале указал OpenEdge 10.2B(SP 04,07,08)
Судя по разнице, у меня впечатление что это баг ОЕ на Линуксе.
??

Старожил
Аватара пользователя
Сообщения: 2871
Зарегистрирован: Ср май 12, 2004 6:03 pm
Откуда: Питер

Re: Не работает kill -s SIGUSR2 на Linux

Сообщение George » Чт мар 06, 2014 12:49 pm

idl писал(а):Да, о 4GL сессиях. Я писал, что процесс _progres, и пример по завершению сессии в редакторе _edit.p

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

Protrace-файл в данном случае ничего интересного не показывает.
А логи strace или truss показывают как реагирует процесс на SIGUSR2.

Для инженеров PSTS содержимое protrace файлов возможно будет предоставлять интерес (если, конечно, сессии при отключении ведут себя не так как ожидается).

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

Я в самом начале указал OpenEdge 10.2B(SP 04,07,08)

Все три SP на Linux'е?
Или речь о трех упомянутых платформах (Linux, AIX, UnixWare)?
Зависшие сессии появляются при всех вариантах?

Судя по разнице, у меня впечатление что это баг ОЕ на Линуксе.
??

Баг - это когда что-то не работает как задумано и как обещано в документации.

Старожил
Сообщения: 94
Зарегистрирован: Чт май 21, 2009 4:41 pm

Re: Не работает kill -s SIGUSR2 на Linux

Сообщение idl » Чт мар 06, 2014 2:23 pm

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

Конечно, если база остановилась, то и процесса нет.
Я писал, что в процессе "normal shutdown" сессия не реагирует на SIGUSR2.
Дело доходит до "immediate", во время которого уже "BROKER 0: (2251) Destroyed user"
Все три SP на Linux'е?

На Линукс:
SLES - SP 04
CentOS - SP 07,08
AIX- SP 07
UnixWare - SP 08
Баг - это когда что-то не работает как задумано и как обещано в документации.

Если считать что KnowledgeBase это документация, и на других системах ведет себя как в этой документации написано, то вероятно - баг

Старожил
Аватара пользователя
Сообщения: 2871
Зарегистрирован: Ср май 12, 2004 6:03 pm
Откуда: Питер

Re: Не работает kill -s SIGUSR2 на Linux

Сообщение George » Чт мар 06, 2014 3:58 pm

idl писал(а):Я писал, что в процессе "normal shutdown" сессия не реагирует на SIGUSR2.
Дело доходит до "immediate", во время которого уже "BROKER 0: (2251) Destroyed user"

Я ранней весной особенно плохо соображаю. Такое поведение (отсутствие реакции на SIGUSR2) проявляют абсолютно все 4GL сессии?

Прежде чем уничтожить сессии в финальной фазе останова базы брокер пытается принудить сессии к отключению сигналами SIGBUS, SIGALRM и SIGINT.
SIGUSR2 используется только при использовании меню Disconnect (или в proshut -C disconnect <num>), но не при останове базы - не в процессе "normal shutdown".
Сессии не реагируют на все эти сигналы? Если да, то здесь пахнет командой trap.

Если считать что KnowledgeBase это документация

Бывает, что глупость написана и в документации, а в KnowledgeBase её вообще выше крыши.

Disclaimers\Warranty
http://www.progress.com/terms-of-use
Neither Progress Software, nor its subsidiaries and affiliates and their respective licensors (if any) and suppliers, warrant the accuracy, completeness or quality of any of the Materials or Services.

Старожил
Сообщения: 94
Зарегистрирован: Чт май 21, 2009 4:41 pm

Re: Не работает kill -s SIGUSR2 на Linux

Сообщение idl » Чт мар 06, 2014 6:11 pm

проявляют абсолютно все 4GL сессии?

Нет, конечно. Я уже писал
не все клиентские сессии отключаются при normal shutdown, хотя это НЕ зависшие, Не транзакционные.


SIGUSR2 используется только при использовании меню Disconnect

Как мы видим из лога - не совсем так.
Я уже приводил кусок лога, вот он полностью
Код: Выделить всё
P-2446       T-47833207651248 I SHUT    9: (542)   Server shutdown started by dba on /dev/pts/3.
P-2079       T-47012949896112 I BROKER  0: (15193) The normal shutdown of the database will continue for
P-2079       T-47012949896112 I BROKER  0: (2248)  Begin normal shutdown
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 5
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 6
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 7
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 8
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 11
P-2086       T-47072525036464 I WDOG    5: (2519)  Disconnected.
P-2087       T-47341675653424 I ABL     6: (453)   Logout by SERV on batch.
P-2086       T-47072525036464 I          : (453)   Logout by sis on batch.
P-2207       T-47006582753584 I APPSRV  8: (453)   Logout by serv on batch.
P-2205       T-47360352626992 I APPSRV  7: (453)   Logout by serv on batch.
P-2079       T-47012949896112 I BROKER  0: (2261)  Sending signal 14 to 1 connected user(s).
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 14 to user 11
P-2079       T-47012949896112 I BROKER  0: (2261)  Sending signal 2 to 1 connected user(s).
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 2 to user 11
P-2079       T-47012949896112 I BROKER  0: (2263)  Resending shutdown request to 1 user(s).
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 11
P-2079       T-47012949896112 I BROKER  0: (2261)  Sending signal 15 to 1 connected user(s).
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 15 to user 11
P-2291       T-47863886043440 I WSAGENT11: (298)   KILL signal received.
P-2079       T-47012949896112 I BROKER  0: (15194) Database activity did not finish before the shutdown timeout so the database is performing an immediate shutdown.
P-2079       T-47012949896112 I BROKER  0: (-----) Sending signal 12 to user 11
P-2079       T-47012949896112 I BROKER  0: (2251)  Destroyed user 9 pid 2446.
P-2079       T-47012949896112 I BROKER  0: (2251)  Destroyed user 11 pid 2291.
P-2079       T-47012949896112 I BROKER   : (334)   Multi-user session end.
P-2079       T-47012949896112 I BROKER   : (-----) Removed shared memory with segment_id: 5668869

пахнет командой trap

Предполагал, все перерыл. Не нашел.
глупость написана и в документации

Допустим.
Но мой то изначальный вопрос:
почему же в других ОС - в соответствии с докой, а в Линуксе - нет?
Так и должно быть или у меня что не так?

Старожил
Аватара пользователя
Сообщения: 2871
Зарегистрирован: Ср май 12, 2004 6:03 pm
Откуда: Питер

Re: Не работает kill -s SIGUSR2 на Linux

Сообщение George » Чт мар 06, 2014 7:58 pm

Код: Выделить всё
BROKER  0: (-----) Sending signal 12 to user 11
BROKER  0: (-----) Sending signal 14 to user 11
BROKER  0: (-----) Sending signal 2 to user 11
BROKER  0: (-----) Sending signal 15 to user 11

На Linux'е SIGUSR2 - это сигнал 12 и здесь он действительно использовался.
У меня есть аналогичные логи, например, с Solaris'а и там SIGUSR2 не используется. Это тоже считать багом?
idl писал(а):почему же в других ОС - в соответствии с докой, а в Линуксе - нет?
Так и должно быть или у меня что не так?

Где в документации описано как процессы должны реагировать на SIGUSR2 и какие сигналы брокер рассылает зависшим процессам при останове базы?
Еще раз - knowledgebase не является документацией. Статья, ссылка на которую дана в первом сообщении, последний раз правилась 27 декабря 2010 года инженером Carol A. Osborne. Она не разработчик, а инженер техподдержки. В конце статьи стоит стандартный disclaimer:
the information provided is for your information only. Progress Software Corporation makes no explicit or implied claims to the validity of this information.

Ну какой это баг релиза на Linux'е, если такие же ситуации довольно часто возникают и на других платформах?

Лучше сосредоточится на поиске причин, по которым некоторые сессии не отключаются от базы за разумный период времени (-shutdownTimeout).
При старте базы происходил откат незавершенных транзакций? Двух транзакций - по числу уничтоженных сессий? Если дело в транзакциях, то можно отсканировать AI файл, который был текущим в момент останова базы. Но я давно предлагаю более простой вариант - перед остановом базы собирать информацию о всех сессиях, работающих в данный момент в базе (у кого есть открытые транзакции, есть ли текущая активность в базе, текущий стек процедур всех сессий). Какие-то сессии при останове базы не захотели отключаться? Позже можно будет заглянуть в их досье и попытаться найти причину или хотя бы закономерность в работе этих сессий. Каждый случай, по которому не собрана необходимая информация, гарантирует повторение ситуации в будущем - возможно в более тяжелом виде чем было до этого.

Вернуться в PROGRESS - АДМИНИСТРИРОВАНИЕ БАЗ ДАННЫХ

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

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