FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
IvorySQL/src/fe_utils/archive.c at master · IvorySQL/IvorySQL · GitHub
IvorySQL
IvorySQL
Repository navigation
Code
Issues
436
(436)
Pull requests
277
(277)
Discussions
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
IvorySQL
/
src
/
fe_utils
/
archive.c
Copy path
More file actions
More file actions
Latest commit
History
History
History
108 lines (96 loc) · 2.74 KB
Breadcrumbs
IvorySQL
/
src
/
fe_utils
/
archive.c
Copy path
File metadata and controls
108 lines (96 loc) · 2.74 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*-------------------------------------------------------------------------
*
* archive.c
* Routines to access WAL archives from frontend
*
* Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
* src/fe_utils/archive.c
*
*-------------------------------------------------------------------------
*/
#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"
/*
* RestoreArchivedFile
*
* Attempt to retrieve the specified file from off-line archival storage.
* If successful, return a file descriptor of the restored file, else
* return -1.
*
* For fixed-size files, the caller may pass the expected size as an
* additional crosscheck on successful recovery. If the file size is not
* known, set expectedSize = 0.
*/
int
RestoreArchivedFile
(
const
char
*
path
,
const
char
*
xlogfname
,
off_t
expectedSize
,
const
char
*
restoreCommand
)
{
char
xlogpath
[
MAXPGPATH
];
char
*
xlogRestoreCmd
;
int
rc
;
struct
stat
stat_buf
;
snprintf
(
xlogpath
,
MAXPGPATH
,
"%s/"
XLOGDIR
"/%s"
,
path
,
xlogfname
);
xlogRestoreCmd
=
BuildRestoreCommand
(
restoreCommand
,
xlogpath
,
xlogfname
,
NULL
);
/*
* Execute restore_command, which should copy the missing file from
* archival storage.
*/
fflush
(
NULL
);
rc
=
system
(
xlogRestoreCmd
);
pfree
(
xlogRestoreCmd
);
if
(
rc
==
0
)
{
/*
* Command apparently succeeded, but let's make sure the file is
* really there now and has the correct size.
*/
if
(
stat
(
xlogpath
,
&
stat_buf
)
==
0
)
{
if
(
expectedSize
>
0
&&
stat_buf
.
st_size
!=
expectedSize
)
pg_fatal
(
"unexpected file size for \"%s\": %lld instead of %lld"
,
xlogfname
, (
long long
int
)
stat_buf
.
st_size
,
(
long long
int
)
expectedSize
);
else
{
int
xlogfd
=
open
(
xlogpath
,
O_RDONLY
|
PG_BINARY
,
0
);
if
(
xlogfd
<
0
)
pg_fatal
(
"could not open file \"%s\" restored from archive: %m"
,
xlogpath
);
else
return
xlogfd
;
}
}
else
{
if
(
errno
!=
ENOENT
)
pg_fatal
(
"could not stat file \"%s\": %m"
,
xlogpath
);
}
}
/*
* If the failure was due to a signal, then it would be misleading to
* return with a failure at restoring the file. So just bail out and
* exit. Hard shell errors such as "command not found" are treated as
* fatal too.
*/
if
(
wait_result_is_any_signal
(
rc
, true))
pg_fatal
(
"\"restore_command\" failed: %s"
,
wait_result_to_str
(
rc
));
/*
* The file is not available, so just let the caller decide what to do
* next.
*/
pg_log_error
(
"could not restore file \"%s\" from archive"
,
xlogfname
);
return
-1
;
}
Back
|
FazBrowse Home
|
New Git URL