Back out check for unreferenced files.
authorBruce Momjian <bruce@momjian.us>
Tue, 10 May 2005 22:27:30 +0000 (22:27 +0000)
committerBruce Momjian <bruce@momjian.us>
Tue, 10 May 2005 22:27:30 +0000 (22:27 +0000)
Heikki Linnakangas

doc/src/sgml/maintenance.sgml
src/backend/access/transam/xlog.c
src/backend/catalog/catalog.c
src/backend/commands/tablespace.c
src/backend/utils/adt/misc.c
src/backend/utils/init/Makefile
src/backend/utils/init/checkfiles.c [deleted file]
src/include/catalog/catalog.h
src/include/utils/flatfiles.h

index 6315dacf404184e4f9fa426968098eaba545a6a3..1527a9b743d954b8062ed6e40c547cfcab524f0c 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/maintenance.sgml,v 1.42 2005/05/02 18:26:52 momjian Exp $
+$PostgreSQL: pgsql/doc/src/sgml/maintenance.sgml,v 1.43 2005/05/10 22:27:29 momjian Exp $
 -->
 
 <chapter id="maintenance">
@@ -474,23 +474,6 @@ HINT:  Stop the postmaster and use a standalone backend to VACUUM in "mydb".
   </para>
  </sect1>
 
- <sect1 id="check-files-after-crash">
-  <title>Check files after crash</title>
-
-  <indexterm zone="check-files-after-crash">
-   <primary>stale file</primary>
-  </indexterm>
-
-  <para>
-   <productname>PostgreSQL</productname> recovers automatically after crash
-   using the write-ahead log (see <xref linkend="wal">) and no manual 
-   operations are normally needed. However, if there was a transaction running 
-   when the crash occured that created or dropped a relation, the 
-   transaction might have left a stale file in the data directory. If this 
-   happens, you will get a notice in the log file stating which files can be 
-   deleted.
-  </para>
- </sect1>
 
  <sect1 id="logfile-maintenance">
   <title>Log File Maintenance</title>
index 096b822599c8e0d88d602ba49e267f4b77abe74f..fdee576911859717aa82a8f139e379b48a1e0ea1 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.190 2005/05/02 18:26:52 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.191 2005/05/10 22:27:29 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -43,7 +43,6 @@
 #include "utils/builtins.h"
 #include "utils/guc.h"
 #include "utils/relcache.h"
-#include "utils/flatfiles.h"
 
 
 /*
@@ -4526,8 +4525,6 @@ StartupXLOG(void)
 
        CreateCheckPoint(true, true);
 
-       CheckStaleRelFiles();
-
        /*
         * Close down recovery environment
         */
@@ -4539,12 +4536,6 @@ StartupXLOG(void)
         */
        remove_backup_label();
    }
-   else
-   {
-       XLogInitRelationCache();
-       CheckStaleRelFiles();
-       XLogCloseRelationCache();
-   }
 
    /*
     * Preallocate additional log files, if wanted.
index 044b4a1bbd649245cca17374dad7e1a9d57a21d6..f00e9aeec5f9483331f78b7d78401f558d387c86 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.60 2005/05/02 18:26:53 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.61 2005/05/10 22:27:29 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -106,39 +106,6 @@ GetDatabasePath(Oid dbNode, Oid spcNode)
    return path;
 }
 
-/*
- * GetTablespacePath   - construct path to a tablespace symbolic link
- *
- * Result is a palloc'd string.
- *
- * XXX this must agree with relpath and GetDatabasePath!
- */
-char *
-GetTablespacePath(Oid spcNode)
-{
-   int         pathlen;
-   char       *path;
-
-   Assert(spcNode != GLOBALTABLESPACE_OID);
-
-   if (spcNode == DEFAULTTABLESPACE_OID)
-   {
-       /* The default tablespace is {datadir}/base */
-       pathlen = strlen(DataDir) + 5 + 1;
-       path = (char *) palloc(pathlen);
-       snprintf(path, pathlen, "%s/base",
-                DataDir);
-   }
-   else
-   {
-       /* All other tablespaces have symlinks in pg_tblspc */
-       pathlen = strlen(DataDir) + 11 + OIDCHARS + 1;
-       path = (char *) palloc(pathlen);
-       snprintf(path, pathlen, "%s/pg_tblspc/%u",
-                DataDir, spcNode);
-   }
-   return path;
-}
 
 /*
  * IsSystemRelation
index be0cc55594050469e8eae799792f9a1743b1cc31..bf62aec5282703e8cdc7ccfc38bc42b8de89f6d7 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.18 2005/05/02 18:26:53 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.19 2005/05/10 22:27:29 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -341,7 +341,8 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
    /*
     * All seems well, create the symlink
     */
