mirror of
https://github.com/postgres/postgres.git
synced 2025-05-09 18:21:05 +03:00
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
This commit is contained in:
parent
af99d44a88
commit
aa2d6b15d6
@ -18,12 +18,11 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "common/controldata_utils.h"
|
|
||||||
#include "common/hashfn_unstable.h"
|
|
||||||
#include "common/logging.h"
|
#include "common/logging.h"
|
||||||
#include "common/parse_manifest.h"
|
#include "common/parse_manifest.h"
|
||||||
#include "fe_utils/simple_list.h"
|
#include "fe_utils/simple_list.h"
|
||||||
#include "getopt_long.h"
|
#include "getopt_long.h"
|
||||||
|
#include "pg_verifybackup.h"
|
||||||
#include "pgtime.h"
|
#include "pgtime.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -45,79 +44,6 @@
|
|||||||
*/
|
*/
|
||||||
#define READ_CHUNK_SIZE (128 * 1024)
|
#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 manifest_data *parse_manifest_file(char *manifest_path);
|
||||||
static void verifybackup_version_cb(JsonManifestParseContext *context,
|
static void verifybackup_version_cb(JsonManifestParseContext *context,
|
||||||
int manifest_version);
|
int manifest_version);
|
||||||
@ -151,13 +77,6 @@ static void parse_required_wal(verifier_context *context,
|
|||||||
char *pg_waldump_path,
|
char *pg_waldump_path,
|
||||||
char *wal_directory);
|
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 progress_report(bool finished);
|
||||||
static void usage(void);
|
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
|
* Update the context to indicate that we saw an error, and exit if the
|
||||||
* context says we should.
|
* context says we should.
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
report_backup_error(verifier_context *context, const char *pg_restrict fmt,...)
|
report_backup_error(verifier_context *context, const char *pg_restrict fmt,...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@ -997,7 +916,7 @@ report_backup_error(verifier_context *context, const char *pg_restrict fmt,...)
|
|||||||
/*
|
/*
|
||||||
* Report a fatal error and exit
|
* Report a fatal error and exit
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
report_fatal_error(const char *pg_restrict fmt,...)
|
report_fatal_error(const char *pg_restrict fmt,...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
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,
|
* 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".
|
* "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)
|
should_ignore_relpath(verifier_context *context, const char *relpath)
|
||||||
{
|
{
|
||||||
SimpleStringListCell *cell;
|
SimpleStringListCell *cell;
|
||||||
|
103
src/bin/pg_verifybackup/pg_verifybackup.h
Normal file
103
src/bin/pg_verifybackup/pg_verifybackup.h
Normal file
@ -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 */
|
Loading…
x
Reference in New Issue
Block a user