mirror of
https://github.com/postgres/postgres.git
synced 2025-05-28 05:21:27 +03:00
Fix erroneous memory context switch in autovacuum, which was returning to a
context long after it had been destroyed. Per problem report from Justin Pasher. Patch by Tom Lane and me. 8.3 and later do not have this bug, because this code has been restructured for unrelated reasons. In 8.2 it does not manifest as a crash, but it still seems safer fixing it nonetheless.
This commit is contained in:
parent
8bdcdd2274
commit
74f933a648
@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.5.2.8 2008/01/17 23:47:07 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.5.2.9 2009/01/20 12:17:29 alvherre Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -925,13 +925,12 @@ autovacuum_do_vac_analyze(List *relids, bool dovacuum, bool doanalyze,
|
||||
bool freeze)
|
||||
{
|
||||
VacuumStmt *vacstmt;
|
||||
MemoryContext old_cxt;
|
||||
|
||||
/*
|
||||
* The node must survive transaction boundaries, so make sure we create it
|
||||
* in a long-lived context
|
||||
*/
|
||||
old_cxt = MemoryContextSwitchTo(AutovacMemCxt);
|
||||
MemoryContextSwitchTo(AutovacMemCxt);
|
||||
|
||||
vacstmt = makeNode(VacuumStmt);
|
||||
|
||||
@ -957,7 +956,9 @@ autovacuum_do_vac_analyze(List *relids, bool dovacuum, bool doanalyze,
|
||||
vacuum(vacstmt, relids);
|
||||
|
||||
pfree(vacstmt);
|
||||
MemoryContextSwitchTo(old_cxt);
|
||||
|
||||
/* Make sure we end up pointing to the long-lived context at exit */
|
||||
MemoryContextSwitchTo(AutovacMemCxt);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user