1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-07-15 01:04:37 +02:00

Report page checksum errors in info command text output.

This feature currently only works for text output. JSON output is planned for the future.
This commit is contained in:
Stefan Fercot
2020-11-25 18:14:03 +01:00
committed by GitHub
parent 3ed7b93b90
commit 5488de8b6a
3 changed files with 79 additions and 8 deletions

View File

@ -46,6 +46,15 @@
<p>Expire history files.</p> <p>Expire history files.</p>
</release-item> </release-item>
<release-item>
<release-item-contributor-list>
<release-item-contributor id="stefan.fercot"/>
<release-item-reviewer id="cynthia.shang"/>
</release-item-contributor-list>
<p>Report page checksum errors in <cmd>info</cmd> command <id>text</id> output.</p>
</release-item>
<release-item> <release-item>
<release-item-contributor-list> <release-item-contributor-list>
<release-item-ideator id="brian.peterson"/> <release-item-ideator id="brian.peterson"/>

View File

@ -37,6 +37,7 @@ VARIANT_STRDEF_STATIC(ARCHIVE_KEY_MAX_VAR, "max");
VARIANT_STRDEF_STATIC(BACKREST_KEY_FORMAT_VAR, "format"); VARIANT_STRDEF_STATIC(BACKREST_KEY_FORMAT_VAR, "format");
VARIANT_STRDEF_STATIC(BACKREST_KEY_VERSION_VAR, "version"); VARIANT_STRDEF_STATIC(BACKREST_KEY_VERSION_VAR, "version");
VARIANT_STRDEF_STATIC(BACKUP_KEY_BACKREST_VAR, "backrest"); VARIANT_STRDEF_STATIC(BACKUP_KEY_BACKREST_VAR, "backrest");
VARIANT_STRDEF_STATIC(BACKUP_KEY_CHECKSUM_PAGE_ERROR_VAR, "checksum-page-error");
VARIANT_STRDEF_STATIC(BACKUP_KEY_DATABASE_REF_VAR, "database-ref"); VARIANT_STRDEF_STATIC(BACKUP_KEY_DATABASE_REF_VAR, "database-ref");
VARIANT_STRDEF_STATIC(BACKUP_KEY_INFO_VAR, "info"); VARIANT_STRDEF_STATIC(BACKUP_KEY_INFO_VAR, "info");
VARIANT_STRDEF_STATIC(BACKUP_KEY_LABEL_VAR, "label"); VARIANT_STRDEF_STATIC(BACKUP_KEY_LABEL_VAR, "label");
@ -342,6 +343,21 @@ backupList(VariantList *backupSection, InfoBackup *info, const String *backupLab
kvPut( kvPut(
varKv(backupInfo), BACKUP_KEY_TABLESPACE_VAR, varKv(backupInfo), BACKUP_KEY_TABLESPACE_VAR,
(varLstSize(tablespaceSection) > 0 ? varNewVarLst(tablespaceSection) : NULL)); (varLstSize(tablespaceSection) > 0 ? varNewVarLst(tablespaceSection) : NULL));
// Get the list of files with an error in the page checksum
VariantList *checksumPageErrorList = varLstNew();
for (unsigned int fileIdx = 0; fileIdx < manifestFileTotal(manifest); fileIdx++)
{
const ManifestFile *file = manifestFile(manifest, fileIdx);
if (file->checksumPageError)
varLstAdd(checksumPageErrorList, varNewStr(manifestPathPg(file->name)));
}
kvPut(
varKv(backupInfo), BACKUP_KEY_CHECKSUM_PAGE_ERROR_VAR,
(varLstSize(checksumPageErrorList) > 0 ? varNewVarLst(checksumPageErrorList) : NULL));
} }
varLstAdd(backupSection, backupInfo); varLstAdd(backupSection, backupInfo);
@ -709,6 +725,16 @@ formatTextDb(const KeyValue *stanzaInfo, String *resultStr, const String *backup
strCat(backupResult, LF_STR); strCat(backupResult, LF_STR);
} }
if (kvGet(backupInfo, BACKUP_KEY_CHECKSUM_PAGE_ERROR_VAR) != NULL)
{
StringList *checksumPageErrorList = strLstNewVarLst(
varVarLst(kvGet(backupInfo, BACKUP_KEY_CHECKSUM_PAGE_ERROR_VAR)));
strCatFmt(
backupResult, " page checksum error: %s\n",
strZ(strLstJoin(checksumPageErrorList, ", ")));
}
} }
} }

View File

