sys-fs/lvm2: improve dmeventd init
authorRobin H. Johnson <robbat2@gentoo.org>
Wed, 17 Apr 2019 07:04:10 +0000 (00:04 -0700)
committerRobin H. Johnson <robbat2@gentoo.org>
Wed, 17 Apr 2019 07:25:38 +0000 (00:25 -0700)
Upstream dmeventd has an exit-on-idle behavior that leads openrc to
decide that it has crashed, when it just exited "normally".

Provide multiple ways around this:
- supervisor support in the init script
- patch the daemon to make the idle timeout configurable (submitted upstream)

Co-authored-by: William Hubbs <williamh@gentoo.org>
Fixes: https://bugs.gentoo.org/682556
Package-Manager: Portage-2.3.62, Repoman-2.3.12
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
sys-fs/lvm2/files/dmeventd.initd-2.02.184-r2 [new file with mode: 0644]
sys-fs/lvm2/files/lvm2-2.02.184-dmeventd-no-idle-exit.patch [new file with mode: 0644]
sys-fs/lvm2/lvm2-2.02.184-r2.ebuild

diff --git a/sys-fs/lvm2/files/dmeventd.initd-2.02.184-r2 b/sys-fs/lvm2/files/dmeventd.initd-2.02.184-r2
new file mode 100644 (file)
index 0000000..bc08c0a
--- /dev/null
@@ -0,0 +1,21 @@
+#!/sbin/openrc-run
+# Copyright 1999-2019 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+command=/sbin/dmeventd
+command_args_foreground='-f'
+extra_started_commands=reload
+pidfile=/run/dmeventd.pid
+# Control idle exit behavior of daemon
+export DMEVENTD_IDLE_EXIT_TIMEOUT=${DMEVENTD_IDLE_EXIT_TIMEOUT:=-1}
+
+depend() {
+       # As of .67-r1, we call ALL lvm start/stop scripts with --sysinit, that
+       # means dmeventd is NOT notified, as it cannot be safely running
+       after lvm device-mapper
+}
+
+reload() {
+       # TODO: this is not supported under supervisors
+       ${command} -R
+}
diff --git a/sys-fs/lvm2/files/lvm2-2.02.184-dmeventd-no-idle-exit.patch b/sys-fs/lvm2/files/lvm2-2.02.184-dmeventd-no-idle-exit.patch
new file mode 100644 (file)
index 0000000..c80bd2b
--- /dev/null
@@ -0,0 +1,68 @@
+From: "Robin H. Johnson" <robbat2@gentoo.org>
+Date: Wed, 17 Apr 2019 06:54:27 +0000
+Subject: [PATCH] dmeventd configurable idle exit time
+
+dmeventd nominally exits after 1 hour of idle time. There are use cases for
+this, esp. with socket activation, but also cases where users don't expect
+dmeventd to exit.
+
+Provide a tuning knob via environment variable, DMEVENTD_IDLE_EXIT_TIMEOUT,
+that can be -1 to not exit, or a configurable time for different idle exit.
+
+Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
+Fixes: https://bugs.gentoo.org/682556
+
+diff -Nuar LVM2.2.02.184.orig/daemons/dmeventd/dmeventd.c LVM2.2.02.184/daemons/dmeventd/dmeventd.c
+--- LVM2.2.02.184.orig/daemons/dmeventd/dmeventd.c     2019-03-22 03:14:59.000000000 -0700
++++ LVM2.2.02.184/daemons/dmeventd/dmeventd.c  2019-04-17 00:18:23.535029906 -0700
+@@ -2158,6 +2158,18 @@
+               .server_path = DM_EVENT_FIFO_SERVER
+       };
+       time_t now, idle_exit_timeout = DMEVENTD_IDLE_EXIT_TIMEOUT;
++
++      /* Provide a basic way to config the idle timeout */
++      char* idle_exit_timeout_env = getenv("DMEVENTD_IDLE_EXIT_TIMEOUT") ? : NULL;
++      if(NULL != idle_exit_timeout_env) {
++              char* endptr;
++              idle_exit_timeout = strtol(idle_exit_timeout_env, &endptr, 10);
++              if (errno == ERANGE || *endptr != '\0') {
++                      fprintf(stderr, "DMEVENTD_IDLE_EXIT_TIMEOUT: bad time input\n");
++                      exit(EXIT_FAILURE);
++              }
++      }
++
+       opterr = 0;
+       optind = 0;
+@@ -2253,7 +2265,7 @@
+               _process_initial_registrations();
+       for (;;) {
+-              if (_idle_since) {
++              if (_idle_since || _exit_now) {
+                       if (_exit_now) {
+                               if (_exit_now == DM_SCHEDULED_EXIT)
+                                       break; /* Only prints shutdown message */
+@@ -2262,7 +2274,7 @@
+                                        (long) (time(NULL) - _idle_since));
+                               break;
+                       }
+-                      if (idle_exit_timeout) {
++                      if (idle_exit_timeout && idle_exit_timeout > 0) {
+                               now = time(NULL);
+                               if (now < _idle_since)
+                                       _idle_since = now; /* clock change? */
+diff -Nuar LVM2.2.02.184.orig/man/dmeventd.8_main LVM2.2.02.184/man/dmeventd.8_main
+--- LVM2.2.02.184.orig/man/dmeventd.8_main     2019-03-22 03:15:00.000000000 -0700
++++ LVM2.2.02.184/man/dmeventd.8_main  2019-04-17 00:17:46.076023638 -0700
+@@ -143,6 +143,10 @@
+ Variable is set by thin plugin to prohibit recursive interation
+ with dmeventd by any executed lvm2 command from
+ a thin_command environment.
++.TP
++.B DMEVENTD_IDLE_EXIT_TIMEOUT
++Configure the dmeventd idle exit timeout behavior, value in seconds. Default
++is 3600 (1 hour). -1 means do not exit.
+ .
+ .SH SEE ALSO
+ .
index 64a1656d31b9416368194283a46a7faabc175cfd..8ff1308f5846fcf07d9cf2cd3b5535b24ad6ea38 100644 (file)
@@ -65,6 +65,7 @@ PATCHES=(
        "${FILESDIR}"/${PN}-2.02.171-static-libm.patch #617756
        "${FILESDIR}"/${PN}-2.02.166-HPPA-no-O_DIRECT.patch #657446
        #"${FILESDIR}"/${PN}-2.02.145-mkdev.patch #580062 # Merged upstream
+       "${FILESDIR}"/${PN}-2.02.184-dmeventd-no-idle-exit.patch
 )
 
 pkg_setup() {
@@ -213,7 +214,7 @@ src_install() {
        newconfd "${FILESDIR}"/device-mapper.conf-1.02.22-r3 device-mapper
 
        if use !device-mapper-only ; then
-               newinitd "${FILESDIR}"/dmeventd.initd-2.02.67-r1 dmeventd
+               newinitd "${FILESDIR}"/dmeventd.initd-2.02.184-r2 dmeventd
                newinitd "${FILESDIR}"/lvm.rc-2.02.183 lvm
                newconfd "${FILESDIR}"/lvm.confd-2.02.28-r2 lvm