diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2007-09-12 22:14:59 +0000 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2007-09-12 22:14:59 +0000 |
commit | 945ba50dc398ad55ac0ebe5adb428177d642f2a3 (patch) | |
tree | 9f600fb2932bd67ffa3d23413586fbc561d05a90 /src | |
parent | 6889303531187f7867a5dfad5f5b5ba103f7cdd6 (diff) | |
download | postgresql-945ba50dc398ad55ac0ebe5adb428177d642f2a3.tar.gz postgresql-945ba50dc398ad55ac0ebe5adb428177d642f2a3.zip |
Fix a memory leak in the autovacuum launcher code. Noted by Darcy Buskermolen,
who reported it privately to me.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/postmaster/autovacuum.c | 23 |
1 files 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; } /* |