1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

dmeventd: schedule exit on break

When dmeventd receives SIGTERM/INT/HUP/QUIT it validates if exit is possible.
If there was any device still monitored, such exit request used to
be ignored/refused. This 'usually' worked reasonably well, however if there
is very short time period between last device is unmonitored and signal
reception - there was possibility such EXIT was ignored, as dmeventd has
not yet got into idle state even commands like 'vgchange -an' has already
finished.

This patch changes logic towards scheduling EXIT to the nearest
point when there is no monitored device.

EXIT is never forgotten.

NOTE: if there is only a single monitored device and someone sends
SIGTERM and later someone uses i.e. 'lvchange --refresh' after
unmonitoring dmeventd will exit and new instance needs to be
started.
This commit is contained in:
Zdenek Kabelac 2017-10-04 13:58:21 +02:00
parent a95f656d0d
commit 9940c2f754
2 changed files with 9 additions and 5 deletions

View File

@ -1,5 +1,6 @@
Version 1.02.144 - Version 1.02.144 -
====================================== ======================================
Schedule exit when received SIGTERM in dmeventd.
Also try to unmount /boot on blkdeactivate -u if on top of supported device. Also try to unmount /boot on blkdeactivate -u if on top of supported device.
Use blkdeactivate -r wait in blk-availability systemd service/initscript. Use blkdeactivate -r wait in blk-availability systemd service/initscript.
Add blkdeactivate -r wait option to wait for MD resync/recovery/reshape. Add blkdeactivate -r wait option to wait for MD resync/recovery/reshape.

View File

@ -62,6 +62,8 @@
#include <syslog.h> #include <syslog.h>
#define DM_SIGNALED_EXIT 1
#define DM_SCHEDULED_EXIT 2
static volatile sig_atomic_t _exit_now = 0; /* set to '1' when signal is given to exit */ static volatile sig_atomic_t _exit_now = 0; /* set to '1' when signal is given to exit */
/* List (un)link macros. */ /* List (un)link macros. */
@ -1750,7 +1752,7 @@ static void _init_thread_signals(void)
*/ */
static void _exit_handler(int sig __attribute__((unused))) static void _exit_handler(int sig __attribute__((unused)))
{ {
_exit_now = 1; _exit_now = DM_SIGNALED_EXIT;
} }
#ifdef __linux__ #ifdef __linux__
@ -2248,6 +2250,8 @@ int main(int argc, char *argv[])
for (;;) { for (;;) {
if (_idle_since) { if (_idle_since) {
if (_exit_now) { if (_exit_now) {
if (_exit_now == DM_SCHEDULED_EXIT)
break; /* Only prints shutdown message */
log_info("dmeventd detected break while being idle " log_info("dmeventd detected break while being idle "
"for %ld second(s), exiting.", "for %ld second(s), exiting.",
(long) (time(NULL) - _idle_since)); (long) (time(NULL) - _idle_since));
@ -2264,15 +2268,14 @@ int main(int argc, char *argv[])
break; break;
} }
} }
} else if (_exit_now) { } else if (_exit_now == DM_SIGNALED_EXIT) {
_exit_now = 0; _exit_now = DM_SCHEDULED_EXIT;
/* /*
* When '_exit_now' is set, signal has been received, * When '_exit_now' is set, signal has been received,
* but can not simply exit unless all * but can not simply exit unless all
* threads are done processing. * threads are done processing.
*/ */
log_warn("WARNING: There are still devices being monitored."); log_info("dmeventd received break, scheduling exit.");
log_warn("WARNING: Refusing to exit.");
} }
_process_request(&fifos); _process_request(&fifos);
_cleanup_unused_threads(); _cleanup_unused_threads();