aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/postmaster/bgwriter.c9
-rw-r--r--src/backend/postmaster/checkpointer.c25
-rw-r--r--src/include/postmaster/bgwriter.h2
3 files changed, 36 insertions, 0 deletions
diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c
index 9ad7178aeb8..32c254c8420 100644
--- a/src/backend/postmaster/bgwriter.c
+++ b/src/backend/postmaster/bgwriter.c
@@ -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.
*
diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index aa3df373247..6aeade92e6a 100644
--- a/src/backend/postmaster/checkpointer.c
+++ b/src/backend/postmaster/checkpointer.c
@@ -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;
+}
diff --git a/src/include/postmaster/bgwriter.h b/src/include/postmaster/bgwriter.h
index d17dd174875..f46d4ad7077 100644
--- a/src/include/postmaster/bgwriter.h
+++ b/src/include/postmaster/bgwriter.h
@@ -38,4 +38,6 @@ extern void AbsorbFsyncRequests(void);
extern Size CheckpointerShmemSize(void);
extern void CheckpointerShmemInit(void);
+extern bool FirstCallSinceLastCheckpoint(void);
+
#endif /* _BGWRITER_H */