Force to send remaining WAL stats to the stats collector at walwriter exit.
authorFujii Masao <[email protected]>
Fri, 12 Mar 2021 04:29:59 +0000 (13:29 +0900)
committerFujii Masao <[email protected]>
Fri, 12 Mar 2021 04:29:59 +0000 (13:29 +0900)
In walwriter's main loop, WAL stats message is only sent if enough time
has passed since last one was sent to reach PGSTAT_STAT_INTERVAL msecs.
This is necessary to avoid overloading to the stats collector. But this
can cause recent WAL stats to be unsent when walwriter exits.

To ensure that all the WAL stats are sent, this commit makes walwriter
force to send remaining WAL stats to the collector when it exits because
of shutdown request. Note that those remaining WAL stats can still be
unsent when walwriter exits with non-zero exit code (e.g., FATAL error).
This is OK because that walwriter exit leads to server crash and
subsequent recovery discards all the stats. So there is no need to send
remaining stats in that case.

Author: Masahiro Ikeda
Reviewed-by: Fujii Masao
Discussion: https://postgr.es/m/0509ad67b585a5b86a83d445dfa75392@oss.nttdata.com

src/backend/postmaster/walwriter.c

index 132df29aba243f337ba3f500532c359d2eeed5c1..626fae8454ca4d38cacc9fd4e6c82ce596990908 100644 (file)
@@ -78,6 +78,9 @@ int           WalWriterFlushAfter = 128;
 #define LOOPS_UNTIL_HIBERNATE      50
 #define HIBERNATE_FACTOR           25
 
+/* Prototypes for private functions */
+static void HandleWalWriterInterrupts(void);
+
 /*
  * Main entry point for walwriter process
  *
@@ -242,7 +245,8 @@ WalWriterMain(void)
        /* Clear any already-pending wakeups */
        ResetLatch(MyLatch);
 
-       HandleMainLoopInterrupts();
+       /* Process any signals received recently */
+       HandleWalWriterInterrupts();
 
        /*
         * Do what we're here for; then, if XLogBackgroundFlush() found useful
@@ -272,3 +276,34 @@ WalWriterMain(void)
                         WAIT_EVENT_WAL_WRITER_MAIN);
    }
 }
+
+/*
+ * Interrupt handler for main loops of WAL writer process.
+ */
+static void
+HandleWalWriterInterrupts(void)
+{
+   if (ProcSignalBarrierPending)
+       ProcessProcSignalBarrier();
+
+   if (ConfigReloadPending)
+   {
+       ConfigReloadPending = false;
+       ProcessConfigFile(PGC_SIGHUP);
+   }
+
+   if (ShutdownRequestPending)
+   {
+       /*
+        * Force to send remaining WAL statistics to the stats collector at
+        * process exit.
+        *
+        * Since pgstat_send_wal is invoked with 'force' is false in main loop
+        * to avoid overloading to the stats collector, there may exist unsent
+        * stats counters for the WAL writer.
+        */
+       pgstat_send_wal(true);
+
+       proc_exit(0);
+   }
+}