You've already forked pgbackrest
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:
@ -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"/>
|
||||||
|
@ -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, ", ")));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
//--------------------------------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user