-   linkloc = GetTablespacePath(tablespaceoid);
+   linkloc = (char *) palloc(strlen(DataDir) + 11 + 10 + 1);
+   sprintf(linkloc, "%s/pg_tblspc/%u", DataDir, tablespaceoid);
 
    if (symlink(location, linkloc) < 0)
        ereport(ERROR,
@@ -494,7 +495,8 @@ remove_tablespace_directories(Oid tablespaceoid, bool redo)
    char       *subfile;
    struct stat st;
 
-   location = GetTablespacePath(tablespaceoid);
+   location = (char *) palloc(strlen(DataDir) + 11 + 10 + 1);
+   sprintf(location, "%s/pg_tblspc/%u", DataDir, tablespaceoid);
 
    /*
     * Check if the tablespace still contains any files.  We try to rmdir
@@ -1034,7 +1036,8 @@ tblspc_redo(XLogRecPtr lsn, XLogRecord *record)
        set_short_version(location);
 
        /* Create the symlink if not already present */
-       linkloc = GetTablespacePath(xlrec->ts_id);
+       linkloc = (char *) palloc(strlen(DataDir) + 11 + 10 + 1);
+       sprintf(linkloc, "%s/pg_tblspc/%u", DataDir, xlrec->ts_id);
 
        if (symlink(location, linkloc) < 0)
        {
index 68586bba7ef4331d644071836702c7a78a2d9f21..2b1c5e7406ffd86ccd48cc2c27e20b0e60800f5a 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.41 2005/05/02 18:26:53 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.42 2005/05/10 22:27:30 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -26,7 +26,6 @@
 #include "funcapi.h"
 #include "catalog/pg_type.h"
 #include "catalog/pg_tablespace.h"
-#include "catalog/catalog.h"
 
 #define atooid(x)  ((Oid) strtoul((x), NULL, 10))
 
@@ -145,6 +144,11 @@ pg_tablespace_databases(PG_FUNCTION_ARGS)
 
        fctx = palloc(sizeof(ts_db_fctx));
 
+       /*
+        * size = path length + tablespace dirname length + 2 dir sep
+        * chars + oid + terminator
+        */
+       fctx->location = (char *) palloc(strlen(DataDir) + 11 + 10 + 1);
        if (tablespaceOid == GLOBALTABLESPACE_OID)
        {
            fctx->dirdesc = NULL;
@@ -153,7 +157,12 @@ pg_tablespace_databases(PG_FUNCTION_ARGS)
        }
        else
        {
-           fctx->location = GetTablespacePath(tablespaceOid);
+           if (tablespaceOid == DEFAULTTABLESPACE_OID)
+               sprintf(fctx->location, "%s/base", DataDir);
+           else
+               sprintf(fctx->location, "%s/pg_tblspc/%u", DataDir,
+                       tablespaceOid);
+
            fctx->dirdesc = AllocateDir(fctx->location);
 
            if (!fctx->dirdesc)
index 3e5f885390d58e44fcd42e209bfdd3c08eecd6b3..ec9d3aa2d23ffce446d5384ba270680ffa2e9130 100644 (file)
@@ -4,7 +4,7 @@
 #    Makefile for utils/init
 #
 # IDENTIFICATION
-#    $PostgreSQL: pgsql/src/backend/utils/init/Makefile,v 1.19 2005/05/02 18:26:53 momjian Exp $
+#    $PostgreSQL: pgsql/src/backend/utils/init/Makefile,v 1.20 2005/05/10 22:27:30 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -12,7 +12,7 @@ subdir = src/backend/utils/init
 top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 
-OBJS = flatfiles.o globals.o miscinit.o postinit.o checkfiles.o
+OBJS = flatfiles.o globals.o miscinit.o postinit.o
 
 all: SUBSYS.o
 
diff --git a/src/backend/utils/init/checkfiles.c b/src/backend/utils/init/checkfiles.c
deleted file mode 100644 (file)
index 8ed5110..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * checkfiles.c
- *   check for stale relation files during crash recovery
- *
- * If a backend crashes while in a transaction that has created or
- * deleted a relfilenode, a stale file can be left over in the data
- * directory. This file contains routines to clean up those stale
- * files on recovery.
- *
- * This adds a 17% increase in startup cost for 100 empty databases.  bjm
- * One optimization would be to create a 'dirty' file on a postmaster recovery
- * and remove the dirty flag only when a clean startup detects no unreferenced
- * files, and use the 'dirty' flag to determine if we should run this on
- * a clean startup.
- *
- * $PostgreSQL: pgsql/src/backend/utils/init/checkfiles.c,v 1.2 2005/05/05 22:18:27 tgl Exp $
- *
- *-------------------------------------------------------------------------
- */
-#include "postgres.h"
-
-#include "access/heapam.h"
-#include "access/relscan.h"
-#include "access/skey.h"
-#include "catalog/catalog.h"
-#include "catalog/pg_tablespace.h"
-#include "miscadmin.h"
-#include "storage/fd.h"
-#include "utils/flatfiles.h"
-#include "utils/fmgroids.h"
-#include "utils/resowner.h"
-
-
-static void CheckStaleRelFilesFrom(Oid tablespaceoid, Oid dboid);
-static void CheckStaleRelFilesFromTablespace(Oid tablespaceoid);
-
-/* Like AllocateDir, but ereports on failure */
-static DIR *
-AllocateDirChecked(char *path)
-{
-   DIR        *dirdesc = AllocateDir(path);
-
-   if (dirdesc == NULL)
-       ereport(ERROR,
-               (errcode_for_file_access(),
-                errmsg("could not open directory \"%s\": %m",
-                       path)));
-   return dirdesc;
-}
-
-/*
- * Scan through all tablespaces for relations left over
- * by aborted transactions.
- */
-void
-CheckStaleRelFiles(void)
-{
-   DIR        *dirdesc;
-   struct dirent *de;
-   char       *path;
-   int         pathlen;
-
-   pathlen = strlen(DataDir) + 11 + 1;
-   path = (char *) palloc(pathlen);
-   snprintf(path, pathlen, "%s/pg_tblspc/", DataDir);
-   dirdesc = AllocateDirChecked(path);
-   while ((de = readdir(dirdesc)) != NULL)
-   {
-       char       *invalid;
-       Oid         tablespaceoid;
-
-       /* Check that the directory name looks like valid tablespace link.  */
-       tablespaceoid = (Oid) strtol(de->d_name, &invalid, 10);
-       if (invalid[0] == '\0')
-           CheckStaleRelFilesFromTablespace(tablespaceoid);
-   }
-   FreeDir(dirdesc);
-   pfree(path);
-
-   CheckStaleRelFilesFromTablespace(DEFAULTTABLESPACE_OID);
-}
-
-/* Scan a specific tablespace for stale relations */
-static void
-CheckStaleRelFilesFromTablespace(Oid tablespaceoid)
-{
-   DIR        *dirdesc;
-   struct dirent *de;
-   char       *path;
-
-   path = GetTablespacePath(tablespaceoid);
-
-   dirdesc = AllocateDirChecked(path);
-   while ((de = readdir(dirdesc)) != NULL)
-   {
-       char       *invalid;
-       Oid         dboid;
-
-       dboid = (Oid) strtol(de->d_name, &invalid, 10);
-       if (invalid[0] == '\0')
-           CheckStaleRelFilesFrom(tablespaceoid, dboid);
-   }
-   FreeDir(dirdesc);
-   pfree(path);
-}
-
-/* Scan a specific database in a specific tablespace for stale relations.
- *
- * First, pg_class for the database is opened, and the relfilenodes of all
- * relations mentioned there are stored in a hash table.
- *
- * Then the directory is scanned. Every file in the directory that's not
- * found in pg_class (the hash table) is logged.
- */
-static void
-CheckStaleRelFilesFrom(Oid tablespaceoid, Oid dboid)
-{
-   DIR        *dirdesc;
-   struct dirent *de;
-   HASHCTL     hashctl;
-   HTAB       *relfilenodeHash;
-   RelFileNode rnode;
-   char       *path;
-
-   /*
-    * The entry contents is not used for anything, we just check if an oid is
-    * in the hash table or not.
-    */
-   hashctl.keysize = sizeof(Oid);
-   hashctl.entrysize = sizeof(Oid);
-   hashctl.hash = tag_hash;
-   relfilenodeHash = hash_create("relfilenodeHash", 100, &hashctl,
-                                 HASH_FUNCTION | HASH_ELEM);
-
-   /* Read all relfilenodes from pg_class into the hash table */
-   {
-       ResourceOwner owner,
-                   oldowner;
-       Relation    rel;
-       HeapScanDesc scan;
-       HeapTuple   tuple;
-
-       /* Need a resowner to keep the heapam and buffer code happy */
-       owner = ResourceOwnerCreate(NULL, "CheckStaleRelFiles");
-       oldowner = CurrentResourceOwner;
-       CurrentResourceOwner = owner;
-
-       rnode.spcNode = tablespaceoid;
-       rnode.dbNode = dboid;
-       rnode.relNode = RelationRelationId;
-       rel = XLogOpenRelation(true, 0, rnode);
-
-       scan = heap_beginscan(rel, SnapshotNow, 0, NULL);
-       while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
-       {
-           Form_pg_class classform = (Form_pg_class) GETSTRUCT(tuple);
-
-           hash_search(relfilenodeHash, &classform->relfilenode,
-                       HASH_ENTER, NULL);
-       }
-       heap_endscan(scan);
-
-       XLogCloseRelation(rnode);
-       CurrentResourceOwner = oldowner;
-       ResourceOwnerDelete(owner);
-   }
-
-   /* Scan the directory */
-   path = GetDatabasePath(dboid, tablespaceoid);
-
-   dirdesc = AllocateDirChecked(path);
-   while ((de = readdir(dirdesc)) != NULL)
-   {
-       char       *invalid;
-       Oid         relfilenode;
-
-       relfilenode = strtol(de->d_name, &invalid, 10);
-       if (invalid[0] == '\0')
-       {
-           /*
-            * Filename was a valid number, check if pg_class knows about it
-            */
-           if (hash_search(relfilenodeHash, &relfilenode,
-                           HASH_FIND, NULL) == NULL)
-           {
-               char       *filepath;
-
-               rnode.spcNode = tablespaceoid;
-               rnode.dbNode = dboid;
-               rnode.relNode = relfilenode;
-
-               filepath = relpath(rnode);
-               ereport(LOG,
-                       (errcode_for_file_access(),
-                        errmsg("table or index file \"%s\" is stale and can safely be removed",
-                               filepath)));
-               pfree(filepath);
-           }
-       }
-   }
-   FreeDir(dirdesc);
-   pfree(path);
-   hash_destroy(relfilenodeHash);
-}
index 836a04583d664ed9617dcfa9b2a2fa688e19b0df..c9da1b35abe0e39bec1989e68e5577e5dff5aa91 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/catalog.h,v 1.31 2005/05/02 18:26:54 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catalog.h,v 1.32 2005/05/10 22:27:30 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -19,7 +19,6 @@
 
 extern char *relpath(RelFileNode rnode);
 extern char *GetDatabasePath(Oid dbNode, Oid spcNode);
-extern char *GetTablespacePath(Oid spcNode);
 
 extern bool IsSystemRelation(Relation relation);
 extern bool IsToastRelation(Relation relation);
index 21eca19477de966044998a63cb251a9e1ba5b5ba..04a901ab008412e6c4014db6551f184f7d3e0435 100644 (file)
@@ -4,7 +4,7 @@
  *   Routines for maintaining "flat file" images of the shared catalogs.
  *
  *
- * $PostgreSQL: pgsql/src/include/utils/flatfiles.h,v 1.2 2005/05/02 18:26:54 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/utils/flatfiles.h,v 1.3 2005/05/10 22:27:30 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -30,7 +30,4 @@ extern void AtEOSubXact_UpdateFlatFiles(bool isCommit,
 
 extern Datum flatfile_update_trigger(PG_FUNCTION_ARGS);
 
-/* from checkfiles.c */
-extern void CheckStaleRelFiles(void);
-
 #endif   /* FLATFILES_H */