aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2008-07-17 21:02:41 +0000
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2008-07-17 21:02:41 +0000
commitf1583ed591fb2f1eccce3d3dcd30a0a802543adc (patch)
treeb957bedb7734d976e741c607365ad020d7c1ad13 /src
parent6dafb5b4ae9753b3951878dd1d6f353cc6f9e388 (diff)
downloadpostgresql-f1583ed591fb2f1eccce3d3dcd30a0a802543adc.tar.gz
postgresql-f1583ed591fb2f1eccce3d3dcd30a0a802543adc.zip
Avoid crashing when a table is deleted while we're on the process of checking
it. This is a stripped down version of the patch applied to HEAD. Per report from Tom Lane based on buildfarm evidence.
Diffstat (limited to 'src')
-rw-r--r--src/backend/postmaster/autovacuum.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 411c1cd4ebb..833e258c8eb 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.71.2.3 2008/03/14 23:49:33 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.71.2.4 2008/07/17 21:02:41 alvherre Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2098,13 +2098,16 @@ do_autovacuum(void)
/*
* Save the relation name for a possible error message, to avoid a
- * catalog lookup in case of an error. Note: they must live in a
- * long-lived memory context because we call vacuum and analyze in
- * different transactions.
+ * catalog lookup in case of an error. If any of these return NULL,
+ * then the relation has been dropped since last we checked; skip it.
+ * Note: they must live in a long-lived memory context because we call
+ * vacuum and analyze in different transactions.
*/
datname = get_database_name(MyDatabaseId);
nspname = get_namespace_name(get_rel_namespace(tab->at_relid));
relname = get_rel_name(tab->at_relid);
+ if (!datname || !nspname || !relname)
+ goto deleted;
/*
* We will abort vacuuming the current table if something errors out,
@@ -2158,11 +2161,15 @@ do_autovacuum(void)
/* the PGPROC flags are reset at the next end of transaction */
+deleted:
/* be tidy */
pfree(tab);
- pfree(datname);
- pfree(nspname);
- pfree(relname);
+ if (datname)
+ pfree(datname);
+ if (nspname)
+ pfree(nspname);
+ if (relname)
+ pfree(relname);
/* remove my info from shared memory */
LWLockAcquire(AutovacuumLock, LW_EXCLUSIVE);