Make archiver process handle barrier events.
authorFujii Masao
Fri, 18 Jun 2021 08:57:09 +0000 (17:57 +0900)
committerFujii Masao
Fri, 18 Jun 2021 08:57:09 +0000 (17:57 +0900)
Commit d75288fb27 made WAL archiver process an auxiliary process.
An auxiliary process needs to handle barrier events but the commit
forgot to make archiver process do that.

Reported-by: Thomas Munro
Author: Fujii Masao
Reviewed-by: Thomas Munro
Discussion: https://postgr.es/m/CA+hUKGLah2w1pWKHonZP_+EQw69=q56AHYwCgEN8GDzsRG_Hgw@mail.gmail.com

src/backend/postmaster/pgarch.c

index dfc7abbc975c3ac6d62d02a782969096c1cca75f..74a7d7c4d0a99b2d15ff688e90fb4962e259f372 100644 (file)
@@ -102,6 +102,7 @@ static bool pgarch_archiveXlog(char *xlog);
 static bool pgarch_readyXlog(char *xlog);
 static void pgarch_archiveDone(char *xlog);
 static void pgarch_die(int code, Datum arg);
+static void HandlePgArchInterrupts(void);
 
 /* Report shared memory space needed by PgArchShmemInit */
 Size
@@ -257,12 +258,8 @@ pgarch_MainLoop(void)
        /* When we get SIGUSR2, we do one more archive cycle, then exit */
        time_to_stop = ready_to_stop;
 
-       /* Check for config update */
-       if (ConfigReloadPending)
-       {
-           ConfigReloadPending = false;
-           ProcessConfigFile(PGC_SIGHUP);
-       }
+       /* Check for barrier events and config update */
+       HandlePgArchInterrupts();
 
        /*
         * If we've gotten SIGTERM, we normally just sit and do nothing until
@@ -355,15 +352,11 @@ pgarch_ArchiverCopyLoop(void)
                return;
 
            /*
-            * Check for config update.  This is so that we'll adopt a new
-            * setting for archive_command as soon as possible, even if there
-            * is a backlog of files to be archived.
+            * Check for barrier events and config update.  This is so that
+            * we'll adopt a new setting for archive_command as soon as
+            * possible, even if there is a backlog of files to be archived.
             */
-           if (ConfigReloadPending)
-           {
-               ConfigReloadPending = false;
-               ProcessConfigFile(PGC_SIGHUP);
-           }
+           HandlePgArchInterrupts();
 
            /* can't do anything if no command ... */
            if (!XLogArchiveCommandSet())
@@ -703,3 +696,23 @@ pgarch_die(int code, Datum arg)
 {
    PgArch->pgprocno = INVALID_PGPROCNO;
 }
+
+/*
+ * Interrupt handler for WAL archiver process.
+ *
+ * This is called in the loops pgarch_MainLoop and pgarch_ArchiverCopyLoop.
+ * It checks for barrier events and config update, but not shutdown request
+ * because how to handle shutdown request is different between those loops.
+ */
+static void
+HandlePgArchInterrupts(void)
+{
+   if (ProcSignalBarrierPending)
+       ProcessProcSignalBarrier();
+
+   if (ConfigReloadPending)
+   {
+       ConfigReloadPending = false;
+       ProcessConfigFile(PGC_SIGHUP);
+   }
+}