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
|
* 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)
|
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,
|
|||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user