diff options
author | Simon Riggs <simon@2ndQuadrant.com> | 2012-06-01 09:24:53 +0100 |
---|---|---|
committer | Simon Riggs <simon@2ndQuadrant.com> | 2012-06-01 09:24:53 +0100 |
commit | 055c352abbf764a08496e94054137da9e26dac04 (patch) | |
tree | 498c69122a13e44fc59a3b913bea47259a291a30 /src | |
parent | a297d64d9223f6bd9c495ff5726a3c99080c2a4a (diff) | |
download | postgresql-055c352abbf764a08496e94054137da9e26dac04.tar.gz postgresql-055c352abbf764a08496e94054137da9e26dac04.zip |
After any checkpoint, close all smgr files handles in bgwriter
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/postmaster/bgwriter.c | 9 | ||||
-rw-r--r-- | src/backend/postmaster/checkpointer.c | 25 | ||||
-rw-r--r-- | src/include/postmaster/bgwriter.h | 2 |
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 */ |