aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2007-10-25 14:45:55 +0000
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2007-10-25 14:45:55 +0000
commitdbe48765cd5697349ac00bd3e81cf45c8e0ddb1f (patch)
treee56d24c8bbce64059cc4c2fbb8dfbf173eef3500 /src
parentfcc20bd4ba98b82d30968f960ad65ea5b837cf3a (diff)
downloadpostgresql-dbe48765cd5697349ac00bd3e81cf45c8e0ddb1f.tar.gz
postgresql-dbe48765cd5697349ac00bd3e81cf45c8e0ddb1f.zip
Extract catalog info for error reporting before an error actually happens.
Also, remove redundant reset of for-wraparound PGPROC flag. Thanks to Tom Lane for noticing both bogosities.
Diffstat (limited to 'src')
-rw-r--r--src/backend/postmaster/autovacuum.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index ea586f899a5..d77a4d96133 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.63 2007/10/24 20:55:36 alvherre Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.64 2007/10/25 14:45:55 alvherre Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1994,6 +1994,9 @@ do_autovacuum(void)
autovac_table *tab;
WorkerInfo worker;
bool skipit;
+ char *datname,
+ *nspname,
+ *relname;
CHECK_FOR_INTERRUPTS();
@@ -2095,6 +2098,17 @@ next_worker:
}
/*
+ * Save the relation name for a possible error message, to avoid a
+ * catalog lookup in case of an error. We do it in
+ * TopTransactionContext so that they go away automatically in the next
+ * iteration.
+ */
+ MemoryContextSwitchTo(TopTransactionContext);
+ datname = get_database_name(MyDatabaseId);
+ nspname = get_namespace_name(get_rel_namespace(tab->at_relid));
+ relname = get_rel_name(tab->at_relid);
+
+ /*
* We will abort vacuuming the current table if something errors out,
* and continue with the next one in schedule; in particular, this
* happens if we are interrupted with SIGINT.
@@ -2102,7 +2116,6 @@ next_worker:
PG_TRY();
{
/* have at it */
- MemoryContextSwitchTo(TopTransactionContext);
autovacuum_do_vac_analyze(tab->at_relid,
tab->at_dovacuum,
tab->at_doanalyze,
@@ -2118,14 +2131,10 @@ next_worker:
HOLD_INTERRUPTS();
if (tab->at_dovacuum)
errcontext("automatic vacuum of table \"%s.%s.%s\"",
- get_database_name(MyDatabaseId),
- get_namespace_name(get_rel_namespace(tab->at_relid)),
- get_rel_name(tab->at_relid));
+ datname, nspname, relname);
else
errcontext("automatic analyze of table \"%s.%s.%s\"",
- get_database_name(MyDatabaseId),
- get_namespace_name(get_rel_namespace(tab->at_relid)),
- get_rel_name(tab->at_relid));
+ datname, nspname, relname);
EmitErrorReport();
/* this resets the PGPROC flags too */
@@ -2139,13 +2148,7 @@ next_worker:
}
PG_END_TRY();
- /* reset my PGPROC flag */
- if (tab->at_wraparound)
- {
- LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
- MyProc->vacuumFlags &= ~PROC_VACUUM_FOR_WRAPAROUND;
- LWLockRelease(ProcArrayLock);
- }
+ /* the PGPROC flags are reset at the next end of transaction */
/* be tidy */
pfree(tab);