PostgreSQL Source Code  git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
archive.h File Reference
This graph shows which files directly or indirectly include this file:

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",
99  wait_result_to_str(rc));
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:1278
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:284
#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.