1/*-------------------------------------------------------------------------
4 * Routines to access WAL archives from frontend
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * src/fe_utils/archive.c
13 *-------------------------------------------------------------------------
30 * Attempt to retrieve the specified file from off-line archival storage.
31 * If successful, return a file descriptor of the restored file, else
34 * For fixed-size files, the caller may pass the expected size as an
35 * additional crosscheck on successful recovery. If the file size is not
36 * known, set expectedSize = 0.
40 off_t expectedSize,
const char *restoreCommand)
53 * Execute restore_command, which should copy the missing file from
57 rc = system(xlogRestoreCmd);
58 pfree(xlogRestoreCmd);
63 * Command apparently succeeded, but let's make sure the file is
64 * really there now and has the correct size.
66 if (
stat(xlogpath, &stat_buf) == 0)
68 if (expectedSize > 0 && stat_buf.
st_size != expectedSize)
69 pg_fatal(
"unexpected file size for \"%s\": %lld instead of %lld",
70 xlogfname, (
long long int) stat_buf.
st_size,
71 (
long long int) expectedSize);
74 int xlogfd = open(xlogpath, O_RDONLY |
PG_BINARY, 0);
77 pg_fatal(
"could not open file \"%s\" restored from archive: %m",
86 pg_fatal(
"could not stat file \"%s\": %m",
92 * If the failure was due to a signal, then it would be misleading to
93 * return with a failure at restoring the file. So just bail out and
94 * exit. Hard shell errors such as "command not found" are treated as
98 pg_fatal(
"\"restore_command\" failed: %s",
102 * The file is not available, so just let the caller decide what to do
105 pg_log_error(
"could not restore file \"%s\" from archive",
char * BuildRestoreCommand(const char *restoreCommand, const char *xlogpath, const char *xlogfname, const char *lastRestartPointFname)
int RestoreArchivedFile(const char *path, const char *xlogfname, off_t expectedSize, const char *restoreCommand)
#define pg_log_error(...)
void pfree(void *pointer)
char * wait_result_to_str(int exitstatus)
bool wait_result_is_any_signal(int exit_status, bool include_command_not_found)