Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 19405a9

Browse files
committed
PGPRO-2065: fix validate_one_page
1 parent 0b549f3 commit 19405a9

File tree

4 files changed

+56
-25
lines changed

4 files changed

+56
-25
lines changed

src/backup.c

+8-7
Original file line numberDiff line numberDiff line change
@@ -997,8 +997,6 @@ do_block_validation(void)
997997
arg->ret = 1;
998998
}
999999

1000-
pgut_atexit_push(threads_conn_disconnect, NULL);
1001-
10021000
/* TODO write better info message */
10031001
elog(INFO, "Start checking data files");
10041002

@@ -1141,12 +1139,17 @@ do_amcheck(void)
11411139
/* TODO consider moving some code common with do_backup_instance
11421140
* to separate function ot to pgdata_basic_setup */
11431141
int
1144-
do_checkdb(bool need_block_validation, bool need_amcheck)
1142+
do_checkdb(bool need_amcheck)
11451143
{
1144+
1145+
if (skip_block_validation && !need_amcheck)
1146+
elog(ERROR, "--skip-block-validation must be used with --amcheck option");
1147+
11461148
pgdata_basic_setup();
11471149

1148-
if (need_block_validation)
1150+
if (!skip_block_validation)
11491151
do_block_validation();
1152+
11501153
//if (need_amcheck)
11511154
// do_amcheck();
11521155

@@ -1425,7 +1428,6 @@ check_system_identifiers(void)
14251428
return;
14261429
}
14271430

