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