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

Go to the source code of this file.

Data Structures

struct  manifest_file
 
struct  manifest_wal_range
 
struct  manifest_data
 

Macros

#define SH_PREFIX   manifest_files
 
#define SH_ELEMENT_TYPE   manifest_file
 
#define SH_KEY_TYPE   const char *
 
#define SH_SCOPE   extern
 
#define SH_RAW_ALLOCATOR   pg_malloc0
 
#define SH_DECLARE
 

Typedefs

typedef struct manifest_file manifest_file
 
typedef struct manifest_wal_range manifest_wal_range
 
typedef struct manifest_data manifest_data
 

Functions

manifest_dataload_backup_manifest (char *backup_directory)
 
manifest_data ** load_backup_manifests (int n_backups, char **backup_directories)
 

Macro Definition Documentation

◆ SH_DECLARE

#define SH_DECLARE

Definition at line 37 of file load_manifest.h.

◆ SH_ELEMENT_TYPE

#define SH_ELEMENT_TYPE   manifest_file

Definition at line 33 of file load_manifest.h.

◆ SH_KEY_TYPE

#define SH_KEY_TYPE   const char *

Definition at line 34 of file load_manifest.h.

◆ SH_PREFIX

#define SH_PREFIX   manifest_files

Definition at line 32 of file load_manifest.h.

◆ SH_RAW_ALLOCATOR

#define SH_RAW_ALLOCATOR   pg_malloc0

Definition at line 36 of file load_manifest.h.

◆ SH_SCOPE

#define SH_SCOPE   extern

Definition at line 35 of file load_manifest.h.

Typedef Documentation

◆ manifest_data

typedef struct manifest_data manifest_data

◆ manifest_file

typedef struct manifest_file manifest_file

◆ manifest_wal_range

Function Documentation

◆ load_backup_manifest()

manifest_data * load_backup_manifest ( char *  backup_directory)

Definition at line 105 of file load_manifest.c.