1428-
14291431
if (system_id_conn != instance_config.system_identifier)
14301432
elog(ERROR, "Backup data directory was initialized for system id " UINT64_FORMAT ", "
14311433
"but connected instance system id is " UINT64_FORMAT,
@@ -2536,7 +2538,7 @@ backup_disconnect(bool fatal, void *userdata)
25362538
static void
25372539
threads_conn_disconnect(bool fatal, void *userdata)
25382540
{
2539-
int i;
2541+
// int i;
25402542

25412543
elog(VERBOSE, "threads_conn_disconnect, num_threads %d", num_threads);
25422544
// for (i = 0; i < num_threads; i++)
@@ -2624,7 +2626,6 @@ check_files(void *arg)
26242626
elog(WARNING, "unexpected file type %d", buf.st_mode);
26252627
}
26262628

2627-
/* Data files check is successful */
26282629
if (arguments->ret == 1)
26292630
arguments->ret = 0;
26302631

src/data.c

+34-10
Original file line numberDiff line numberDiff line change
@@ -369,14 +369,17 @@ prepare_page(backup_files_arg *arguments,
369369
* throw an error.
370370
*/
371371

372-
if (!page_is_valid)
372+
if (!page_is_valid &&
373+
((strict && !is_ptrack_support) || !strict))
373374
{
375+
/* show this message for checkdb or backup without ptrack support */
374376
elog(WARNING, "CORRUPTION in file %s, block %u",
375377
file->path, blknum);
378+
}
376379

377-
if (!is_ptrack_support && strict)
380+
/* Backup with invalid block and without ptrack support must throw error */
381+
if (!page_is_valid && strict && !is_ptrack_support)
378382
elog(ERROR, "Data file corruption. Canceling backup");
379-
}
380383

381384
/* Checkdb not going futher */
382385
if (!strict)
@@ -1488,6 +1491,7 @@ validate_one_page(Page page, pgFile *file,
14881491
XLogRecPtr lsn;
14891492
bool page_header_is_sane = false;
14901493
bool checksum_is_ok = false;
1494+
bool lsn_from_future = false;
14911495

14921496
/* new level of paranoia */
14931497
if (page == NULL)
@@ -1518,10 +1522,11 @@ validate_one_page(Page page, pgFile *file,
15181522
}
15191523

15201524
/* Page is zeroed. No sense to check header and checksum. */
1521-
page_header_is_sane = false;
1525+
return PAGE_IS_FOUND_AND_VALID;
15221526
}
15231527
else
15241528
{
1529+
/* We should give more information about what exactly is looking fishy */
15251530
if (PageGetPageSize(phdr) == BLCKSZ &&
15261531
PageGetPageLayoutVersion(phdr) == PG_PAGE_LAYOUT_VERSION &&
15271532
(phdr->pd_flags & ~PD_VALID_FLAG_BITS) == 0 &&
@@ -1530,7 +1535,14 @@ validate_one_page(Page page, pgFile *file,
15301535
phdr->pd_upper <= phdr->pd_special &&
15311536
phdr->pd_special <= BLCKSZ &&
15321537
phdr->pd_special == MAXALIGN(phdr->pd_special))
1533-
page_header_is_sane = true;
1538+
page_header_is_sane = true;
1539+
else
1540+
{
1541+
/* Page does not looking good */
1542+
page_header_is_sane = false;
1543+
elog(WARNING, "Page is not looking healthy: %s, block %i",
1544+
file->path, blknum);
1545+
}
15341546
}
15351547

15361548
if (page_header_is_sane)
@@ -1548,10 +1560,12 @@ validate_one_page(Page page, pgFile *file,
15481560
{
15491561
elog(WARNING, "File: %s blknum %u have wrong checksum",
15501562
file->path, blknum);
1563+
return PAGE_IS_FOUND_AND_NOT_VALID;
15511564
}
15521565
}
15531566
else
15541567
{
1568+
/* Checksums are disabled, so check lsn. */
15551569
if (stop_lsn > 0)
15561570
{
15571571
/* Get lsn from page header. Ensure that page is from our time.
@@ -1561,31 +1575,41 @@ validate_one_page(Page page, pgFile *file,
15611575
lsn = PageXLogRecPtrGet(phdr->pd_lsn);
15621576

15631577
if (lsn > stop_lsn)
1578+
{
15641579
elog(WARNING, "File: %s, block %u, checksum is not enabled. "
15651580
"Page is from future: pageLSN %X/%X stopLSN %X/%X",
15661581
file->path, blknum, (uint32) (lsn >> 32), (uint32) lsn,
15671582
(uint32) (stop_lsn >> 32), (uint32) stop_lsn);
1568-
else
1569-
return PAGE_IS_FOUND_AND_VALID;
1583+
lsn_from_future = true;
1584+
}
15701585
}
1586+
15711587
}
15721588

1589+
/* If checksum is ok, check that page is not from future */
15731590
if (checksum_is_ok && stop_lsn > 0)
15741591
{
15751592
/* Get lsn from page header. Ensure that page is from our time */
15761593
lsn = PageXLogRecPtrGet(phdr->pd_lsn);
15771594

15781595
if (lsn > stop_lsn)
1596+
{
15791597
elog(WARNING, "File: %s, block %u, checksum is correct. "
15801598
"Page is from future: pageLSN %X/%X stopLSN %X/%X",
15811599
file->path, blknum, (uint32) (lsn >> 32), (uint32) lsn,
15821600
(uint32) (stop_lsn >> 32), (uint32) stop_lsn);
1583-
else
1584-
return PAGE_IS_FOUND_AND_VALID;
1601+
lsn_from_future = true;
1602+
}
15851603
}
1604+
1605+
if (lsn_from_future)
1606+
return PAGE_IS_FOUND_AND_NOT_VALID;
1607+
else
1608+
return PAGE_IS_FOUND_AND_VALID;
15861609
}
1610+
else
1611+
return PAGE_IS_FOUND_AND_NOT_VALID;
15871612

1588-
return PAGE_IS_FOUND_AND_NOT_VALID;
15891613
}
15901614

15911615
bool

src/pg_probackup.c

+13-7
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ bool restore_no_validate = false;
9090
bool skip_block_validation = false;
9191
bool skip_external_dirs = false;
9292

93-
bool do_block_validation = false;
93+
/* checkdb options */
9494
bool do_amcheck = false;
9595

9696
/* delete options */
@@ -162,8 +162,7 @@ static ConfigOption cmd_options[] =
162162
{ 'b', 154, "skip-block-validation", &skip_block_validation, SOURCE_CMD_STRICT },
163163
{ 'b', 156, "skip-external-dirs", &skip_external_dirs, SOURCE_CMD_STRICT },
164164
/* checkdb options */
165-
{ 'b', 157, "amcheck", &do_amcheck, SOURCE_CMD_STRICT },
166-
{ 'b', 158, "block-validation", &do_block_validation, SOURCE_CMD_STRICT },
165+
{ 'b', 157, "amcheck", &do_amcheck, SOURCE_CMD_STRICT },
167166
/* delete options */
168167
{ 'b', 145, "wal", &delete_wal, SOURCE_CMD_STRICT },
169168
{ 'b', 146, "expired", &delete_expired, SOURCE_CMD_STRICT },
@@ -411,12 +410,19 @@ main(int argc, char *argv[])
411410
if (backup_path == NULL && backup_subcmd == CHECKDB_CMD)
412411
config_get_opt_env(instance_options);
413412

413+
/* Sanity for checkdb, if backup_dir is provided but pgdata and instance are not */
414+
if (backup_subcmd == CHECKDB_CMD &&
415+
backup_path != NULL &&
416+
instance_name == NULL &&
417+
instance_config.pgdata == NULL)
418+
elog(ERROR, "required parameter not specified: --instance");
419+
414420
if (backup_subcmd == CHECKDB_CMD
415421
&& (instance_config.logger.log_level_file != LOG_OFF)
416-
&& (&instance_config.logger.log_directory == NULL))
422+
&& (instance_config.logger.log_directory == NULL))
417423
elog(ERROR, "Cannot save checkdb logs to a file. "
418-
"You must specify --log-directory option when running checkdb with "
419-
"--log-level-file option enabled.");
424+
"You must specify --log-directory option when running checkdb with "
425+
"--log-level-file option enabled.");
420426

421427
/* Initialize logger */
422428
init_logger(backup_path, &instance_config.logger);
@@ -560,7 +566,7 @@ main(int argc, char *argv[])
560566
do_set_config(false);
561567
break;
562568
case CHECKDB_CMD:
563-
do_checkdb(do_block_validation, do_amcheck);
569+
do_checkdb(do_amcheck);
564570
break;
565571
case NO_CMD:
566572
/* Should not happen */

src/pg_probackup.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ extern const char *pgdata_exclude_dir[];
416416

417417
/* in backup.c */
418418
extern int do_backup(time_t start_time);
419-
extern int do_checkdb(bool need_block_validation, bool need_amcheck);
419+
extern int do_checkdb(bool need_amcheck);
420420
extern BackupMode parse_backup_mode(const char *value);
421421
extern const char *deparse_backup_mode(BackupMode mode);
422422
extern void process_block_change(ForkNumber forknum, RelFileNode rnode,

0 commit comments

Comments
 (0)