]> granicus.if.org Git - postgresql/commitdiff
Make postmaster restart archiver soon after it dies, even during recovery.
authorFujii Masao <fujii@postgresql.org>
Fri, 12 Jun 2015 14:11:51 +0000 (23:11 +0900)
committerFujii Masao <fujii@postgresql.org>
Fri, 12 Jun 2015 14:11:51 +0000 (23:11 +0900)
After the archiver dies, postmaster tries to start a new one immediately.
But previously this could happen only while server was running normally
even though archiving was enabled always (i.e., archive_mode was set to
always). So the archiver running during recovery could not restart soon
after it died. This is an oversight in commit ffd3774.

This commit changes reaper(), postmaster's signal handler to cleanup
after a child process dies, so that it tries to a new archiver even during
recovery if necessary.

Patch by me. Review by Alvaro Herrera.

src/backend/postmaster/postmaster.c
src/include/access/xlog.h

index ee0b01820b1c0d73fa51597dca9b664f40c6a8e4..324bf7aad148f144c8c295fab2ad2b816f37ff7d 100644 (file)
@@ -406,6 +406,17 @@ static pid_t StartChildProcess(AuxProcType type);
 static void StartAutovacuumWorker(void);
 static void InitPostmasterDeathWatchHandle(void);
 
+/*
+ * Archiver is allowed to start up at the current postmaster state?
+ *
+ * If WAL archiving is enabled always, we are allowed to start archiver
+ * even during recovery.
+ */
+#define PgArchStartupAllowed() \
+       ((XLogArchivingActive() && pmState == PM_RUN) ||        \
+        (XLogArchivingAlways() &&      \
+         (pmState == PM_RECOVERY || pmState == PM_HOT_STANDBY)))
+
 #ifdef EXEC_BACKEND
 
 #ifdef WIN32
@@ -1649,21 +1660,9 @@ ServerLoop(void)
                if (PgStatPID == 0 && pmState == PM_RUN)
                        PgStatPID = pgstat_start();
 
-               /*
-                * If we have lost the archiver, try to start a new one.
-                *
-                * If WAL archiving is enabled always, we try to start a new archiver
-                * even during recovery.
-                */
-               if (PgArchPID == 0 && wal_level >= WAL_LEVEL_ARCHIVE)
-               {
-                       if ((pmState == PM_RUN && XLogArchiveMode > ARCHIVE_MODE_OFF) ||
-                               ((pmState == PM_RECOVERY || pmState == PM_HOT_STANDBY) &&
-                                XLogArchiveMode == ARCHIVE_MODE_ALWAYS))
-                       {
+               /* If we have lost the archiver, try to start a new one. */
+               if (PgArchPID == 0 && PgArchStartupAllowed())
                                PgArchPID = pgarch_start();
-                       }
-               }
 
                /* If we need to signal the autovacuum launcher, do so now */
                if (avlauncher_needs_signal)
@@ -2669,7 +2668,7 @@ reaper(SIGNAL_ARGS)
                         */
                        if (!IsBinaryUpgrade && AutoVacuumingActive() && AutoVacPID == 0)
                                AutoVacPID = StartAutoVacLauncher();
-                       if (XLogArchivingActive() && PgArchPID == 0)
+                       if (PgArchStartupAllowed() && PgArchPID == 0)
                                PgArchPID = pgarch_start();
                        if (PgStatPID == 0)
                                PgStatPID = pgstat_start();
@@ -2810,7 +2809,7 @@ reaper(SIGNAL_ARGS)
                        if (!EXIT_STATUS_0(exitstatus))
                                LogChildExit(LOG, _("archiver process"),
                                                         pid, exitstatus);
-                       if (XLogArchivingActive() && pmState == PM_RUN)
+                       if (PgArchStartupAllowed())
                                PgArchPID = pgarch_start();
                        continue;
                }
@@ -4833,11 +4832,8 @@ sigusr1_handler(SIGNAL_ARGS)
                 * files.
                 */
                Assert(PgArchPID == 0);
-               if (wal_level >= WAL_LEVEL_ARCHIVE &&
-                       XLogArchiveMode == ARCHIVE_MODE_ALWAYS)
-               {
+               if (XLogArchivingAlways())
                        PgArchPID = pgarch_start();
-               }
 
                pmState = PM_RECOVERY;
        }
index 33348083ebce60936c7dec8c2075f6f0542ea78c..6dacee2fbbdea0a76318eb47ff6662fd7747f539 100644 (file)
@@ -126,8 +126,12 @@ typedef enum WalLevel
 } WalLevel;
 extern int     wal_level;
 
+/* Is WAL archiving enabled (always or only while server is running normally)? */
 #define XLogArchivingActive() \
        (XLogArchiveMode > ARCHIVE_MODE_OFF && wal_level >= WAL_LEVEL_ARCHIVE)
+/* Is WAL archiving enabled always (even during recovery)? */
+#define XLogArchivingAlways() \
+       (XLogArchiveMode == ARCHIVE_MODE_ALWAYS && wal_level >= WAL_LEVEL_ARCHIVE)
 #define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0')
 
 /*