Avoid crashing when a table is deleted while we're on the process of checking
authorAlvaro Herrera <[email protected]>
Thu, 17 Jul 2008 21:02:41 +0000 (21:02 +0000)
committerAlvaro Herrera <[email protected]>
Thu, 17 Jul 2008 21:02:41 +0000 (21:02 +0000)
it.  This is a stripped down version of the patch applied to HEAD.

Per report from Tom Lane based on buildfarm evidence.

src/backend/postmaster/autovacuum.c

index 411c1cd4ebbdc932a6293a529e419d4fecfdc821..833e258c8eb6529ae54d05a7585e41432fbffda5 100644 (file)
@@ -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);