diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index ee0b01820b..324bf7aad1 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -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; } diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 33348083eb..6dacee2fbb 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -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') /*