mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
dmeventd: exit on idle
Implementing exit when 'dmeventd' is idle. Default idle timeout set to 1 hour - after this time period dmeventd will cleanly exit. On systems with 'systemd' - service is automatically started with next contact on dmeventd communication socket/fifo. On other systems - new dmeventd starts again when lvm2 command detects its missing and monitoring is needed.
This commit is contained in:
parent
4284ba65eb
commit
2af696c32f
@ -1,5 +1,6 @@
|
|||||||
Version 1.02.110 -
|
Version 1.02.110 -
|
||||||
======================================
|
======================================
|
||||||
|
Support exit on idle for dmenventd (1 hour).
|
||||||
Add support to allow unmonitor device from plugin itself.
|
Add support to allow unmonitor device from plugin itself.
|
||||||
New design for thread co-operation in dmeventd.
|
New design for thread co-operation in dmeventd.
|
||||||
Dmeventd read device status with 'noflush'.
|
Dmeventd read device status with 'noflush'.
|
||||||
|
@ -87,11 +87,15 @@ static pthread_mutex_t _global_mutex;
|
|||||||
|
|
||||||
static const size_t THREAD_STACK_SIZE = 300 * 1024;
|
static const size_t THREAD_STACK_SIZE = 300 * 1024;
|
||||||
|
|
||||||
|
/* Default idle exit timeout 1 hour (in seconds) */
|
||||||
|
static const time_t DMEVENTD_IDLE_EXIT_TIMEOUT = 60 * 60;
|
||||||
|
|
||||||
static int _debug_level = 0;
|
static int _debug_level = 0;
|
||||||
static int _use_syslog = 1;
|
static int _use_syslog = 1;
|
||||||
static int _systemd_activation = 0;
|
static int _systemd_activation = 0;
|
||||||
static int _foreground = 0;
|
static int _foreground = 0;
|
||||||
static int _restart = 0;
|
static int _restart = 0;
|
||||||
|
static time_t _idle_since = 0;
|
||||||
static char **_initial_registrations = 0;
|
static char **_initial_registrations = 0;
|
||||||
|
|
||||||
/* FIXME Make configurable at runtime */
|
/* FIXME Make configurable at runtime */
|
||||||
@ -279,6 +283,7 @@ static void _lib_put(struct dso_data *data)
|
|||||||
DEBUGLOG("Unholding control device.");
|
DEBUGLOG("Unholding control device.");
|
||||||
dm_hold_control_dev(0);
|
dm_hold_control_dev(0);
|
||||||
dm_lib_release();
|
dm_lib_release();
|
||||||
|
_idle_since = time(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -346,6 +351,7 @@ static struct dso_data *_load_dso(struct message_data *data)
|
|||||||
if (dm_list_empty(&_dso_registry)) {
|
if (dm_list_empty(&_dso_registry)) {
|
||||||
DEBUGLOG("Holding control device open.");
|
DEBUGLOG("Holding control device open.");
|
||||||
dm_hold_control_dev(1);
|
dm_hold_control_dev(1);
|
||||||
|
_idle_since = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2106,7 +2112,7 @@ int main(int argc, char *argv[])
|
|||||||
.client_path = DM_EVENT_FIFO_CLIENT,
|
.client_path = DM_EVENT_FIFO_CLIENT,
|
||||||
.server_path = DM_EVENT_FIFO_SERVER
|
.server_path = DM_EVENT_FIFO_SERVER
|
||||||
};
|
};
|
||||||
int nothreads;
|
time_t now, idle_exit_timeout = DMEVENTD_IDLE_EXIT_TIMEOUT;
|
||||||
//struct sys_log logdata = {DAEMON_NAME, LOG_DAEMON};
|
//struct sys_log logdata = {DAEMON_NAME, LOG_DAEMON};
|
||||||
|
|
||||||
opterr = 0;
|
opterr = 0;
|
||||||
@ -2197,23 +2203,36 @@ int main(int argc, char *argv[])
|
|||||||
kill(getppid(), SIGTERM);
|
kill(getppid(), SIGTERM);
|
||||||
log_notice("dmeventd ready for processing.");
|
log_notice("dmeventd ready for processing.");
|
||||||
|
|
||||||
|
_idle_since = time(NULL);
|
||||||
|
|
||||||
if (_initial_registrations)
|
if (_initial_registrations)
|
||||||
_process_initial_registrations();
|
_process_initial_registrations();
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (_exit_now) {
|
if (_idle_since) {
|
||||||
|
if (_exit_now) {
|
||||||
|
log_info("dmeventd detected break while being idle "
|
||||||
|
"for %ld second(s), exiting.",
|
||||||
|
(long) (time(NULL) - _idle_since));
|
||||||
|
break;
|
||||||
|
} else if (idle_exit_timeout) {
|
||||||
|
now = time(NULL);
|
||||||
|
if (now < _idle_since)
|
||||||
|
_idle_since = now; /* clock change? */
|
||||||
|
now -= _idle_since;
|
||||||
|
if (now >= idle_exit_timeout) {
|
||||||
|
log_info("dmeventd was idle for %ld second(s), "
|
||||||
|
"exiting.", (long) now);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (_exit_now) {
|
||||||
_exit_now = 0;
|
_exit_now = 0;
|
||||||
/*
|
/*
|
||||||
* 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.
|
||||||
*/
|
*/
|
||||||
_lock_mutex();
|
|
||||||
nothreads = (dm_list_empty(&_thread_registry) &&
|
|
||||||
dm_list_empty(&_thread_registry_unused));
|
|
||||||
_unlock_mutex();
|
|
||||||
if (nothreads)
|
|
||||||
break;
|
|
||||||
log_warn("WARNING: There are still devices being monitored.");
|
log_warn("WARNING: There are still devices being monitored.");
|
||||||
log_warn("WARNING: Refusing to exit.");
|
log_warn("WARNING: Refusing to exit.");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user