]> git.proxmox.com Git - lvm.git/commitdiff
dmeventd: ensure service gets stopped normally on shutdown
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 5 Oct 2017 12:05:25 +0000 (14:05 +0200)
committerFabian Grünbichler <f.gruenbichler@proxmox.com>
Fri, 6 Oct 2017 05:56:08 +0000 (07:56 +0200)
cherry-pick two patches which ensure that dmeventd gets always
stopped when requested (i.e. if exiting is not ok at the moment it
gets scheduled for the next possible moment and not thrown away) and
which also ensures that it gets stopped more safely on shutdown.

This addresses a issue where when LVM(thin) was used on a host
shutdown could hang need 90 seconds longer, seemingly hanging for
this time as without debug log active no message got shown.

patchdir/0004-dmeventd-schedule-exit-on-break.patch [new file with mode: 0644]
patchdir/0005-dmeventd-ensure-service-gets-stopped-on-shutdown.patch [new file with mode: 0644]
patchdir/series

diff --git a/patchdir/0004-dmeventd-schedule-exit-on-break.patch b/patchdir/0004-dmeventd-schedule-exit-on-break.patch
new file mode 100644 (file)
index 0000000..ed5dd44
--- /dev/null
@@ -0,0 +1,82 @@
+From 9940c2f754e3292b6d96628682c254941ae6cc58 Mon Sep 17 00:00:00 2001
+From: Zdenek Kabelac <zkabelac@redhat.com>
+Date: Wed, 4 Oct 2017 13:58:21 +0200
+Subject: [PATCH] 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.
+
+cherry picked from commit 9940c2f754e3292b6d96628682c254941ae6cc58
+
+Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+---
+ daemons/dmeventd/dmeventd.c | 13 ++++++++-----
+ 1 files changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/daemons/dmeventd/dmeventd.c b/daemons/dmeventd/dmeventd.c
+index 3a92ab6..cc520d3 100644
+--- a/daemons/dmeventd/dmeventd.c
++++ b/daemons/dmeventd/dmeventd.c
+@@ -62,6 +62,8 @@
+ #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 */
+ /* List (un)link macros. */
+@@ -1750,7 +1752,7 @@ static void _init_thread_signals(void)
+  */
+ static void _exit_handler(int sig __attribute__((unused)))
+ {
+-      _exit_now = 1;
++      _exit_now = DM_SIGNALED_EXIT;
+ }
+ #ifdef __linux__
+@@ -2248,6 +2250,8 @@ int main(int argc, char *argv[])
+       for (;;) {
+               if (_idle_since) {
+                       if (_exit_now) {
++                              if (_exit_now == DM_SCHEDULED_EXIT)
++                                      break; /* Only prints shutdown message */
+                               log_info("dmeventd detected break while being idle "
+                                        "for %ld second(s), exiting.",
+                                        (long) (time(NULL) - _idle_since));
+@@ -2264,15 +2268,14 @@ int main(int argc, char *argv[])
+                                       break;
+                               }
+                       }
+-              } else if (_exit_now) {
+-                      _exit_now = 0;
++              } else if (_exit_now == DM_SIGNALED_EXIT) {
++                      _exit_now = DM_SCHEDULED_EXIT;
+                       /*
+                        * When '_exit_now' is set, signal has been received,
+                        * but can not simply exit unless all
+                        * threads are done processing.
+                        */
+-                      log_warn("WARNING: There are still devices being monitored.");
+-                      log_warn("WARNING: Refusing to exit.");
++                      log_info("dmeventd received break, scheduling exit.");
+               }
+               _process_request(&fifos);
+               _cleanup_unused_threads();
+-- 
+2.9.3
diff --git a/patchdir/0005-dmeventd-ensure-service-gets-stopped-on-shutdown.patch b/patchdir/0005-dmeventd-ensure-service-gets-stopped-on-shutdown.patch
new file mode 100644 (file)
index 0000000..d731649
--- /dev/null
@@ -0,0 +1,46 @@
+From a781b1c1788461595f382918bb1fc210d248d444 Mon Sep 17 00:00:00 2001
+From: Thomas Lamprecht <t.lamprecht@proxmox.com>
+Date: Thu, 5 Oct 2017 12:52:15 +0200
+Subject: [PATCH] dmeventd: ensure systemd service gets stopped on shutdown
+
+Add these for dmeventd systemd unit (dm-event.service):
+
+  Before: shutdown.target
+  Conflicts: shutdown.target
+
+This will cause the dmeventd to be properly stopped at shutdown (after
+all the dmeventd clients unregistered their devices from monitoring)
+with dm-event.service's stop action (there's no direct action defined
+for the "stop" so systemd sends SIGTERM instead).
+
+Before, we let dmeventd to get killed only as part of the very last
+SIGTERM/SIGKILL for all the remaining processes late in the shutdown
+sequence so we may have missed some logs if dmeventd encountered an
+error during its shutdown (logging facilities are already off at this
+late time in shutdown sequence).
+
+Ref: https://www.redhat.com/archives/lvm-devel/2017-October/msg00000.html
+
+cherry picked from commit a781b1c1788461595f382918bb1fc210d248d444
+
+Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+---
+ scripts/dm_event_systemd_red_hat.service.in | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/scripts/dm_event_systemd_red_hat.service.in b/scripts/dm_event_systemd_red_hat.service.in
+index 7c607aa..4924d39 100644
+--- a/scripts/dm_event_systemd_red_hat.service.in
++++ b/scripts/dm_event_systemd_red_hat.service.in
+@@ -3,7 +3,8 @@ Description=Device-mapper event daemon
+ Documentation=man:dmeventd(8)
+ Requires=dm-event.socket
+ After=dm-event.socket
+-Before=local-fs-pre.target
++Before=local-fs-pre.target shutdown.target
++Conflicts=shutdown.target
+ DefaultDependencies=no
+ [Service]
+-- 
+2.9.3
index 04c3677089dd97bb815a91b5af0b6225a2642ea4..9190687ff70940a5c919b62f2e2c4d7c15d3ef9b 100644 (file)
@@ -1,3 +1,5 @@
 0001-filter-zvols-and-PVE-VG-by-default.patch
 0002-enable-issue_discards-by-default.patch
 0003-disable-use-lvmetad.patch
+0004-dmeventd-schedule-exit-on-break.patch
+0005-dmeventd-ensure-service-gets-stopped-on-shutdown.patch