diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2008-03-14 23:49:28 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2008-03-14 23:49:28 +0000 |
commit | 4873c96ff3f38b51b29c86ede658343be01f519f (patch) | |
tree | 62f6633bdbf591ce694895270d3131799c0141a5 /src | |
parent | 4844529ce4312e2326c847431fac9ee067640a2c (diff) | |
download | postgresql-4873c96ff3f38b51b29c86ede658343be01f519f.tar.gz postgresql-4873c96ff3f38b51b29c86ede658343be01f519f.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/postmaster/autovacuum.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index ca0bdde7364..b55214e0bc5 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.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); } /* |