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:
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user