From 945ba50dc398ad55ac0ebe5adb428177d642f2a3 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 12 Sep 2007 22:14:59 +0000 Subject: [PATCH] Fix a memory leak in the autovacuum launcher code. Noted by Darcy Buskermolen, who reported it privately to me. --- src/backend/postmaster/autovacuum.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 2a6e654269e..ab77f004093 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -55,7 +55,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.57 2007/09/11 17:15:33 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.58 2007/09/12 22:14:59 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -1038,6 +1038,9 @@ do_start_worker(void) avw_dbase *avdb; TimestampTz current_time; bool skipit = false; + Oid retval = InvalidOid; + MemoryContext tmpcxt, + oldcxt; /* return quickly when there are no free workers */ LWLockAcquire(AutovacuumLock, LW_SHARED); @@ -1048,6 +1051,17 @@ do_start_worker(void) } LWLockRelease(AutovacuumLock); + /* + * Create and switch to a temporary context to avoid leaking the memory + * allocated for the database list. + */ + tmpcxt = AllocSetContextCreate(CurrentMemoryContext, + "Start worker tmp cxt", + ALLOCSET_DEFAULT_MINSIZE, + ALLOCSET_DEFAULT_INITSIZE, + ALLOCSET_DEFAULT_MAXSIZE); + oldcxt = MemoryContextSwitchTo(tmpcxt); + /* use fresh stats */ pgstat_clear_snapshot(); @@ -1186,7 +1200,7 @@ do_start_worker(void) SendPostmasterSignal(PMSIGNAL_START_AUTOVAC_WORKER); - return avdb->adw_datid; + retval = avdb->adw_datid; } else if (skipit) { @@ -1197,7 +1211,10 @@ do_start_worker(void) rebuild_database_list(InvalidOid); } - return InvalidOid; + MemoryContextSwitchTo(oldcxt); + MemoryContextDelete(tmpcxt); + + return retval; } /*