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)