From cf2e5f89557cb6716760f49be5e78cda9b066914 Mon Sep 17 00:00:00 2001 From: Amul Sul Date: Tue, 2 Jul 2024 10:32:11 +0530 Subject: [PATCH v3 05/11] Refactor: move some part of pg_verifybackup.c to pg_verifybackup.h --- src/bin/pg_verifybackup/pg_verifybackup.c | 97 +----------------- src/bin/pg_verifybackup/pg_verifybackup.h | 114 ++++++++++++++++++++++ 2 files changed, 119 insertions(+), 92 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 74b3a66835a..134d575d738 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" /* @@ -40,85 +39,6 @@ */ #define ESTIMATED_BYTES_PER_MANIFEST_LINE 100 -/* - * How many bytes should we try to read from a file at once? - */ -#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 show_progress; - 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); @@ -152,13 +72,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(verifier_context *context, bool finished); static void usage(void); @@ -554,7 +467,7 @@ verifybackup_per_file_cb(JsonManifestParseContext *context, bool found; /* Make a new entry in the hash table for this file. */ - m = manifest_files_insert(ht, pathname, &found); + m = manifest_files_insert(ht, (char *) pathname, &found); if (found) report_fatal_error("duplicate path name in backup manifest: \"%s\"", pathname); @@ -978,7 +891,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; @@ -995,7 +908,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; @@ -1014,7 +927,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..f4a93d3f137 --- /dev/null +++ b/src/bin/pg_verifybackup/pg_verifybackup.h @@ -0,0 +1,114 @@ +/*------------------------------------------------------------------------- + * + * 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" + +extern bool show_progress; +extern bool skip_checksums; + +/* + * How many bytes should we try to read from a file at once? + */ +#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 */ + 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 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 show_progress; + bool skip_checksums; + bool exit_on_error; + bool saw_any_error; +} verifier_context; + +extern manifest_file *verify_manifest_entry(verifier_context *context, + char *relpath, size_t filesize); + +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 */ -- 2.18.0