From: Alvaro Herrera Date: Fri, 19 Sep 2008 04:57:10 +0000 (+0000) Subject: Optimize CleanupTempFiles by having a boolean flag that keeps track of whether X-Git-Tag: REL8_4_BETA1~974 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5817d861e9cf2d05a9379bd1b72c95caf7d36559;p=thirdparty%2Fpostgresql.git 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. --- diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index edce52155f6..c8df66641ed 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -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)