From aa2d6b15d6d64564cb5b0d1c1e74fb64b29f41f1 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 16 Aug 2024 15:09:42 -0400 Subject: [PATCH] pg_verifybackup: Move some declarations to new pg_verifybackup.h This is in preparation for adding a second source file to this directory. Amul Sul, reviewed by Sravan Kumar and revised a bit by me. Discussion: http://postgr.es/m/CAAJ_b95mcGjkfAf1qduOR97CokW8-_i-dWLm3v6x1w2-OW9M+A@mail.gmail.com --- src/bin/pg_verifybackup/pg_verifybackup.c | 89 +------------------ src/bin/pg_verifybackup/pg_verifybackup.h | 103 ++++++++++++++++++++++ 2 files changed, 107 insertions(+), 85 deletions(-) create mode 100644 src/bin/pg_verifybackup/pg_verifybackup.h diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c b/src/bin/pg_verifybackup/pg_verifybackup.c index 4f19aea9d35..3fcfb167217 100644 --- a/src/bin/pg_verifybackup/pg_verifybackup.c +++ b/src/bin/pg_verifybackup/pg_verifybackup.c @@ -18,12 +18,11 @@ #include #include -#include "common/controldata_utils.h" -#include "common/hashfn_unstable.h" #include "common/logging.h" #include "common/parse_manifest.h" #include "fe_utils/simple_list.h" #include "getopt_long.h" +#include "pg_verifybackup.h" #include "pgtime.h" /* @@ -45,79 +44,6 @@ */ #define READ_CHUNK_SIZE (128 * 1024) -/* - * Each file described by the manifest file is parsed to produce an object - * like this. - */ -typedef struct manifest_file -{ - uint32 status; /* hash status */ - const char *pathname; - size_t size; - pg_checksum_type checksum_type; - int checksum_length; - uint8 *checksum_payload; - bool matched; - bool bad; -} manifest_file; - -#define should_verify_checksum(m) \ - (((m)->matched) && !((m)->bad) && (((m)->checksum_type) != CHECKSUM_TYPE_NONE)) - -/* - * Define a hash table which we can use to store information about the files - * mentioned in the backup manifest. - */ -#define SH_PREFIX manifest_files -#define SH_ELEMENT_TYPE manifest_file -#define SH_KEY_TYPE const char * -#define SH_KEY pathname -#define SH_HASH_KEY(tb, key) hash_string(key) -#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0) -#define SH_SCOPE static inline -#define SH_RAW_ALLOCATOR pg_malloc0 -#define SH_DECLARE -#define SH_DEFINE -#include "lib/simplehash.h" - -/* - * Each WAL range described by the manifest file is parsed to produce an - * object like this. - */ -typedef struct manifest_wal_range -{ - TimeLineID tli; - XLogRecPtr start_lsn; - XLogRecPtr end_lsn; - struct manifest_wal_range *next; - struct manifest_wal_range *prev; -} manifest_wal_range; - -/* - * All the data parsed from a backup_manifest file. - */ -typedef struct manifest_data -{ - int version; - uint64 system_identifier; - manifest_files_hash *files; - manifest_wal_range *first_wal_range; - manifest_wal_range *last_wal_range; -} manifest_data; - -/* - * All of the context information we need while checking a backup manifest. - */ -typedef struct verifier_context -{ - manifest_data *manifest; - char *backup_directory; - SimpleStringList ignore_list; - bool skip_checksums; - bool exit_on_error; - bool saw_any_error; -} verifier_context; - static manifest_data *parse_manifest_file(char *manifest_path); static void verifybackup_version_cb(JsonManifestParseContext *context, int manifest_version); @@ -151,13 +77,6 @@ static void parse_required_wal(verifier_context *context, char *pg_waldump_path, char *wal_directory); -static void report_backup_error(verifier_context *context, - const char *pg_restrict fmt,...) - pg_attribute_printf(2, 3); -static void report_fatal_error(const char *pg_restrict fmt,...) - pg_attribute_printf(1, 2) pg_attribute_noreturn(); -static bool should_ignore_relpath(verifier_context *context, const char *relpath); - static void progress_report(bool finished); static void usage(void); @@ -980,7 +899,7 @@ parse_required_wal(verifier_context *context, char *pg_waldump_path, * Update the context to indicate that we saw an error, and exit if the * context says we should. */ -static void +void report_backup_error(verifier_context *context, const char *pg_restrict fmt,...) { va_list ap; @@ -997,7 +916,7 @@ report_backup_error(verifier_context *context, const char *pg_restrict fmt,...) /* * Report a fatal error and exit */ -static void +void report_fatal_error(const char *pg_restrict fmt,...) { va_list ap; @@ -1016,7 +935,7 @@ report_fatal_error(const char *pg_restrict fmt,...) * Note that by "prefix" we mean a parent directory; for this purpose, * "aa/bb" is not a prefix of "aa/bbb", but it is a prefix of "aa/bb/cc". */ -static bool +bool should_ignore_relpath(verifier_context *context, const char *relpath) { SimpleStringListCell *cell; diff --git a/src/bin/pg_verifybackup/pg_verifybackup.h b/src/bin/pg_verifybackup/pg_verifybackup.h new file mode 100644 index 00000000000..c3952177881 --- /dev/null +++ b/src/bin/pg_verifybackup/pg_verifybackup.h @@ -0,0 +1,103 @@ +/*------------------------------------------------------------------------- + * + * pg_verifybackup.h + * Verify a backup against a backup manifest. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/bin/pg_verifybackup/pg_verifybackup.h + * + *------------------------------------------------------------------------- + */ + +#ifndef PG_VERIFYBACKUP_H +#define PG_VERIFYBACKUP_H + +#include "common/controldata_utils.h" +#include "common/hashfn_unstable.h" +#include "common/parse_manifest.h" +#include "fe_utils/simple_list.h" + +/* + * Each file described by the manifest file is parsed to produce an object + * like this. + */ +typedef struct manifest_file +{ + uint32 status; /* hash status */ + const char *pathname; + size_t size; + pg_checksum_type checksum_type; + int checksum_length; + uint8 *checksum_payload; + bool matched; + bool bad; +} manifest_file; + +#define should_verify_checksum(m) \ + (((m)->matched) && !((m)->bad) && (((m)->checksum_type) != CHECKSUM_TYPE_NONE)) + +/* + * Define a hash table which we can use to store information about the files + * mentioned in the backup manifest. + */ +#define SH_PREFIX manifest_files +#define SH_ELEMENT_TYPE manifest_file +#define SH_KEY_TYPE const char * +#define SH_KEY pathname +#define SH_HASH_KEY(tb, key) hash_string(key) +#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0) +#define SH_SCOPE static inline +#define SH_RAW_ALLOCATOR pg_malloc0 +#define SH_DECLARE +#define SH_DEFINE +#include "lib/simplehash.h" + +/* + * Each WAL range described by the manifest file is parsed to produce an + * object like this. + */ +typedef struct manifest_wal_range +{ + TimeLineID tli; + XLogRecPtr start_lsn; + XLogRecPtr end_lsn; + struct manifest_wal_range *next; + struct manifest_wal_range *prev; +} manifest_wal_range; + +/* + * All the data parsed from a backup_manifest file. + */ +typedef struct manifest_data +{ + int version; + uint64 system_identifier; + manifest_files_hash *files; + manifest_wal_range *first_wal_range; + manifest_wal_range *last_wal_range; +} manifest_data; + +/* + * All of the context information we need while checking a backup manifest. + */ +typedef struct verifier_context +{ + manifest_data *manifest; + char *backup_directory; + SimpleStringList ignore_list; + bool skip_checksums; + bool exit_on_error; + bool saw_any_error; +} verifier_context; + +extern void report_backup_error(verifier_context *context, + const char *pg_restrict fmt,...) + pg_attribute_printf(2, 3); +extern void report_fatal_error(const char *pg_restrict fmt,...) + pg_attribute_printf(1, 2) pg_attribute_noreturn(); +extern bool should_ignore_relpath(verifier_context *context, + const char *relpath); + +#endif /* PG_VERIFYBACKUP_H */