[lvm-devel] master - dmeventd: exit on idle
Zdenek Kabelac
zkabelac at fedoraproject.org
Thu Oct 22 21:34:08 UTC 2015
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=2af696c32f99b2951bcc7e2a73130e46dc4f383f
Commit: 2af696c32f99b2951bcc7e2a73130e46dc4f383f
Parent: 4284ba65ebe6401b2dbedc9abe850b650ed68f93
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Thu Oct 22 20:36:46 2015 +0200
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Thu Oct 22 22:43:03 2015 +0200
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.
---
WHATS_NEW_DM | 1 +
daemons/dmeventd/dmeventd.c | 35 +++++++++++++++++++++++++++--------
2 files changed, 28 insertions(+), 8 deletions(-)
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index 8524a6d..910f6d6 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.110 -
======================================
+ Support exit on idle for dmenventd (1 hour).
Add support to allow unmonitor device from plugin itself.
New design for thread co-operation in dmeventd.
Dmeventd read device status with 'noflush'.
diff --git a/daemons/dmeventd/dmeventd.c b/daemons/dmeventd/dmeventd.c
index a7c1c6e..606ef30 100644
--- a/daemons/dmeventd/dmeventd.c
+++ b/daemons/dmeventd/dmeventd.c
@@ -87,11 +87,15 @@ static pthread_mutex_t _global_mutex;
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 _use_syslog = 1;
static int _systemd_activation = 0;
static int _foreground = 0;
static int _restart = 0;
+static time_t _idle_since = 0;
static char **_initial_registrations = 0;
/* FIXME Make configurable at runtime */
@@ -279,6 +283,7 @@ static void _lib_put(struct dso_data *data)
DEBUGLOG("Unholding control device.");
dm_hold_control_dev(0);
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)) {
DEBUGLOG("Holding control device open.");
dm_hold_control_dev(1);
+ _idle_since = 0;
}
/*
@@ -2106,7 +2112,7 @@ int main(int argc, char *argv[])
.client_path = DM_EVENT_FIFO_CLIENT,
.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};
opterr = 0;
@@ -2197,23 +2203,36 @@ int main(int argc, char *argv[])
kill(getppid(), SIGTERM);
log_notice("dmeventd ready for processing.");
+ _idle_since = time(NULL);
+
if (_initial_registrations)
_process_initial_registrations();
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;
/*
* When '_exit_now' is set, signal has been received,
* but can not simply exit unless all
* 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: Refusing to exit.");
}
More information about the lvm-devel
mailing list