Handle SIGTERM in fe_utils/cancel.c

Started by Tristan Partinover 2 years ago3 messages
#1Tristan Partin
tristan@neon.tech
1 attachment(s)

Hello,

This is a way that would solve bug #17698[1]/messages/by-id/17698-58a6ab8caec496b0@postgresql.org. It just reuses the same
handler as SIGINT (with a function rename).

This patch works best if it is combined with my previous submission[2]/messages/by-id/CSSWBAX56CVY.291H6ZNNHK7EO@c3po.
I can rebase that submission if and when this patch is pulled in.

[1]: /messages/by-id/17698-58a6ab8caec496b0@postgresql.org
[2]: /messages/by-id/CSSWBAX56CVY.291H6ZNNHK7EO@c3po

--
Tristan Partin
Neon (https://neon.tech)

Attachments:

v1-0001-Handle-SIGTERM-in-fe_utils-cancel.c.patchtext/x-patch; charset=utf-8; name=v1-0001-Handle-SIGTERM-in-fe_utils-cancel.c.patchDownload
From 42db43794c38341a088570e0033a945cc077a350 Mon Sep 17 00:00:00 2001
From: Tristan Partin <tristan@neon.tech>
Date: Mon, 22 May 2023 12:12:06 -0500
Subject: [PATCH postgres v1] Handle SIGTERM in fe_utils/cancel.c

This is the same handling as SIGINT.

This issue was originally reported in
https://www.postgresql.org/message-id/17698-58a6ab8caec496b0%40postgresql.org.
---
 src/fe_utils/cancel.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/fe_utils/cancel.c b/src/fe_utils/cancel.c
index 10c0cd4554..b13003d405 100644
--- a/src/fe_utils/cancel.c
+++ b/src/fe_utils/cancel.c
@@ -150,7 +150,7 @@ ResetCancelConn(void)
  * is set.
  */
 static void
-handle_sigint(SIGNAL_ARGS)
+handle_signal(SIGNAL_ARGS)
 {
 	int			save_errno = errno;
 	char		errbuf[256];
@@ -180,7 +180,7 @@ handle_sigint(SIGNAL_ARGS)
 /*
  * setup_cancel_handler
  *
- * Register query cancellation callback for SIGINT.
+ * Register query cancellation callback for SIGINT and SIGTERM.
  */
 void
 setup_cancel_handler(void (*query_cancel_callback) (void))
@@ -189,7 +189,8 @@ setup_cancel_handler(void (*query_cancel_callback) (void))
 	cancel_sent_msg = _("Cancel request sent\n");
 	cancel_not_sent_msg = _("Could not send cancel request: ");
 
-	pqsignal(SIGINT, handle_sigint);
+	pqsignal(SIGINT, handle_signal);
+	pqsignal(SIGTERM, handle_signal);
 }
 
 #else							/* WIN32 */
-- 
-- 
Tristan Partin
Neon (https://neon.tech)

#2Michael Paquier
michael@paquier.xyz
In reply to: Tristan Partin (#1)
Re: Handle SIGTERM in fe_utils/cancel.c

On Mon, May 22, 2023 at 12:26:34PM -0500, Tristan Partin wrote:

This is a way that would solve bug #17698[1]. It just reuses the same
handler as SIGINT (with a function rename).

This patch works best if it is combined with my previous submission[2].
I can rebase that submission if and when this patch is pulled in.

Not sure that this is a good idea long-term. Currently, the code
paths calling setup_cancel_handler() from cancel.c don't have a custom
handling for SIGTERM, but that may not be the case forever.
--
Michael

#3Tristan Partin
tristan@neon.tech
In reply to: Michael Paquier (#2)
Re: Handle SIGTERM in fe_utils/cancel.c

On Tue May 23, 2023 at 7:51 PM CDT, Michael Paquier wrote:

On Mon, May 22, 2023 at 12:26:34PM -0500, Tristan Partin wrote:

This is a way that would solve bug #17698[1]. It just reuses the same
handler as SIGINT (with a function rename).

This patch works best if it is combined with my previous submission[2].
I can rebase that submission if and when this patch is pulled in.

Not sure that this is a good idea long-term. Currently, the code
paths calling setup_cancel_handler() from cancel.c don't have a custom
handling for SIGTERM, but that may not be the case forever.

I am more than happy to essentially just copy & paste some code that
will be specific to pgbench if that is preferrable for the purposes of
merging this patch. Another idea would be to change the signature of
setup_cancel_handler() to something like:

void
setup_cancel_handler(cb pre, cb post, int signal, ...); (null-terminate)

Then a client could state exactly what signals it wants to register with
this generic cancel handler.

--
Tristan Partin
Neon (https://neon.tech)