Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit19405a9

Browse files
committed
PGPRO-2065: fix validate_one_page
1 parent0b549f3 commit19405a9

File tree

4 files changed

+56
-25
lines changed

4 files changed

+56
-25
lines changed

‎src/backup.c

Lines changed: 8 additions & 7 deletions
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(boolneed_block_validation,boolneed_amcheck)
1142+
do_checkdb(boolneed_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
staticvoid
25372539
threads_conn_disconnect(boolfatal,void*userdata)
25382540
{
2539-
inti;
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

Lines changed: 34 additions & 10 deletions
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
XLogRecPtrlsn;
14891492
boolpage_header_is_sane= false;
14901493
boolchecksum_is_ok= false;
1494+
boollsn_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+
returnPAGE_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+
returnPAGE_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-
returnPAGE_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-
returnPAGE_IS_FOUND_AND_VALID;
1601+
lsn_from_future= true;
1602+
}
15851603
}
1604+
1605+
if (lsn_from_future)
1606+
returnPAGE_IS_FOUND_AND_NOT_VALID;
1607+
else
1608+
returnPAGE_IS_FOUND_AND_VALID;
15861609
}
1610+
else
1611+
returnPAGE_IS_FOUND_AND_NOT_VALID;
15871612

1588-
returnPAGE_IS_FOUND_AND_NOT_VALID;
15891613
}
15901614

15911615
bool

‎src/pg_probackup.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ bool restore_no_validate = false;
9090
boolskip_block_validation= false;
9191
boolskip_external_dirs= false;
9292

93-
booldo_block_validation= false;
93+
/* checkdb options */
9494
booldo_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
caseCHECKDB_CMD:
563-
do_checkdb(do_block_validation,do_amcheck);
569+
do_checkdb(do_amcheck);
564570
break;
565571
caseNO_CMD:
566572
/* Should not happen */

‎src/pg_probackup.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ extern const char *pgdata_exclude_dir[];
416416

417417
/* in backup.c */
418418
externintdo_backup(time_tstart_time);
419-
externintdo_checkdb(boolneed_block_validation,boolneed_amcheck);
419+
externintdo_checkdb(boolneed_amcheck);
420420
externBackupModeparse_backup_mode(constchar*value);
421421
externconstchar*deparse_backup_mode(BackupModemode);
422422
externvoidprocess_block_change(ForkNumberforknum,RelFileNodernode,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp