1
0
mirror of https://github.com/postgres/postgres.git synced 2025-10-21 02:52:47 +03:00

While changing Cygwin Python to build its core as a DLL (like Win32

Python) to support shared extension modules, I have learned that Guido
prefers the style of the attached patch to solve the above problem.
I feel that this solution is particularly appropriate in this case
because the following:

    PglargeType
    PgType
    PgQueryType

are already being handled in the way that I am proposing for PgSourceType.

Jason Tishler
This commit is contained in:
Bruce Momjian
2001-05-25 15:34:50 +00:00
parent 3f7c542a60
commit dffb673692
10 changed files with 210 additions and 20 deletions

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.193 2001/05/18 21:24:18 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.194 2001/05/25 15:34:49 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -16,9 +16,12 @@
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/file.h>
#include <sys/stat.h>
@@ -30,6 +33,7 @@
#include "access/genam.h"
#include "access/heapam.h"
#include "access/transam.h"
#include "access/xlog.h"
#include "catalog/catalog.h"
#include "catalog/catname.h"
@@ -159,6 +163,7 @@ static int vac_cmp_vtlinks(const void *left, const void *right);
static bool enough_space(VacPage vacpage, Size len);
static void init_rusage(VacRUsage *ru0);
static char *show_rusage(VacRUsage *ru0);
static void report_orphans(void);
/*
@@ -236,6 +241,10 @@ vacuum(VacuumStmt *vacstmt)
/* clean up */
vacuum_shutdown();
if (VacRelName == NULL)
report_orphans();
}
/*
@@ -2646,3 +2655,74 @@ show_rusage(VacRUsage *ru0)
return result;
}
/*
* report_orphans
*
* Report files that are not referenced by any pg_class.relfilenode.
* Could be caused by backend crash no cleaning up.
*/
static void
report_orphans(void)
{
DIR *db_dir;
struct dirent *db_de;
Relation rel;
TupleDesc tupdesc;
HeapScanDesc scan;
HeapTuple tuple;
Oid dir_file_oid;
Oid rel_file_oid;
Datum d;
bool n;
bool match_found;
char cwd[MAXPGPATH];
getcwd(cwd,MAXPGPATH);
db_dir = opendir(".");
rel = heap_openr(RelationRelationName, AccessShareLock);
Assert(db_dir);
/*
* Cycle through directory and check each file against
* pg_class.relfilenode.
* XXX This is O(n^2). Is it too slow? bjm
*/
while ((db_de = readdir(db_dir)) != NULL)
{
if (strspn(db_de->d_name, "0123456789") ==
strlen(db_de->d_name))
{
dir_file_oid = (Oid) strtoul((db_de->d_name), NULL, 10);
if (dir_file_oid >= GetMinStartupOid() ||
dir_file_oid <= BootstrapObjectIdData)
continue;
tupdesc = RelationGetDescr(rel);
match_found = false;
scan = heap_beginscan(rel, false, SnapshotNow, 0, (ScanKey) NULL);
while (HeapTupleIsValid(tuple = heap_getnext(scan, 0)))
{
d = heap_getattr(tuple, Anum_pg_class_relfilenode, tupdesc, &n);
rel_file_oid = DatumGetObjectId(d);
if (dir_file_oid == rel_file_oid)
{
match_found = true;
break;
}
}
heap_endscan(scan);
/* make sure there was no oid wrap-around during the scan */
if (!match_found && dir_file_oid <= ShmemVariableCache->nextOid)
elog(NOTICE,
"Unreferenced file found in database directory:\n\t%s/%s",
cwd, db_de->d_name);
/* Maybe one day we can unlink too. bjm 2001-05-24 */
}
}
heap_close(rel, AccessShareLock);
closedir(db_dir);
}