Commit 4873c96f authored by Tom Lane's avatar Tom Lane

Fix inappropriately-timed memory context switch in autovacuum_do_vac_analyze.

This accidentally failed to fail before 8.3, because the context we were
switching back to was long-lived anyway; but it sure looks risky as can be
now.  Well spotted by Pavan Deolasee.
parent 4844529c
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.73 2008/03/14 17:25:58 alvherre Exp $ * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.74 2008/03/14 23:49:28 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -2602,17 +2602,12 @@ autovacuum_do_vac_analyze(Oid relid, bool dovacuum, bool doanalyze, ...@@ -2602,17 +2602,12 @@ autovacuum_do_vac_analyze(Oid relid, bool dovacuum, bool doanalyze,
BufferAccessStrategy bstrategy) BufferAccessStrategy bstrategy)
{ {
VacuumStmt vacstmt; VacuumStmt vacstmt;
List *relids;
MemoryContext old_cxt; MemoryContext old_cxt;
/* Set up command parameters --- use a local variable instead of palloc */
MemSet(&vacstmt, 0, sizeof(vacstmt)); MemSet(&vacstmt, 0, sizeof(vacstmt));
/*
* The list must survive transaction boundaries, so make sure we create it
* in a long-lived context
*/
old_cxt = MemoryContextSwitchTo(AutovacMemCxt);
/* Set up command parameters */
vacstmt.type = T_VacuumStmt; vacstmt.type = T_VacuumStmt;
vacstmt.vacuum = dovacuum; vacstmt.vacuum = dovacuum;
vacstmt.full = false; vacstmt.full = false;
...@@ -2622,11 +2617,18 @@ autovacuum_do_vac_analyze(Oid relid, bool dovacuum, bool doanalyze, ...@@ -2622,11 +2617,18 @@ autovacuum_do_vac_analyze(Oid relid, bool dovacuum, bool doanalyze,
vacstmt.relation = NULL; /* not used since we pass a relids list */ vacstmt.relation = NULL; /* not used since we pass a relids list */
vacstmt.va_cols = NIL; vacstmt.va_cols = NIL;
/*
* The list must survive transaction boundaries, so make sure we create it
* in a long-lived context
*/
old_cxt = MemoryContextSwitchTo(AutovacMemCxt);
relids = list_make1_oid(relid);
MemoryContextSwitchTo(old_cxt);
/* Let pgstat know what we're doing */ /* Let pgstat know what we're doing */
autovac_report_activity(&vacstmt, relid); autovac_report_activity(&vacstmt, relid);
vacuum(&vacstmt, list_make1_oid(relid), bstrategy, for_wraparound, true); vacuum(&vacstmt, relids, bstrategy, for_wraparound, true);
MemoryContextSwitchTo(old_cxt);
} }
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment