mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
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.
This commit is contained in:
parent
4844529ce4
commit
4873c96ff3
@ -55,7 +55,7 @@
|
||||
*
|
||||
*
|
||||
* 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,
|
||||
BufferAccessStrategy bstrategy)
|
||||
{
|
||||
VacuumStmt vacstmt;
|
||||
List *relids;
|
||||
MemoryContext old_cxt;
|
||||
|
||||
/* Set up command parameters --- use a local variable instead of palloc */
|
||||
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.vacuum = dovacuum;
|
||||
vacstmt.full = false;
|
||||
@ -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.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 */
|
||||
autovac_report_activity(&vacstmt, relid);
|
||||
|
||||
vacuum(&vacstmt, list_make1_oid(relid), bstrategy, for_wraparound, true);
|
||||
MemoryContextSwitchTo(old_cxt);
|
||||
vacuum(&vacstmt, relids, bstrategy, for_wraparound, true);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user