]> granicus.if.org Git - postgresql/commitdiff
Optimize CleanupTempFiles by having a boolean flag that keeps track of whether
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 19 Sep 2008 04:57:10 +0000 (04:57 +0000)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 19 Sep 2008 04:57:10 +0000 (04:57 +0000)
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.

src/backend/storage/file/fd.c

index edce52155f6c14367a3c6dbde6f9f77de71cfabe..c8df66641edce98981c81fb02c6f5b224a2c77a9 100644 (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)