106{
107 char pathname[MAXPGPATH];
108 int fd;
109 struct stat statbuf;
110 off_t estimate;
111 uint32 initial_size;
112 manifest_files_hash *ht;
113 char *buffer;
114 int rc;
116 manifest_data *result;
117 int chunk_size = READ_CHUNK_SIZE;
118
119 /* Open the manifest file. */
120 snprintf(pathname, MAXPGPATH, "%s/backup_manifest", backup_directory);
121 if ((fd = open(pathname, O_RDONLY | PG_BINARY, 0)) < 0)
122 {
123 if (errno == ENOENT)
124 {
125 pg_log_warning("file \"%s\" does not exist", pathname);
126 return NULL;
127 }
128 pg_fatal("could not open file \"%s\": %m", pathname);
129 }
130
131 /* Figure out how big the manifest is. */
132 if (fstat(fd, &statbuf) != 0)
133 pg_fatal("could not stat file \"%s\": %m", pathname);
134
135 /* Guess how large to make the hash table based on the manifest size. */
136 estimate = statbuf.st_size / ESTIMATED_BYTES_PER_MANIFEST_LINE;
137 initial_size = Min(PG_UINT32_MAX, Max(estimate, 256));
138
139 /* Create the hash table. */
140 ht = manifest_files_create(initial_size, NULL);
141
142 result = pg_malloc0(sizeof(manifest_data));
143 result->files = ht;
144 context.private_data = result;
150
151 /*
152 * Parse the file, in chunks if necessary.
153 */
154 if (statbuf.st_size <= chunk_size)
155 {
156 buffer = pg_malloc(statbuf.st_size);
157 rc = read(fd, buffer, statbuf.st_size);
158 if (rc != statbuf.st_size)
159 {
160 if (rc < 0)
161 pg_fatal("could not read file \"%s\": %m", pathname);
162 else
163 pg_fatal("could not read file \"%s\": read %d of %lld",
164 pathname, rc, (long long int) statbuf.st_size);
165 }
166
167 /* Close the manifest file. */
168 close(fd);
169
170 /* Parse the manifest. */
171 json_parse_manifest(&context, buffer, statbuf.st_size);
172 }
173 else
174 {
175 int bytes_left = statbuf.st_size;
177
178 inc_state = json_parse_manifest_incremental_init(&context);
179
180 buffer = pg_malloc(chunk_size + 1);
181
182 while (bytes_left > 0)
183 {
184 int bytes_to_read = chunk_size;
185
186 /*
187 * Make sure that the last chunk is sufficiently large. (i.e. at
188 * least half the chunk size) so that it will contain fully the
189 * piece at the end with the checksum.
190 */
191 if (bytes_left < chunk_size)
192 bytes_to_read = bytes_left;
193 else if (bytes_left < 2 * chunk_size)
194 bytes_to_read = bytes_left / 2;
195 rc = read(fd, buffer, bytes_to_read);
196 if (rc != bytes_to_read)
197 {
198 if (rc < 0)
199 pg_fatal("could not read file \"%s\": %m", pathname);
200 else
201 pg_fatal("could not read file \"%s\": read %lld of %lld",
202 pathname,
203 (long long int) (statbuf.st_size + rc - bytes_left),
204 (long long int) statbuf.st_size);
205 }
206 bytes_left -= rc;
207 json_parse_manifest_incremental_chunk(inc_state, buffer, rc, bytes_left == 0);
208 }
209
210 /* Release the incremental state memory */
212
213 close(fd);
214 }
215
216 /* All done. */
217 pfree(buffer);
218 return result;
219}
#define Min(x, y)
Definition: c.h:975
#define PG_UINT32_MAX
Definition: c.h:561
#define Max(x, y)
Definition: c.h:969
#define PG_BINARY
Definition: c.h:1244
uint32_t uint32
Definition: c.h:502
void * pg_malloc(size_t size)
Definition: fe_memutils.c:47
void * pg_malloc0(size_t size)
Definition: fe_memutils.c:53
#define close(a)
Definition: win32.h:12
#define read(a, b, c)
Definition: win32.h:13
#define ESTIMATED_BYTES_PER_MANIFEST_LINE
Definition: load_manifest.c:35
#define READ_CHUNK_SIZE
Definition: load_manifest.c:41
static void combinebackup_per_file_cb(JsonManifestParseContext *context, const char *pathname, uint64 size, pg_checksum_type checksum_type, int checksum_length, uint8 *checksum_payload)
static pg_noreturn void report_manifest_error(JsonManifestParseContext *context, const char *fmt,...) pg_attribute_printf(2
static void combinebackup_version_cb(JsonManifestParseContext *context, int manifest_version)
static void combinebackup_per_wal_range_cb(JsonManifestParseContext *context, TimeLineID tli, XLogRecPtr start_lsn, XLogRecPtr end_lsn)
static void combinebackup_system_identifier_cb(JsonManifestParseContext *context, uint64 manifest_system_identifier)
void pfree(void *pointer)
Definition: mcxt.c:2150
void json_parse_manifest(JsonManifestParseContext *context, const char *buffer, size_t size)
JsonManifestParseIncrementalState * json_parse_manifest_incremental_init(JsonManifestParseContext *context)
void json_parse_manifest_incremental_shutdown(JsonManifestParseIncrementalState *incstate)
void json_parse_manifest_incremental_chunk(JsonManifestParseIncrementalState *incstate, const char *chunk, size_t size, bool is_last)
#define pg_fatal(...)
#define MAXPGPATH
#define pg_log_warning(...)
Definition: pgfnames.c:24
#define snprintf
Definition: port.h:239
static int fd(const char *x, int i)
Definition: preproc-init.c:105
json_manifest_per_wal_range_callback per_wal_range_cb
json_manifest_system_identifier_callback system_identifier_cb
json_manifest_error_callback error_cb
json_manifest_per_file_callback per_file_cb
json_manifest_version_callback version_cb
manifest_files_hash * files
Definition: load_manifest.h:59
#define fstat
Definition: win32_port.h:273

References close, combinebackup_per_file_cb(), combinebackup_per_wal_range_cb(), combinebackup_system_identifier_cb(), combinebackup_version_cb(), JsonManifestParseContext::error_cb, ESTIMATED_BYTES_PER_MANIFEST_LINE, fd(), manifest_data::files, fstat, json_parse_manifest(), json_parse_manifest_incremental_chunk(), json_parse_manifest_incremental_init(), json_parse_manifest_incremental_shutdown(), Max, MAXPGPATH, Min, JsonManifestParseContext::per_file_cb, JsonManifestParseContext::per_wal_range_cb, pfree(), PG_BINARY, pg_fatal, pg_log_warning, pg_malloc(), pg_malloc0(), PG_UINT32_MAX, JsonManifestParseContext::private_data, read, READ_CHUNK_SIZE, report_manifest_error(), snprintf, stat::st_size, JsonManifestParseContext::system_identifier_cb, and JsonManifestParseContext::version_cb.

Referenced by load_backup_manifests().

◆ load_backup_manifests()

manifest_data ** load_backup_manifests ( int  n_backups,
char **  backup_directories 
)

Definition at line 83 of file load_manifest.c.

84{
85 manifest_data **result;
86 int i;
87
88 result = pg_malloc(sizeof(manifest_data *) * n_backups);
89 for (i = 0; i < n_backups; ++i)
90 result[i] = load_backup_manifest(backup_directories[i]);
91
92 return result;
93}
int i
Definition: isn.c:77
manifest_data * load_backup_manifest(char *backup_directory)

References i, load_backup_manifest(), and pg_malloc().

Referenced by main().