Per discussion, here's a patch for pg_standby in REL8_3_STABLE. The signal handling is changed so that SIGQUIT no longer triggers failover, but immediately kills pg_standby, triggering FATAL death of the startup process too. That's what you want with immediate shutdown.

SIGUSR1 is now accepted as a signal to trigger failover. SIGINT is still accepted too, but that should be considered deprecated since we're likely to use SIGINT for immediate shutdown (for startup process) in 8.4.

We should document the use of signals to trigger failover in the manual... Any volunteers?

This should be noted in the release notes:

If you are using pg_standby, and if you are using signals (e.g "killall -SIGINT pg_standby") to trigger failover, change your scripts to use SIGUSR1 instead of SIGQUIT or SIGINT. SIGQUIT no longer triggers failover, but aborts the recovery and shuts down the standby database. SIGINT is still accepted as failover trigger, but should be considered as deprecated and will also be changed to trigger immediate shutdown in a future release.

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com
Index: pg_standby.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_standby/pg_standby.c,v
retrieving revision 1.10.2.3
diff -c -r1.10.2.3 pg_standby.c
*** pg_standby.c	6 Jan 2009 17:27:19 -0000	1.10.2.3
--- pg_standby.c	4 Mar 2009 09:13:34 -0000
***************
*** 451,464 ****
  	signaled = true;
  }
  
  /*------------ MAIN ----------------------------------------*/
  int
  main(int argc, char **argv)
  {
  	int			c;
  
! 	(void) signal(SIGINT, sighandler);
! 	(void) signal(SIGQUIT, sighandler);
  
  	while ((c = getopt(argc, argv, "cdk:lr:s:t:w:")) != -1)
  	{
--- 451,487 ----
  	signaled = true;
  }
  
+ /* We don't want SIGQUIT to core dump */
+ static void
+ sigquit_handler(int sig)
+ {
+ 	signal(SIGINT, SIG_DFL);
+ 	kill(getpid(), SIGINT);
+ }
+ 
+ 
  /*------------ MAIN ----------------------------------------*/
  int
  main(int argc, char **argv)
  {
  	int			c;
  
! 	/*
! 	 * You can send SIGUSR1 to trigger failover.
! 	 *
! 	 * Postmaster uses SIGQUIT to request immediate shutdown. The default
! 	 * action is to core dump, but we don't want that, so trap it and
! 	 * commit suicide without core dump.
! 	 *
! 	 * We used to use SIGINT and SIGQUIT to trigger failover, but that
! 	 * turned out to be a bad idea because postmaster uses SIGQUIT to
! 	 * request immediate shutdown. We still trap SIGINT, but that is
! 	 * deprecated. We will likely switch to using SIGINT for immediate
! 	 * shutdown in future releases.
! 	 */
! 	(void) signal(SIGUSR1, sighandler);
! 	(void) signal(SIGINT, sighandler); /* deprecated, use SIGUSR1 */
! 	(void) signal(SIGQUIT, sigquit_handler);
  
  	while ((c = getopt(argc, argv, "cdk:lr:s:t:w:")) != -1)
  	{
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to