PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
archive.c File Reference
#include "postgres_fe.h"
#include <unistd.h>
#include <sys/stat.h>
#include "access/xlog_internal.h"
#include "common/archive.h"
#include "common/logging.h"
#include "fe_utils/archive.h"
Include dependency graph for archive.c:

Go to the source code of this file.

Functions

int RestoreArchivedFile (const char *path, const char *xlogfname, off_t expectedSize, const char *restoreCommand)
 

Function Documentation

◆ RestoreArchivedFile()

int RestoreArchivedFile ( const char *  path,
const char *  xlogfname,
off_t  expectedSize,
const char *  restoreCommand 
)

Definition at line 39 of file archive.c.

41{
42 char xlogpath[MAXPGPATH];
43 char *xlogRestoreCmd;
44 int rc;
45 struct stat stat_buf;
46
47 snprintf(xlogpath, MAXPGPATH, "%s/" XLOGDIR "/%s", path, xlogfname);
48
49 xlogRestoreCmd = BuildRestoreCommand(restoreCommand, xlogpath,
50 xlogfname, NULL);
51
52 /*
53 * Execute restore_command, which should copy the missing file from
54 * archival storage.
55 */
56 fflush(NULL);
57 rc = system(xlogRestoreCmd);
58 pfree(xlogRestoreCmd);
59
60 if (rc == 0)
61 {
62 /*
63 * Command apparently succeeded, but let's make sure the file is
64 * really there now and has the correct size.
65 */
66 if (stat(xlogpath, &stat_buf) == 0)
67 {
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);
72 else
73 {
74 int xlogfd = open(xlogpath, O_RDONLY | PG_BINARY, 0);
75
76 if (xlogfd < 0)
77 pg_fatal("could not open file \"%s\" restored from archive: %m",
78 xlogpath);
79 else
80 return xlogfd;
81 }
82 }
83 else
84 {
85 if (errno != ENOENT)
86 pg_fatal("could not stat file \"%s\": %m",
87 xlogpath);
88 }
89 }
90
91 /*
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
95 * fatal too.
96 */
97 if (wait_result_is_any_signal(rc, true))
98 pg_fatal("\"restore_command\" failed: %s",
100
101 /*
102 * The file is not available, so just let the caller decide what to do
103 * next.
104 */
105 pg_log_error("could not restore file \"%s\" from archive",
106 xlogfname);
107 return -1;
108}
#define PG_BINARY
Definition: c.h:1230
char * BuildRestoreCommand(const char *restoreCommand, const char *xlogpath, const char *xlogfname, const char *lastRestartPointFname)
Definition: archive.c:39
static void const char fflush(stdout)
#define pg_log_error(...)
Definition: logging.h:106
void pfree(void *pointer)
Definition: mcxt.c:1521
#define pg_fatal(...)
#define MAXPGPATH
#define snprintf
Definition: port.h:238
char * wait_result_to_str(int exitstatus)
Definition: wait_error.c:33
bool wait_result_is_any_signal(int exit_status, bool include_command_not_found)
Definition: wait_error.c:121
#define stat
Definition: win32_port.h:274
#define XLOGDIR

References BuildRestoreCommand(), fflush(), MAXPGPATH, pfree(), PG_BINARY, pg_fatal, pg_log_error, snprintf, stat::st_size, stat, wait_result_is_any_signal(), wait_result_to_str(), and XLOGDIR.