mirror of
https://github.com/postgres/postgres.git
synced 2025-10-15 05:46:52 +03:00
Refactor code in charge of running shell-based recovery commands
The code specific to the execution of archive_cleanup_command, recovery_end_command and restore_command is moved to a new file named shell_restore.c. The code is split into three functions: - shell_restore(), that attempts the execution of a shell-based restore_command. - shell_archive_cleanup(), for archive_cleanup_command. - shell_recovery_end(), for recovery_end_command. This introduces no functional changes, with failure patterns and logs generated in consequence being the same as before (one case actually generates one less DEBUG2 message "could not restore" when a restore command succeeds but the follow-up stat() to check the size fails, but that only matters with a elevel high enough). This is preparatory work for allowing recovery modules, a facility similar to archive modules, with callbacks shaped similarly to the functions introduced here. Author: Nathan Bossart Reviewed-by: Andres Freund, Michael Paquier Discussion: https://postgr.es/m/20221227192449.GA3672473@nathanxps13
This commit is contained in:
@@ -692,6 +692,7 @@ static char *GetXLogBuffer(XLogRecPtr ptr, TimeLineID tli);
|
||||
static XLogRecPtr XLogBytePosToRecPtr(uint64 bytepos);
|
||||
static XLogRecPtr XLogBytePosToEndRecPtr(uint64 bytepos);
|
||||
static uint64 XLogRecPtrToBytePos(XLogRecPtr ptr);
|
||||
static void GetOldestRestartPointFileName(char *fname);
|
||||
|
||||
static void WALInsertLockAcquire(void);
|
||||
static void WALInsertLockAcquireExclusive(void);
|
||||
@@ -4887,10 +4888,12 @@ CleanupAfterArchiveRecovery(TimeLineID EndOfLogTLI, XLogRecPtr EndOfLog,
|
||||
* Execute the recovery_end_command, if any.
|
||||
*/
|
||||
if (recoveryEndCommand && strcmp(recoveryEndCommand, "") != 0)
|
||||
ExecuteRecoveryCommand(recoveryEndCommand,
|
||||
"recovery_end_command",
|
||||
true,
|
||||
WAIT_EVENT_RECOVERY_END_COMMAND);
|
||||
{
|
||||
char lastRestartPointFname[MAXFNAMELEN];
|
||||
|
||||
GetOldestRestartPointFileName(lastRestartPointFname);
|
||||
shell_recovery_end(lastRestartPointFname);
|
||||
}
|
||||
|
||||
/*
|
||||
* We switched to a new timeline. Clean up segments on the old timeline.
|
||||
@@ -7307,10 +7310,12 @@ CreateRestartPoint(int flags)
|
||||
* Finally, execute archive_cleanup_command, if any.
|
||||
*/
|
||||
if (archiveCleanupCommand && strcmp(archiveCleanupCommand, "") != 0)
|
||||
ExecuteRecoveryCommand(archiveCleanupCommand,
|
||||
"archive_cleanup_command",
|
||||
false,
|
||||
WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND);
|
||||
{
|
||||
char lastRestartPointFname[MAXFNAMELEN];
|
||||
|
||||
GetOldestRestartPointFileName(lastRestartPointFname);
|
||||
shell_archive_cleanup(lastRestartPointFname);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -8884,6 +8889,22 @@ GetOldestRestartPoint(XLogRecPtr *oldrecptr, TimeLineID *oldtli)
|
||||
LWLockRelease(ControlFileLock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the WAL file name for the last checkpoint or restartpoint. This is
|
||||
* the oldest WAL file that we still need if we have to restart recovery.
|
||||
*/
|
||||
static void
|
||||
GetOldestRestartPointFileName(char *fname)
|
||||
{
|
||||
XLogRecPtr restartRedoPtr;
|
||||
TimeLineID restartTli;
|
||||
XLogSegNo restartSegNo;
|
||||
|
||||
GetOldestRestartPoint(&restartRedoPtr, &restartTli);
|
||||
XLByteToSeg(restartRedoPtr, restartSegNo, wal_segment_size);
|
||||
XLogFileName(fname, restartTli, restartSegNo, wal_segment_size);
|
||||
}
|
||||
|
||||
/* Thin wrapper around ShutdownWalRcv(). */
|
||||
void
|
||||
XLogShutdownWalRcv(void)
|
||||
|
Reference in New Issue
Block a user