Skip to contentSkip to conversation

Map restart signals from event loop to SIGTERM during exit-notification wait

PATCH In review Selva Nair 2 participants 2 messages Nov 30, 2016

lore
Share & tools
lore

Selva Nair

author
#0 lore raw

PATCH 1/1 Map restart signals from event loop to SIGTERM during exit-notification wait

Commit 63b3e000c9.. fixed SIGTERM getting lost during exit notification by ignoring any restart signals triggered during this interval. However, as reported in Trac 777, this could result in repeated triggering of restart signals when the event loop cannot continue without restart due to IO errors or timeout.

Avoid by converting soft SIGUSR1 and SIGHUP signals received during exit-notify wait period to SIGTERM.

cherry-picked from commit f25a0217e35f53c3110ebb226e1d1f3528152cb5 with (c->sig->source == SIG_SOURCE_HARD) changed to c->sig->hard

---
 src/openvpn/sig.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)
src/openvpn/sig.c +16 -5
index 87f2cdb..b17e166 100644
@@ -362,7 +362,8 @@ process_sigterm (struct context *c)
 
 /**
  * If a restart signal is received during exit-notification, reset the
- * signal and return true.
+ * signal and return true. If its a soft restart signal from the event loop
+ * which implies the loop cannot continue, remap to SIGTERM to exit promptly.
  */
 static bool
 ignore_restart_signals (struct context *c)
@@ -372,10 +373,20 @@ ignore_restart_signals (struct context *c)
   if ( (c->sig->signal_received == SIGUSR1 || c->sig->signal_received == SIGHUP) &&
         event_timeout_defined(&c->c2.explicit_exit_notification_interval) )
     {
-       msg (M_INFO, "Ignoring %s received during exit notification",
-            signal_name(c->sig->signal_received, true));
-       signal_reset (c->sig);
-       ret = true;
+       if (c->sig->hard)
+         {
+            msg (M_INFO, "Ignoring %s received during exit notification",
+                 signal_name(c->sig->signal_received, true));
+            signal_reset (c->sig);
+            ret = true;
+         }
+       else
+         {
+            msg (M_INFO, "Converting soft %s received during exit notification to SIGTERM",
+                 signal_name(c->sig->signal_received, true));
+            register_signal(c, SIGTERM, "exit-with-notification");
+            ret = false;
+         }
     }
 #endif
   return ret;
Signature · 1 line
2.1.4
#1 lore raw

ACK. Same (reproduceable) problem, similar fix, good :-)

Your patch has been applied to the release/2.3 branch.

commit 4d397fcbc023271c7117cb83b13114389bf3265b

Author: Selva Nair
Date:   Tue Nov 29 20:48:55 2016 -0500
     Map restart signals from event loop to SIGTERM during exit-notification wait

     Signed-off-by: Selva Nair <[email protected]...>
     Acked-by: Gert Doering <[email protected]...>
     Message-Id: <[email protected]...>
     URL: https://www.mail-archive.com/[email protected]/msg13310.html
     Signed-off-by: Gert Doering <[email protected]...>

--
kind regards,

Gert Doering