Skip to content

Commit

Permalink
Make postmaster restart archiver soon after it dies, even during reco…
Browse files Browse the repository at this point in the history
…very.

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.

(cherry picked from commit 71a4062)
  • Loading branch information
MasaoFujii authored and InnerLife0 committed Jun 3, 2024
1 parent 46751c1 commit c3d719c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 20 deletions.
36 changes: 16 additions & 20 deletions src/backend/postmaster/postmaster.c
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,17 @@ static void setProcAffinity(int id);

bool isAuxiliaryBgWorker(BackgroundWorker *worker);

/*
* 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
Expand Down Expand Up @@ -2049,21 +2060,9 @@ ServerLoop(void)
(pmState == PM_RUN || pmState == PM_HOT_STANDBY))
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)
Expand Down Expand Up @@ -3367,7 +3366,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();
Expand Down Expand Up @@ -3524,7 +3523,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;
}
Expand Down Expand Up @@ -5609,11 +5608,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;
}
Expand Down
4 changes: 4 additions & 0 deletions src/include/access/xlog.h
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,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')
/* Is WAL archiving status streaming enabled? */
#define XLogArchivingStatusReportingActive() \
Expand Down

0 comments on commit c3d719c

Please sign in to comment.