Skip to content

Commit 6179808

Browse files
committed
implement partial validate. add db-include and db-exclude options to validate command
1 parent f36d81d commit 6179808

File tree

6 files changed

+34
-12
lines changed

6 files changed

+34
-12
lines changed

src/backup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ do_backup(time_t start_time, bool no_validate)
778778
write_backup(&current);
779779

780780
if (!no_validate)
781-
pgBackupValidate(&current);
781+
pgBackupValidate(&current, NULL);
782782

783783
/* Notify user about backup size */
784784
pretty_size(current.data_bytes, pretty_data_bytes, lengthof(pretty_data_bytes));

src/help.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ help_restore(void)
359359
printf(_(" [-T OLDDIR=NEWDIR] [--progress]\n"));
360360
printf(_(" [--external-mapping=OLDDIR=NEWDIR]\n"));
361361
printf(_(" [--skip-external-dirs]\n"));
362+
printf(_(" [--db-include dbname | --db-exclude dbname]\n"));
362363
printf(_(" [--remote-proto] [--remote-host]\n"));
363364
printf(_(" [--remote-port] [--remote-path] [--remote-user]\n"));
364365
printf(_(" [--ssh-options]\n\n"));
@@ -396,6 +397,8 @@ help_restore(void)
396397
printf(_(" --external-mapping=OLDDIR=NEWDIR\n"));
397398
printf(_(" relocate the external directory from OLDDIR to NEWDIR\n"));
398399
printf(_(" --skip-external-dirs do not restore all external directories\n"));
400+
printf(_(" --db-include dbname restore only specified databases\n"));
401+
printf(_(" --db-exclude dbname do not restore specified databases\n"));
399402

400403
printf(_("\n Logging options:\n"));
401404
printf(_(" --log-level-console=log-level-console\n"));
@@ -440,6 +443,7 @@ help_validate(void)
440443
printf(_(" [--recovery-target-timeline=timeline]\n"));
441444
printf(_(" [--recovery-target-name=target-name]\n"));
442445
printf(_(" [--skip-block-validation]\n\n"));
446+
printf(_(" [--db-include dbname | --db-exclude dbname]\n"));
443447

444448
printf(_(" -B, --backup-path=backup-path location of the backup storage area\n"));
445449
printf(_(" --instance=instance_name name of the instance\n"));
@@ -458,6 +462,9 @@ help_validate(void)
458462
printf(_(" the named restore point to which recovery will proceed\n"));
459463
printf(_(" --skip-block-validation set to validate only file-level checksum\n"));
460464

465+
printf(_(" --db-include dbname restore only specified databases\n"));
466+
printf(_(" --db-exclude dbname do not restore specified databases\n"));
467+
461468
printf(_("\n Logging options:\n"));
462469
printf(_(" --log-level-console=log-level-console\n"));
463470
printf(_(" level for console logging (default: info)\n"));

src/merge.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ do_merge(time_t backup_id)
146146
merge_backups(full_backup, from_backup);
147147
}
148148

149-
pgBackupValidate(full_backup);
149+
pgBackupValidate(full_backup, NULL);
150150
if (full_backup->status == BACKUP_STATUS_CORRUPT)
151151
elog(ERROR, "Merging of backup %s failed", base36enc(backup_id));
152152

@@ -198,7 +198,7 @@ merge_backups(pgBackup *to_backup, pgBackup *from_backup)
198198
if (to_backup->status == BACKUP_STATUS_OK ||
199199
to_backup->status == BACKUP_STATUS_DONE)
200200
{
201-
pgBackupValidate(to_backup);
201+
pgBackupValidate(to_backup, NULL);
202202
if (to_backup->status == BACKUP_STATUS_CORRUPT)
203203
elog(ERROR, "Interrupt merging");
204204
}
@@ -211,7 +211,7 @@ merge_backups(pgBackup *to_backup, pgBackup *from_backup)
211211
from_backup->status == BACKUP_STATUS_DONE ||
212212
from_backup->status == BACKUP_STATUS_MERGING ||
213213
from_backup->status == BACKUP_STATUS_DELETING);
214-
pgBackupValidate(from_backup);
214+
pgBackupValidate(from_backup, NULL);
215215
if (from_backup->status == BACKUP_STATUS_CORRUPT)
216216
elog(ERROR, "Interrupt merging");
217217

src/pg_probackup.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,8 @@ extern pgRecoveryTarget *parseRecoveryTargetOptions(
512512
const char *target_inclusive, TimeLineID target_tli, const char* target_lsn,
513513
const char *target_stop, const char *target_name,
514514
const char *target_action);
515+
extern parray *get_dbOid_exclude_list(pgBackup *backup, parray *files,
516+
parray *datname_list, bool partial_restore_type);
515517

