1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-30 11:03:19 +03:00

Optimize CleanupTempFiles by having a boolean flag that keeps track of whether

there are FD_XACT_TEMPORARY files to clean up at transaction end.

Per performance profiling results on AWeber's huge systems.

Patch by me after an idea suggested by Simon Riggs.
This commit is contained in:
Alvaro Herrera
2008-09-19 04:57:10 +00:00
parent 9fe79c39ca
commit 5817d861e9

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.144 2008/03/10 20:06:27 tgl Exp $
* $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.145 2008/09/19 04:57:10 alvherre Exp $
*
* NOTES:
*
@ -121,6 +121,12 @@ static int max_safe_fds = 32; /* default if not changed */
#define FD_TEMPORARY (1 << 0) /* T = delete when closed */
#define FD_XACT_TEMPORARY (1 << 1) /* T = delete at eoXact */
/*
* Flag to tell whether it's worth scanning VfdCache looking for temp files to
* close
*/
static bool have_xact_temporary_files = false;
typedef struct vfd
{
int fd; /* current FD, or VFD_CLOSED if none */
@ -889,6 +895,9 @@ OpenTemporaryFile(bool interXact)
{
VfdCache[file].fdstate |= FD_XACT_TEMPORARY;
VfdCache[file].create_subid = GetCurrentSubTransactionId();
/* ensure cleanup happens at eoxact */
have_xact_temporary_files = true;
}
return file;
@ -1608,7 +1617,7 @@ AtEOSubXact_Files(bool isCommit, SubTransactionId mySubid,
{
Index i;
if (SizeVfdCache > 0)
if (have_xact_temporary_files)
{
Assert(FileIsNotOpen(0)); /* Make sure ring not corrupted */
for (i = 1; i < SizeVfdCache; i++)
@ -1684,7 +1693,11 @@ CleanupTempFiles(bool isProcExit)
{
Index i;
if (SizeVfdCache > 0)
/*
* Careful here: at proc_exit we need extra cleanup, not just
* xact_temporary files.
*/
if (isProcExit || have_xact_temporary_files)
{
Assert(FileIsNotOpen(0)); /* Make sure ring not corrupted */
for (i = 1; i < SizeVfdCache; i++)
@ -1702,6 +1715,8 @@ CleanupTempFiles(bool isProcExit)
FileClose(i);
}
}
have_xact_temporary_files = false;
}
while (numAllocatedDescs > 0)