]> granicus.if.org Git - postgresql/commitdiff
After any checkpoint, close all smgr files handles in bgwriter
authorSimon Riggs <simon@2ndQuadrant.com>
Fri, 1 Jun 2012 08:24:53 +0000 (09:24 +0100)
committerSimon Riggs <simon@2ndQuadrant.com>
Fri, 1 Jun 2012 08:24:53 +0000 (09:24 +0100)
src/backend/postmaster/bgwriter.c
src/backend/postmaster/checkpointer.c
src/include/postmaster/bgwriter.h

index 9ad7178aeb8a1ccfb9f70cfd4f18e3fc82e2d15e..32c254c8420469973023563c6dc4ee9d7099f72e 100644 (file)
@@ -276,6 +276,15 @@ BackgroundWriterMain(void)
                 */
                pgstat_send_bgwriter();
 
+               if (FirstCallSinceLastCheckpoint())
+               {
+                       /*
+                        * After any checkpoint, close all smgr files.  This is so we
+                        * won't hang onto smgr references to deleted files indefinitely.
+                        */
+                       smgrcloseall();
+               }
+
                /*
                 * Sleep until we are signaled or BgWriterDelay has elapsed.
                 *
index aa3df37324789c5fe8bac0c62b2d0233e855e9c5..6aeade92e6a92e328006e74d3f19346d91a8dd20 100644 (file)
@@ -1346,3 +1346,28 @@ UpdateSharedMemoryConfig(void)
 
        elog(DEBUG2, "checkpointer updated shared memory configuration values");
 }
+
+/*
+ * FirstCallSinceLastCheckpoint allows a process to take an action once
+ * per checkpoint cycle by asynchronously checking for checkpoint completion.
+ */
+bool
+FirstCallSinceLastCheckpoint(void)
+{
+       /* use volatile pointer to prevent code rearrangement */
+       volatile CheckpointerShmemStruct *cps = CheckpointerShmem;
+       static int      ckpt_done = 0;
+       int             new_done;
+       bool            FirstCall = false;
+
+       SpinLockAcquire(&cps->ckpt_lck);
+       new_done = cps->ckpt_done;
+       SpinLockRelease(&cps->ckpt_lck);
+
+       if (new_done != ckpt_done)
+               FirstCall = true;
+
+       ckpt_done = new_done;
+
+       return FirstCall;
+}
index d17dd1748753145855cd4bd549a6f2dc9f875de0..f46d4ad7077dc06c559528308b175b57c7bffd75 100644 (file)
@@ -38,4 +38,6 @@ extern void AbsorbFsyncRequests(void);
 extern Size CheckpointerShmemSize(void);
 extern void CheckpointerShmemInit(void);
 
+extern bool FirstCallSinceLastCheckpoint(void);
+
 #endif   /* _BGWRITER_H */