Handle SIGTERM in pg_receivewal and pg_recvlogical
authorDaniel Gustafsson
Wed, 14 Sep 2022 14:32:24 +0000 (16:32 +0200)
committerDaniel Gustafsson
Wed, 14 Sep 2022 14:32:24 +0000 (16:32 +0200)
In pg_receivewal, compressed output is only flushed on clean exits.  The
reason to support SIGTERM as well as SIGINT (which is currently handled)
is that pg_receivewal might well be running as a daemon, and systemd's
default KillSignal is SIGTERM.

Since pg_recvlogical is also supposed to run as a daemon, teach it about
SIGTERM as well and update the documentation to match.  While in there,
change pg_receivewal's time_to_stop to be sig_atomic_t like it is in
pg_recvlogical.

Author: Christoph Berg 
Reviewed-by: Bharath Rupireddy
Reviewed-by: Michael Paquier
Discussion: https://postgr.es/m/Yvo/[email protected]

doc/src/sgml/ref/pg_receivewal.sgml
doc/src/sgml/ref/pg_recvlogical.sgml
src/bin/pg_basebackup/pg_receivewal.c
src/bin/pg_basebackup/pg_recvlogical.c

index 4fe9e1a8742b4220a7ffff90705522444d82e1fd..5f83ba1893b87b6e12b720676e30b06c8618a29e 100644 (file)
@@ -118,8 +118,9 @@ PostgreSQL documentation
 
   
    In the absence of fatal errors, pg_receivewal
-   will run until terminated by the SIGINT signal
-   (ControlC).
+   will run until terminated by the SIGINT
+   (ControlC)
+   or SIGTERM signal.
   
  
 
@@ -457,7 +458,8 @@ PostgreSQL documentation
 
   
    pg_receivewal will exit with status 0 when
-   terminated by the SIGINT signal.  (That is the
+   terminated by the SIGINT or
+   SIGTERM signal.  (That is the
    normal way to end it.  Hence it is not an error.)  For fatal errors or
    other signals, the exit status will be nonzero.
   
index 1a882254095c4790fc4aabd5b424535634969db1..6d75b6fa4cb30c2bcbb9296afb1ff330dbf361f2 100644 (file)
@@ -46,6 +46,13 @@ PostgreSQL documentation
     a slot without consuming it, use
    pg_logical_slot_peek_changes.
   
+
+  
+   In the absence of fatal errors, pg_recvlogical
+   will run until terminated by the SIGINT
+   (ControlC)
+   or SIGTERM signal.
+  
  
 
  
@@ -407,6 +414,17 @@ PostgreSQL documentation
    
  
 
+  Exit Status
+  
+   pg_recvlogical will exit with status 0 when
+   terminated by the SIGINT or
+   SIGTERM signal.  (That is the
+   normal way to end it.  Hence it is not an error.)  For fatal errors or
+   other signals, the exit status will be nonzero.
+  
+
  
   Environment
 
index a6e3387a6d48dc90d342efcdbd7fb6970dffc26e..37c14d1a0292842fa111e6723469c327abe8fb5f 100644 (file)
@@ -45,7 +45,7 @@ static int    verbose = 0;
 static int compresslevel = 0;
 static int noloop = 0;
 static int standby_message_timeout = 10 * 1000;    /* 10 sec = default */
-static volatile bool time_to_stop = false;
+static volatile sig_atomic_t time_to_stop = false;
 static bool do_create_slot = false;
 static bool slot_exists_ok = false;
 static bool do_drop_slot = false;
@@ -673,13 +673,13 @@ StreamLog(void)
 }
 
 /*
- * When sigint is called, just tell the system to exit at the next possible
- * moment.
+ * When SIGINT/SIGTERM are caught, just tell the system to exit at the next
+ * possible moment.
  */
 #ifndef WIN32
 
 static void
-sigint_handler(int signum)
+sigexit_handler(int signum)
 {
    time_to_stop = true;
 }
@@ -905,7 +905,8 @@ main(int argc, char **argv)
     * if one is needed, in GetConnection.)
     */
 #ifndef WIN32
-   pqsignal(SIGINT, sigint_handler);
+   pqsignal(SIGINT, sigexit_handler);
+   pqsignal(SIGTERM, sigexit_handler);
 #endif
 
    /*
index 2a4c8b130a0fe06b81787da37f2a23ddad9bdaa6..a86739ec1260ff4bf958e632e66582036a82a4c2 100644 (file)
@@ -650,11 +650,11 @@ error:
 #ifndef WIN32
 
 /*
- * When sigint is called, just tell the system to exit at the next possible
- * moment.
+ * When SIGINT/SIGTERM are caught, just tell the system to exit at the next
+ * possible moment.
  */
 static void
-sigint_handler(int signum)
+sigexit_handler(int signum)
 {
    time_to_abort = true;
 }
@@ -922,7 +922,8 @@ main(int argc, char **argv)
     * if one is needed, in GetConnection.)
     */
 #ifndef WIN32
-   pqsignal(SIGINT, sigint_handler);
+   pqsignal(SIGINT, sigexit_handler);
+   pqsignal(SIGTERM, sigexit_handler);
    pqsignal(SIGHUP, sighup_handler);
 #endif