aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2007-09-12 22:14:59 +0000
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2007-09-12 22:14:59 +0000
commit945ba50dc398ad55ac0ebe5adb428177d642f2a3 (patch)
tree9f600fb2932bd67ffa3d23413586fbc561d05a90 /src
parent6889303531187f7867a5dfad5f5b5ba103f7cdd6 (diff)
downloadpostgresql-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.c23
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;
}
/*