diff options
Diffstat (limited to 'src/backend/postmaster/walwriter.c')
-rw-r--r-- | src/backend/postmaster/walwriter.c | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/src/backend/postmaster/walwriter.c b/src/backend/postmaster/walwriter.c index 23c4aacd7d..157728e20e 100644 --- a/src/backend/postmaster/walwriter.c +++ b/src/backend/postmaster/walwriter.c @@ -11,7 +11,8 @@ * * Note that as with the bgwriter for shared buffers, regular backends are * still empowered to issue WAL writes and fsyncs when the walwriter doesn't - * keep up. + * keep up. This means that the WALWriter is not an essential process and + * can shutdown quickly when requested. * * Because the walwriter's cycle is directly linked to the maximum delay * before async-commit transactions are guaranteed committed, it's probably @@ -76,7 +77,6 @@ static void wal_quickdie(SIGNAL_ARGS); static void WalSigHupHandler(SIGNAL_ARGS); static void WalShutdownHandler(SIGNAL_ARGS); - /* * Main entry point for walwriter process * @@ -89,6 +89,8 @@ WalWriterMain(void) sigjmp_buf local_sigjmp_buf; MemoryContext walwriter_context; + InitLatch(WALWriterLatch()); /* initialize latch used in main loop */ + /* * If possible, make this process a group leader, so that the postmaster * can signal any child processes too. (walwriter probably never has any @@ -220,7 +222,7 @@ WalWriterMain(void) */ for (;;) { - long udelay; + ResetLatch(WALWriterLatch()); /* * Emergency bailout if postmaster has died. This is to avoid the @@ -248,20 +250,9 @@ WalWriterMain(void) */ XLogBackgroundFlush(); - /* - * Delay until time to do something more, but fall out of delay - * reasonably quickly if signaled. - */ - udelay = WalWriterDelay * 1000L; - while (udelay > 999999L) - { - if (got_SIGHUP || shutdown_requested) - break; - pg_usleep(1000000L); - udelay -= 1000000L; - } - if (!(got_SIGHUP || shutdown_requested)) - pg_usleep(udelay); + (void) WaitLatch(WALWriterLatch(), + WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH, + WalWriterDelay /* ms */); } } @@ -308,6 +299,7 @@ static void WalSigHupHandler(SIGNAL_ARGS) { got_SIGHUP = true; + SetLatch(WALWriterLatch()); } /* SIGTERM: set flag to exit normally */ @@ -315,4 +307,5 @@ static void WalShutdownHandler(SIGNAL_ARGS) { shutdown_requested = true; + SetLatch(WALWriterLatch()); } |