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:
parent
a95f656d0d
commit
9940c2f754
@ -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.
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user