From 07319e1628db802899095d255f62e682e41d1f39 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 | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 97a0509175..d653167fc9 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -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; } /* -- 2.39.5