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 d2c26922163b2b05574f9de3236282ace1dd8274..105dd44e9ef1fe432719e9bcb85f4762e66de27e 100644 (file)
@@ -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)