516518
/* in merge.c */
517519
extern void do_merge(time_t backup_id);
@@ -556,7 +558,7 @@ extern void help_pg_probackup(void);
556558
extern void help_command(char *command);
557559

558560
/* in validate.c */
559-
extern void pgBackupValidate(pgBackup* backup);
561+
extern void pgBackupValidate(pgBackup* backup, pgRestoreParams *params);
560562
extern int do_validate_all(void);
561563

562564
/* in catalog.c */

src/restore.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,6 @@ static void create_recovery_conf(time_t backup_id,
4444
pgRestoreParams *params);
4545
static parray *read_timeline_history(TimeLineID targetTLI);
4646
static void *restore_files(void *arg);
47-
48-
static parray *get_dbOid_exclude_list(pgBackup *backup, parray *files,
49-
parray *datname_list, bool partial_restore_type);
5047
static void set_orphan_status(parray *backups, pgBackup *parent_backup);
5148

5249
/*
@@ -376,7 +373,7 @@ do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt,
376373
}
377374
}
378375

379-
pgBackupValidate(tmp_backup);
376+
pgBackupValidate(tmp_backup, params);
380377
/* After pgBackupValidate() only following backup
381378
* states are possible: ERROR, RUNNING, CORRUPT and OK.
382379
* Validate WAL only for OK, because there is no point

src/validate.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ typedef struct
3030
uint32 checksum_version;
3131
uint32 backup_version;
3232
BackupMode backup_mode;
33+
parray *dbOid_exclude_list;
3334

3435
/*
3536
* Return value from the thread.
@@ -42,7 +43,7 @@ typedef struct
4243
* Validate backup files.
4344
*/
4445
void
45-
pgBackupValidate(pgBackup *backup)
46+
pgBackupValidate(pgBackup *backup, pgRestoreParams *params)
4647
{
4748
char base_path[MAXPGPATH];
4849
char external_prefix[MAXPGPATH];
@@ -54,6 +55,7 @@ pgBackupValidate(pgBackup *backup)
5455
pthread_t *threads;
5556
validate_files_arg *threads_args;
5657
int i;
58+
parray *dbOid_exclude_list = NULL;
5759

5860
/* Check backup version */
5961
if (parse_program_version(backup->program_version) > parse_program_version(PROGRAM_VERSION))
@@ -105,6 +107,10 @@ pgBackupValidate(pgBackup *backup)
105107
pgBackupGetPath(backup, path, lengthof(path), DATABASE_FILE_LIST);
106108
files = dir_read_file_list(base_path, external_prefix, path, FIO_BACKUP_HOST);
107109

110+
if (params && params->partial_db_list)
111+
dbOid_exclude_list = get_dbOid_exclude_list(backup, files, params->partial_db_list,
112+
params->is_include_list);
113+
108114
/* setup threads */
109115
for (i = 0; i < parray_num(files); i++)
110116
{
@@ -130,6 +136,7 @@ pgBackupValidate(pgBackup *backup)
130136
arg->stop_lsn = backup->stop_lsn;
131137
arg->checksum_version = backup->checksum_version;
132138
arg->backup_version = parse_program_version(backup->program_version);
139+
arg->dbOid_exclude_list = dbOid_exclude_list;
133140
/* By default there are some error */
134141
threads_args[i].ret = 1;
135142

@@ -193,6 +200,15 @@ pgBackupValidateFiles(void *arg)
193200
if (!S_ISREG(file->mode))
194201
continue;
195202

203+
/*
204+
* If in partial validate, check if the file belongs to the database
205+
* we exclude. Only files from pgdata can be skipped.
206+
*/
207+
if (arguments->dbOid_exclude_list && file->external_dir_num == 0
208+
&& parray_bsearch(arguments->dbOid_exclude_list,
209+
&file->dbOid, pgCompareOid))
210+
continue;
211+
196212
/*
197213
* Currently we don't compute checksums for
198214
* cfs_compressed data files, so skip them.
@@ -498,7 +514,7 @@ do_validate_instance(void)
498514
continue;
499515
}
500516
/* Valiate backup files*/
501-
pgBackupValidate(current_backup);
517+
pgBackupValidate(current_backup, NULL);
502518

503519
/* Validate corresponding WAL files */
504520
if (current_backup->status == BACKUP_STATUS_OK)
@@ -593,7 +609,7 @@ do_validate_instance(void)
593609
continue;
594610
}
595611
/* Revalidate backup files*/
596-
pgBackupValidate(backup);
612+
pgBackupValidate(backup, NULL);
597613

598614
if (backup->status == BACKUP_STATUS_OK)
599615
{

0 commit comments

Comments
 (0)