@ -1037,7 +1037,7 @@ testRun(void)
" wal archive min/max (9.4-1): none present\n", " wal archive min/max (9.4-1): none present\n",
"text - multiple stanzas, one with valid backups, archives in latest DB"); "text - multiple stanzas, one with valid backups, archives in latest DB");
// Backup set requested // Backup set requested, with 1 checksum error
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
argList2 = strLstDup(argListText); argList2 = strLstDup(argListText);
strLstAddZ(argList2, "--stanza=stanza1"); strLstAddZ(argList2, "--stanza=stanza1");
@ -1065,7 +1065,8 @@ testRun(void)
" pg_stat => ../pg_stat\n" " pg_stat => ../pg_stat\n"
" tablespaces:\n" " tablespaces:\n"
" ts1 (1) => /tblspc/ts1\n" " ts1 (1) => /tblspc/ts1\n"
" ts12 (12) => /tblspc/ts12\n", " ts12 (12) => /tblspc/ts12\n"
" page checksum error: base/16384/17000\n",
"text - backup set requested"); "text - backup set requested");
strLstAddZ(argList2, "--output=json"); strLstAddZ(argList2, "--output=json");
@ -1073,7 +1074,7 @@ testRun(void)
TEST_ERROR(strZ(infoRender()), ConfigError, "option 'set' is currently only valid for text output"); TEST_ERROR(strZ(infoRender()), ConfigError, "option 'set' is currently only valid for text output");
// Backup set requested but no links // Backup set requested but no links, multiple checksum errors
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
argList2 = strLstDup(argListText); argList2 = strLstDup(argListText);
strLstAddZ(argList2, "--stanza=stanza1"); strLstAddZ(argList2, "--stanza=stanza1");
@ -1085,12 +1086,29 @@ testRun(void)
"[backup:target]\n" \ "[backup:target]\n" \
"pg_data={\"path\":\"/pg/base\",\"type\":\"path\"}\n" \ "pg_data={\"path\":\"/pg/base\",\"type\":\"path\"}\n" \
#define TEST_MANIFEST_FILE_MULTIPLE_CHECKSUM_ERRORS \
"\n" \
"[target:file]\n" \
"pg_data/PG_VERSION={\"checksum\":\"184473f470864e067ee3a22e64b47b0a1c356f29\",\"master\":true" \
",\"reference\":\"20190818-084502F_20190819-084506D\",\"size\":4,\"timestamp\":1565282114}\n" \
"pg_data/base/16384/17000={\"checksum\":\"e0101dd8ffb910c9c202ca35b5f828bcb9697bed\",\"checksum-page\":false" \
",\"checksum-page-error\":[1],\"repo-size\":4096,\"size\":8192,\"timestamp\":1565282114}\n" \
"pg_data/base/16384/PG_VERSION={\"checksum\":\"184473f470864e067ee3a22e64b47b0a1c356f29\",\"group\":false,\"size\":4" \
",\"timestamp\":1565282115}\n" \
"pg_data/base/32768/33000={\"checksum\":\"7a16d165e4775f7c92e8cdf60c0af57313f0bf90\",\"checksum-page\":false" \
",\"reference\":\"20190818-084502F\",\"size\":1073741824,\"timestamp\":1565282116}\n" \
"pg_data/base/32768/33000.32767={\"checksum\":\"6e99b589e550e68e934fd235ccba59fe5b592a9e\",\"checksum-page\":true" \
",\"reference\":\"20190818-084502F\",\"size\":32768,\"timestamp\":1565282114}\n" \
"pg_data/postgresql.conf={\"checksum\":\"6721d92c9fcdf4248acff1f9a1377127d9064807\",\"master\":true,\"size\":4457" \
",\"timestamp\":1565282114}\n" \
"pg_data/special={\"master\":true,\"mode\":\"0640\",\"size\":0,\"timestamp\":1565282120,\"user\":false}\n"
contentLoad = harnessInfoChecksumZ contentLoad = harnessInfoChecksumZ
( (
TEST_MANIFEST_HEADER TEST_MANIFEST_HEADER
TEST_MANIFEST_TARGET_NO_LINK TEST_MANIFEST_TARGET_NO_LINK
TEST_MANIFEST_DB TEST_MANIFEST_DB
TEST_MANIFEST_FILE TEST_MANIFEST_FILE_MULTIPLE_CHECKSUM_ERRORS
TEST_MANIFEST_FILE_DEFAULT TEST_MANIFEST_FILE_DEFAULT
TEST_MANIFEST_LINK TEST_MANIFEST_LINK
TEST_MANIFEST_LINK_DEFAULT TEST_MANIFEST_LINK_DEFAULT
@ -1120,10 +1138,11 @@ testRun(void)
" database size: 19.2MB, backup size: 8.2KB\n" " database size: 19.2MB, backup size: 8.2KB\n"
" repository size: 2.3MB, repository backup size: 346B\n" " repository size: 2.3MB, repository backup size: 346B\n"
" backup reference list: 20181119-152138F, 20181119-152138F_20181119-152152D\n" " backup reference list: 20181119-152138F, 20181119-152138F_20181119-152152D\n"
" database list: mail (16456), postgres (12173)\n", " database list: mail (16456), postgres (12173)\n"
" page checksum error: base/16384/17000, base/32768/33000\n",
"text - backup set requested, no links"); "text - backup set requested, no links");
// Backup set requested but no databases // Backup set requested but no databases, no checksum error
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
argList2 = strLstDup(argListText); argList2 = strLstDup(argListText);
strLstAddZ(argList2, "--stanza=stanza1"); strLstAddZ(argList2, "--stanza=stanza1");
@ -1136,12 +1155,29 @@ testRun(void)
"template0={\"db-id\":12168,\"db-last-system-id\":12168}\n" \ "template0={\"db-id\":12168,\"db-last-system-id\":12168}\n" \
"template1={\"db-id\":1,\"db-last-system-id\":12168}\n" \ "template1={\"db-id\":1,\"db-last-system-id\":12168}\n" \
#define TEST_MANIFEST_FILE_NO_CHECKSUM_ERROR \
"\n" \
"[target:file]\n" \
"pg_data/PG_VERSION={\"checksum\":\"184473f470864e067ee3a22e64b47b0a1c356f29\",\"master\":true" \
",\"reference\":\"20190818-084502F_20190819-084506D\",\"size\":4,\"timestamp\":1565282114}\n" \
"pg_data/base/16384/17000={\"checksum\":\"e0101dd8ffb910c9c202ca35b5f828bcb9697bed\",\"checksum-page\":true" \
",\"checksum-page-error\":[1],\"repo-size\":4096,\"size\":8192,\"timestamp\":1565282114}\n" \
"pg_data/base/16384/PG_VERSION={\"checksum\":\"184473f470864e067ee3a22e64b47b0a1c356f29\",\"group\":false,\"size\":4" \
",\"timestamp\":1565282115}\n" \
"pg_data/base/32768/33000={\"checksum\":\"7a16d165e4775f7c92e8cdf60c0af57313f0bf90\",\"checksum-page\":true" \
",\"reference\":\"20190818-084502F\",\"size\":1073741824,\"timestamp\":1565282116}\n" \
"pg_data/base/32768/33000.32767={\"checksum\":\"6e99b589e550e68e934fd235ccba59fe5b592a9e\",\"checksum-page\":true" \
",\"reference\":\"20190818-084502F\",\"size\":32768,\"timestamp\":1565282114}\n" \
"pg_data/postgresql.conf={\"checksum\":\"6721d92c9fcdf4248acff1f9a1377127d9064807\",\"master\":true,\"size\":4457" \
",\"timestamp\":1565282114}\n" \
"pg_data/special={\"master\":true,\"mode\":\"0640\",\"size\":0,\"timestamp\":1565282120,\"user\":false}\n"
contentLoad = harnessInfoChecksumZ contentLoad = harnessInfoChecksumZ
( (
TEST_MANIFEST_HEADER TEST_MANIFEST_HEADER
TEST_MANIFEST_TARGET_NO_LINK TEST_MANIFEST_TARGET_NO_LINK
TEST_MANIFEST_NO_DB TEST_MANIFEST_NO_DB
TEST_MANIFEST_FILE TEST_MANIFEST_FILE_NO_CHECKSUM_ERROR
TEST_MANIFEST_FILE_DEFAULT TEST_MANIFEST_FILE_DEFAULT
TEST_MANIFEST_LINK TEST_MANIFEST_LINK
TEST_MANIFEST_LINK_DEFAULT TEST_MANIFEST_LINK_DEFAULT
@ -1172,7 +1208,7 @@ testRun(void)
" repository size: 2.3MB, repository backup size: 346B\n" " repository size: 2.3MB, repository backup size: 346B\n"
" backup reference list: 20181119-152138F, 20181119-152138F_20181119-152152D\n" " backup reference list: 20181119-152138F, 20181119-152138F_20181119-152152D\n"
" database list: none\n", " database list: none\n",
"text - backup set requested, no db"); "text - backup set requested, no db and no checksum error");
// Stanza not found // Stanza not found
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------