diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2008-07-17 21:02:41 +0000 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2008-07-17 21:02:41 +0000 |
commit | f1583ed591fb2f1eccce3d3dcd30a0a802543adc (patch) | |
tree | b957bedb7734d976e741c607365ad020d7c1ad13 /src | |
parent | 6dafb5b4ae9753b3951878dd1d6f353cc6f9e388 (diff) | |
download | postgresql-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.c | 21 |
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); |