Zdenek Kotala wrote:

> Just a confirmation that Alvaro's patch+ReleasePostmasterChildSlot() fix
> solves the problem and PostgreSQL survives well during a memory
> shortages.

So this patch would do it.

I think this stuff about postmaster child slots is later than
launcher/worker split.  I don't recall seeing it before.

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.587
diff -c -p -r1.587 postmaster.c
*** src/backend/postmaster/postmaster.c	7 Aug 2009 05:58:55 -0000	1.587
--- src/backend/postmaster/postmaster.c	24 Aug 2009 15:05:50 -0000
*************** bool		redirection_done = false;	/* stder
*** 290,295 ****
--- 290,297 ----
  
  /* received START_AUTOVAC_LAUNCHER signal */
  static volatile sig_atomic_t start_autovac_launcher = false;
+ /* the launcher needs to be signalled to communicate some condition */
+ static volatile bool		avlauncher_needs_signal = false;
  
  /*
   * State for assigning random salts and cancel keys.
*************** ServerLoop(void)
*** 1391,1396 ****
--- 1393,1406 ----
  		if (PgStatPID == 0 && pmState == PM_RUN)
  			PgStatPID = pgstat_start();
  
+ 		/* If we need to signal the autovacuum launcher, do so now */
+ 		if (avlauncher_needs_signal)
+ 		{
+ 			avlauncher_needs_signal = false;
+ 			if (AutoVacPID != 0)
+ 				kill(AutoVacPID, SIGUSR1);
+ 		}
+ 
  		/*
  		 * Touch the socket and lock file every 58 minutes, to ensure that
  		 * they are not removed by overzealous /tmp-cleaning tasks.  We assume
*************** StartAutovacuumWorker(void)
*** 4343,4348 ****
--- 4353,4359 ----
  			 * fork failed, fall through to report -- actual error message was
  			 * logged by StartAutoVacWorker
  			 */
+ 			ReleasePostmasterChildSlot(bn->child_slot);
  			free(bn);
  		}
  		else
*************** StartAutovacuumWorker(void)
*** 4354,4365 ****
  	/*
  	 * Report the failure to the launcher, if it's running.  (If it's not, we
  	 * might not even be connected to shared memory, so don't try to call
! 	 * AutoVacWorkerFailed.)
  	 */
  	if (AutoVacPID != 0)
  	{
  		AutoVacWorkerFailed();
! 		kill(AutoVacPID, SIGUSR1);
  	}
  }
  
--- 4365,4380 ----
  	/*
  	 * Report the failure to the launcher, if it's running.  (If it's not, we
  	 * might not even be connected to shared memory, so don't try to call
! 	 * AutoVacWorkerFailed.)  Note that we also need to signal it so that it
! 	 * responds to the condition, but we don't do that here, instead waiting
! 	 * for ServerLoop to do it.  This way we avoid a ping-pong signalling in
! 	 * quick succession between the autovac launcher and postmaster in case
! 	 * things get ugly.
  	 */
  	if (AutoVacPID != 0)
  	{
  		AutoVacWorkerFailed();
! 		avlauncher_needs_signal = true;
  	}
  }
  
-- 
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