diff --git a/doc/xml/release.xml b/doc/xml/release.xml index a367502ce..0eed6dafb 100644 --- a/doc/xml/release.xml +++ b/doc/xml/release.xml @@ -176,6 +176,14 @@

Fixed the backup command so the backup-standby option is reset (and the backup proceeds on the master) if the standby is not configured and/or reachable.

+ + + + + + +

Fixed config warnings raised from a remote process causing errors in the master process.

+
diff --git a/lib/pgBackRest/Config/Config.pm b/lib/pgBackRest/Config/Config.pm index 32428a3d6..c1ba26363 100644 --- a/lib/pgBackRest/Config/Config.pm +++ b/lib/pgBackRest/Config/Config.pm @@ -2734,7 +2734,7 @@ sub optionValidate #################################################################################################################################### # configFileValidate # -# Determine if the configuration file contains any invalid options or placements. +# Determine if the configuration file contains any invalid options or placements. Not valid on remote. #################################################################################################################################### sub configFileValidate { @@ -2742,50 +2742,53 @@ sub configFileValidate my $bFileValid = true; - foreach my $strSectionKey (keys(%$oConfig)) + if (!commandTest(CMD_REMOTE)) { - my ($strSection, $strCommand) = ($strSectionKey =~ m/([^:]*):*(\w*-*\w*)/); - - foreach my $strOption (keys(%{$$oConfig{$strSectionKey}})) + foreach my $strSectionKey (keys(%$oConfig)) { - my $strValue = $$oConfig{$strSectionKey}{$strOption}; + my ($strSection, $strCommand) = ($strSectionKey =~ m/([^:]*):*(\w*-*\w*)/); - # Is the option listed as an alternate name for another option? If so, replace it with the recognized option. - my $strOptionAltName = optionAltName($strOption); + foreach my $strOption (keys(%{$$oConfig{$strSectionKey}})) + { + my $strValue = $$oConfig{$strSectionKey}{$strOption}; - if (defined($strOptionAltName)) - { - $strOption = $strOptionAltName; - } + # Is the option listed as an alternate name for another option? If so, replace it with the recognized option. + my $strOptionAltName = optionAltName($strOption); - # Is the option a valid pgbackrest option? - if (!(exists($oOptionRule{$strOption}) || defined($strOptionAltName))) - { - &log(WARN, optionGet(OPTION_CONFIG) . " file contains invalid option '${strOption}'"); - $bFileValid = false; - } - else - { - # Is the option valid for the command section in which it is located? - if (defined($strCommand) && $strCommand ne '') + if (defined($strOptionAltName)) { - if (!defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand})) - { - &log(WARN, optionGet(OPTION_CONFIG) . " valid option '${strOption}' is not valid for command " . - "'${strCommand}'"); - $bFileValid = false; - } + $strOption = $strOptionAltName; } - # Is the valid option a stanza-only option and not located in a global section? - if ($oOptionRule{$strOption}{&OPTION_RULE_SECTION} eq CONFIG_SECTION_STANZA && - $strSection eq CONFIG_SECTION_GLOBAL) + # Is the option a valid pgbackrest option? + if (!(exists($oOptionRule{$strOption}) || defined($strOptionAltName))) { - &log(WARN, optionGet(OPTION_CONFIG) . " valid option '${strOption}' is a stanza section option and is not " . - "valid in section ${strSection}\n" . - "HINT: global options can be specified in global or stanza sections but not visa-versa"); + &log(WARN, optionGet(OPTION_CONFIG) . " file contains invalid option '${strOption}'"); $bFileValid = false; } + else + { + # Is the option valid for the command section in which it is located? + if (defined($strCommand) && $strCommand ne '') + { + if (!defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand})) + { + &log(WARN, optionGet(OPTION_CONFIG) . " valid option '${strOption}' is not valid for command " . + "'${strCommand}'"); + $bFileValid = false; + } + } + + # Is the valid option a stanza-only option and not located in a global section? + if ($oOptionRule{$strOption}{&OPTION_RULE_SECTION} eq CONFIG_SECTION_STANZA && + $strSection eq CONFIG_SECTION_GLOBAL) + { + &log(WARN, optionGet(OPTION_CONFIG) . " valid option '${strOption}' is a stanza section option and is not " . + "valid in section ${strSection}\n" . + "HINT: global options can be specified in global or stanza sections but not visa-versa"); + $bFileValid = false; + } + } } } } diff --git a/test/expect/full-synthetic-001.log b/test/expect/full-synthetic-001.log index 0ef0b8721..3260c36b1 100644 --- a/test/expect/full-synthetic-001.log +++ b/test/expect/full-synthetic-001.log @@ -4195,13 +4195,13 @@ info bogus stanza - bogus stanza (db-master host) [BACKUP-DIFF-5].manifest.gz [BACKUP-FULL-3].manifest.gz -diff backup - option backup-standby reset - backup performed from master (db-master host) -> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --backup-standby --type=diff --stanza=db backup +diff backup - config file warning on local (db-master host) +> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail 2>&1 --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --backup-standby --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2/base --lock-path=[TEST_PATH]/db-master/repo/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/repo/log --no-online --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff +WARN: [TEST_PATH]/db-master/pgbackrest.conf file contains invalid option 'bogus' +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2/base --lock-path=[TEST_PATH]/db-master/repo/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/repo/log --no-online --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. -P00 WARN: option backup-standby is enabled but standby is not properly configured - backups will be performed from the master P00 INFO: last backup label = [BACKUP-FULL-3], version = [VERSION-1] P01 INFO: backup file [TEST_PATH]/db-master/db/base-2/base/base/base2.txt (9B, 100%) checksum cafac3c59553f2cfde41ce2e62e7662295f108c0 P00 INFO: diff backup size = 9B @@ -4230,6 +4230,7 @@ repo-path=[TEST_PATH]/db-master/repo [global:backup] archive-copy=y start-fast=y +bogus=bogus + supplemental file: [TEST_PATH]/db-master/repo/backup/db/[BACKUP-DIFF-6]/backup.manifest ----------------------------------------------------------------------------------------- @@ -4346,3 +4347,156 @@ db-version="9.4" [db:history] 1={"db-catalog-version":201409291,"db-control-version":942,"db-system-id":6353949018581704918,"db-version":"9.4"} + +diff backup - option backup-standby reset - backup performed from master (db-master host) +> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --backup-standby --type=diff --stanza=db backup +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: backup command begin [BACKREST-VERSION]: --backup-standby --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2/base --lock-path=[TEST_PATH]/db-master/repo/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/repo/log --no-online --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff +P00 WARN: option retention-full is not set, the repository may run out of space + HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. +P00 WARN: option backup-standby is enabled but standby is not properly configured - backups will be performed from the master +P00 INFO: last backup label = [BACKUP-FULL-3], version = [VERSION-1] +P01 INFO: backup file [TEST_PATH]/db-master/db/base-2/base/base/base2.txt (9B, 100%) checksum cafac3c59553f2cfde41ce2e62e7662295f108c0 +P00 INFO: diff backup size = 9B +P00 INFO: new backup label = [BACKUP-DIFF-7] +P00 INFO: backup command end: completed successfully +P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/repo/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/repo/log --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: option 'retention-archive' is not set - archive logs will not be expired +P00 INFO: expire command end: completed successfully + ++ supplemental file: [TEST_PATH]/db-master/pgbackrest.conf +---------------------------------------------------------- +[db] +db-path=[TEST_PATH]/db-master/db/base-2/base + +[db:restore] + +[global] +compress=n +lock-path=[TEST_PATH]/db-master/repo/lock +log-level-console=debug +log-level-file=trace +log-level-stderr=off +log-path=[TEST_PATH]/db-master/repo/log +repo-path=[TEST_PATH]/db-master/repo + +[global:backup] +archive-copy=y +start-fast=y + ++ supplemental file: [TEST_PATH]/db-master/repo/backup/db/[BACKUP-DIFF-7]/backup.manifest +----------------------------------------------------------------------------------------- +[backrest] +backrest-checksum="[CHECKSUM]" +backrest-format=5 +backrest-version="[VERSION-1]" + +[backup] +backup-label="[BACKUP-DIFF-7]" +backup-prior="[BACKUP-FULL-3]" +backup-timestamp-copy-start=[TIMESTAMP] +backup-timestamp-start=[TIMESTAMP] +backup-timestamp-stop=[TIMESTAMP] +backup-type="diff" + +[backup:db] +db-catalog-version=201409291 +db-control-version=942 +db-id=1 +db-system-id=6353949018581704918 +db-version="9.4" + +[backup:option] +option-archive-check=true +option-archive-copy=true +option-backup-standby=false +option-checksum-page=false +option-compress=false +option-hardlink=false +option-online=false + +[backup:target] +pg_data={"path":"[TEST_PATH]/db-master/db/base-2/base","type":"path"} +pg_tblspc/2={"path":"../../tablespace/ts2","tablespace-id":"2","tablespace-name":"ts2","type":"link"} + +[target:file] +pg_data/PG_VERSION={"checksum":"184473f470864e067ee3a22e64b47b0a1c356f29","master":true,"reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/badchecksum.txt={"checksum":"f927212cd08d11a42a666b2f04235398e9ceeb51","master":true,"reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/1/12000={"checksum":"22c98d248ff548311eda88559e4a8405ed77c003","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/1/PG_VERSION={"checksum":"184473f470864e067ee3a22e64b47b0a1c356f29","mode":"0660","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/16384/17000={"checksum":"7579ada0808d7f98087a0a586d0df9de009cdc33","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/16384/PG_VERSION={"checksum":"184473f470864e067ee3a22e64b47b0a1c356f29","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/32768/33000={"checksum":"4a383e4fb8b5cd2a4e8fab91ef63dce48e532a2f","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/32768/33000.32767={"checksum":"21e2c7c1a326682c07053b7d6a5a40dbd49c2ec5","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/32768/33001={"checksum":"6bf316f11d28c28914ea9be92c00de9bea6d9a6b","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/32768/PG_VERSION={"checksum":"184473f470864e067ee3a22e64b47b0a1c356f29","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/base2.txt={"checksum":"cafac3c59553f2cfde41ce2e62e7662295f108c0","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/global/pg_control={"checksum":"89373d9f2973502940de06bc5212489df3f8a912","master":true,"reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-2]} +pg_data/pg_stat/global.stat={"checksum":"e350d5ce0153f3e22d5db21cf2a4eff00f3ee877","master":true,"reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-2]} +pg_data/postgresql.conf={"checksum":"6721d92c9fcdf4248acff1f9a1377127d9064807","master":true,"reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-2]} +pg_tblspc/2/[TS_PATH-1]/32768/pg_internal.init={"checksum":"bc46a4e0420d357db7bfbcb7b5fcbc613dc48c1b","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_tblspc/2/[TS_PATH-1]/32768/tablespace2.txt={"checksum":"dc7f76e43c46101b47acc55ae4d593a9e6983578","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_tblspc/2/[TS_PATH-1]/32768/tablespace2c.txt={"checksum":"dfcb8679956b734706cf87259d50c88f83e80e66","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} + +[target:file:default] +group="[GROUP-1]" +master=false +mode="0600" +user="[USER-1]" + +[target:link] +pg_data/pg_tblspc/2={"destination":"../../tablespace/ts2"} + +[target:link:default] +group="[GROUP-1]" +user="[USER-1]" + +[target:path] +pg_data={} +pg_data/base={} +pg_data/base/1={} +pg_data/base/16384={} +pg_data/base/32768={} +pg_data/global={} +pg_data/pg_clog={} +pg_data/pg_dynshmem={} +pg_data/pg_notify={} +pg_data/pg_replslot={} +pg_data/pg_serial={} +pg_data/pg_snapshots={} +pg_data/pg_stat={} +pg_data/pg_stat_tmp={} +pg_data/pg_subtrans={} +pg_data/pg_tblspc={} +pg_tblspc={} +pg_tblspc/2={} +pg_tblspc/2/[TS_PATH-1]={} +pg_tblspc/2/[TS_PATH-1]/32768={} + +[target:path:default] +group="[GROUP-1]" +mode="0700" +user="[USER-1]" + ++ supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info +--------------------------------------------------------------------- +[backrest] +backrest-checksum="[CHECKSUM]" +backrest-format=5 +backrest-version="[VERSION-1]" + +[backup:current] +[BACKUP-FULL-3]={"backrest-format":5,"backrest-version":"[VERSION-1]","backup-archive-start":null,"backup-archive-stop":null,"backup-info-repo-size":[SIZE],"backup-info-repo-size-delta":[DELTA],"backup-info-size":[SIZE],"backup-info-size-delta":[DELTA],"backup-timestamp-start":[TIMESTAMP],"backup-timestamp-stop":[TIMESTAMP],"backup-type":"full","db-id":1,"option-archive-check":true,"option-archive-copy":true,"option-backup-standby":false,"option-checksum-page":false,"option-compress":false,"option-hardlink":false,"option-online":false} +[BACKUP-DIFF-5]={"backrest-format":5,"backrest-version":"[VERSION-1]","backup-archive-start":null,"backup-archive-stop":null,"backup-info-repo-size":[SIZE],"backup-info-repo-size-delta":[DELTA],"backup-info-size":[SIZE],"backup-info-size-delta":[DELTA],"backup-prior":"[BACKUP-FULL-3]","backup-reference":["[BACKUP-FULL-3]"],"backup-timestamp-start":[TIMESTAMP],"backup-timestamp-stop":[TIMESTAMP],"backup-type":"diff","db-id":1,"option-archive-check":true,"option-archive-copy":true,"option-backup-standby":false,"option-checksum-page":false,"option-compress":false,"option-hardlink":false,"option-online":false} +[BACKUP-DIFF-6]={"backrest-format":5,"backrest-version":"[VERSION-1]","backup-archive-start":null,"backup-archive-stop":null,"backup-info-repo-size":[SIZE],"backup-info-repo-size-delta":[DELTA],"backup-info-size":[SIZE],"backup-info-size-delta":[DELTA],"backup-prior":"[BACKUP-FULL-3]","backup-reference":["[BACKUP-FULL-3]"],"backup-timestamp-start":[TIMESTAMP],"backup-timestamp-stop":[TIMESTAMP],"backup-type":"diff","db-id":1,"option-archive-check":true,"option-archive-copy":true,"option-backup-standby":false,"option-checksum-page":false,"option-compress":false,"option-hardlink":false,"option-online":false} +[BACKUP-DIFF-7]={"backrest-format":5,"backrest-version":"[VERSION-1]","backup-archive-start":null,"backup-archive-stop":null,"backup-info-repo-size":[SIZE],"backup-info-repo-size-delta":[DELTA],"backup-info-size":[SIZE],"backup-info-size-delta":[DELTA],"backup-prior":"[BACKUP-FULL-3]","backup-reference":["[BACKUP-FULL-3]"],"backup-timestamp-start":[TIMESTAMP],"backup-timestamp-stop":[TIMESTAMP],"backup-type":"diff","db-id":1,"option-archive-check":true,"option-archive-copy":true,"option-backup-standby":false,"option-checksum-page":false,"option-compress":false,"option-hardlink":false,"option-online":false} + +[db] +db-catalog-version=201409291 +db-control-version=942 +db-id=1 +db-system-id=6353949018581704918 +db-version="9.4" + +[db:history] +1={"db-catalog-version":201409291,"db-control-version":942,"db-system-id":6353949018581704918,"db-version":"9.4"} diff --git a/test/expect/full-synthetic-005.log b/test/expect/full-synthetic-005.log index 28465804e..cd6465997 100644 --- a/test/expect/full-synthetic-005.log +++ b/test/expect/full-synthetic-005.log @@ -4362,13 +4362,12 @@ info bogus stanza - bogus stanza (db-master host) } ] -diff backup - option backup-standby reset - backup performed from master (backup host) -> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --backup-standby --type=diff --stanza=db backup +diff backup - config file not validated on remote (backup host) +> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --backup-standby --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2/base --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/repo/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/repo/log --no-online --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2/base --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/repo/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/repo/log --no-online --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. -P00 WARN: option backup-standby is enabled but standby is not properly configured - backups will be performed from the master P00 INFO: last backup label = [BACKUP-FULL-3], version = [VERSION-1] P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/base/base/base2.txt (9B, 100%) checksum cafac3c59553f2cfde41ce2e62e7662295f108c0 P00 INFO: diff backup size = 9B @@ -4397,6 +4396,7 @@ log-level-file=trace log-level-stderr=off log-path=[TEST_PATH]/db-master/spool/log repo-path=[TEST_PATH]/backup/repo +bogus=bogus + supplemental file: [TEST_PATH]/backup/pgbackrest.conf ------------------------------------------------------- @@ -4528,3 +4528,171 @@ db-version="9.4" [db:history] 1={"db-catalog-version":201409291,"db-control-version":942,"db-system-id":6353949018581704918,"db-version":"9.4"} + +diff backup - option backup-standby reset - backup performed from master (backup host) +> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --backup-standby --type=diff --stanza=db backup +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: backup command begin [BACKREST-VERSION]: --backup-standby --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2/base --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/repo/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/repo/log --no-online --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff +P00 WARN: option retention-full is not set, the repository may run out of space + HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. +P00 WARN: option backup-standby is enabled but standby is not properly configured - backups will be performed from the master +P00 INFO: last backup label = [BACKUP-FULL-3], version = [VERSION-1] +P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/base/base/base2.txt (9B, 100%) checksum cafac3c59553f2cfde41ce2e62e7662295f108c0 +P00 INFO: diff backup size = 9B +P00 INFO: new backup label = [BACKUP-DIFF-7] +P00 INFO: backup command end: completed successfully +P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --lock-path=[TEST_PATH]/backup/repo/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/repo/log --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: option 'retention-archive' is not set - archive logs will not be expired +P00 INFO: expire command end: completed successfully + ++ supplemental file: [TEST_PATH]/db-master/pgbackrest.conf +---------------------------------------------------------- +[db] +db-path=[TEST_PATH]/db-master/db/base-2/base + +[db:restore] + +[global] +backup-cmd=[BACKREST-BIN] +backup-config=[TEST_PATH]/backup/pgbackrest.conf +backup-host=backup +backup-user=[USER-2] +compress=n +lock-path=[TEST_PATH]/db-master/spool/lock +log-level-console=debug +log-level-file=trace +log-level-stderr=off +log-path=[TEST_PATH]/db-master/spool/log +repo-path=[TEST_PATH]/backup/repo + ++ supplemental file: [TEST_PATH]/backup/pgbackrest.conf +------------------------------------------------------- +[db] +db-cmd=[BACKREST-BIN] +db-config=[TEST_PATH]/db-master/pgbackrest.conf +db-host=db-master +db-path=[TEST_PATH]/db-master/db/base-2/base +db-user=[USER-1] + +[global] +compress=n +lock-path=[TEST_PATH]/backup/repo/lock +log-level-console=debug +log-level-file=trace +log-level-stderr=off +log-path=[TEST_PATH]/backup/repo/log +repo-path=[TEST_PATH]/backup/repo + +[global:backup] +archive-copy=y +start-fast=y + ++ supplemental file: [TEST_PATH]/backup/repo/backup/db/[BACKUP-DIFF-7]/backup.manifest +-------------------------------------------------------------------------------------- +[backrest] +backrest-checksum="[CHECKSUM]" +backrest-format=5 +backrest-version="[VERSION-1]" + +[backup] +backup-label="[BACKUP-DIFF-7]" +backup-prior="[BACKUP-FULL-3]" +backup-timestamp-copy-start=[TIMESTAMP] +backup-timestamp-start=[TIMESTAMP] +backup-timestamp-stop=[TIMESTAMP] +backup-type="diff" + +[backup:db] +db-catalog-version=201409291 +db-control-version=942 +db-id=1 +db-system-id=6353949018581704918 +db-version="9.4" + +[backup:option] +option-archive-check=true +option-archive-copy=true +option-backup-standby=false +option-checksum-page=false +option-compress=false +option-hardlink=false +option-online=false + +[backup:target] +pg_data={"path":"[TEST_PATH]/db-master/db/base-2/base","type":"path"} +pg_tblspc/2={"path":"../../tablespace/ts2","tablespace-id":"2","tablespace-name":"ts2","type":"link"} + +[target:file] +pg_data/PG_VERSION={"checksum":"184473f470864e067ee3a22e64b47b0a1c356f29","master":true,"reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/badchecksum.txt={"checksum":"f927212cd08d11a42a666b2f04235398e9ceeb51","master":true,"reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/1/12000={"checksum":"22c98d248ff548311eda88559e4a8405ed77c003","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/1/PG_VERSION={"checksum":"184473f470864e067ee3a22e64b47b0a1c356f29","mode":"0660","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/16384/17000={"checksum":"7579ada0808d7f98087a0a586d0df9de009cdc33","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/16384/PG_VERSION={"checksum":"184473f470864e067ee3a22e64b47b0a1c356f29","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/32768/33000={"checksum":"4a383e4fb8b5cd2a4e8fab91ef63dce48e532a2f","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/32768/33000.32767={"checksum":"21e2c7c1a326682c07053b7d6a5a40dbd49c2ec5","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/32768/33001={"checksum":"6bf316f11d28c28914ea9be92c00de9bea6d9a6b","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/32768/PG_VERSION={"checksum":"184473f470864e067ee3a22e64b47b0a1c356f29","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/base/base2.txt={"checksum":"cafac3c59553f2cfde41ce2e62e7662295f108c0","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_data/global/pg_control={"checksum":"89373d9f2973502940de06bc5212489df3f8a912","master":true,"reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-2]} +pg_data/pg_stat/global.stat={"checksum":"e350d5ce0153f3e22d5db21cf2a4eff00f3ee877","master":true,"reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-2]} +pg_data/postgresql.conf={"checksum":"6721d92c9fcdf4248acff1f9a1377127d9064807","master":true,"reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-2]} +pg_tblspc/2/[TS_PATH-1]/32768/pg_internal.init={"checksum":"bc46a4e0420d357db7bfbcb7b5fcbc613dc48c1b","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_tblspc/2/[TS_PATH-1]/32768/tablespace2.txt={"checksum":"dc7f76e43c46101b47acc55ae4d593a9e6983578","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} +pg_tblspc/2/[TS_PATH-1]/32768/tablespace2c.txt={"checksum":"dfcb8679956b734706cf87259d50c88f83e80e66","reference":"[BACKUP-FULL-3]","size":[SIZE],"timestamp":[TIMESTAMP-1]} + +[target:file:default] +group="[GROUP-1]" +master=false +mode="0600" +user="[USER-1]" + +[target:link] +pg_data/pg_tblspc/2={"destination":"../../tablespace/ts2"} + +[target:link:default] +group="[GROUP-1]" +user="[USER-1]" + +[target:path] +pg_data={} +pg_data/base={} +pg_data/base/1={} +pg_data/base/16384={} +pg_data/base/32768={} +pg_data/global={} +pg_data/pg_clog={} +pg_data/pg_stat={} +pg_data/pg_tblspc={} +pg_tblspc={} +pg_tblspc/2={} +pg_tblspc/2/[TS_PATH-1]={} +pg_tblspc/2/[TS_PATH-1]/32768={} + +[target:path:default] +group="[GROUP-1]" +mode="0700" +user="[USER-1]" + ++ supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info +------------------------------------------------------------------ +[backrest] +backrest-checksum="[CHECKSUM]" +backrest-format=5 +backrest-version="[VERSION-1]" + +[backup:current] +[BACKUP-FULL-3]={"backrest-format":5,"backrest-version":"[VERSION-1]","backup-archive-start":null,"backup-archive-stop":null,"backup-info-repo-size":[SIZE],"backup-info-repo-size-delta":[DELTA],"backup-info-size":[SIZE],"backup-info-size-delta":[DELTA],"backup-timestamp-start":[TIMESTAMP],"backup-timestamp-stop":[TIMESTAMP],"backup-type":"full","db-id":1,"option-archive-check":true,"option-archive-copy":true,"option-backup-standby":false,"option-checksum-page":false,"option-compress":false,"option-hardlink":false,"option-online":false} +[BACKUP-DIFF-5]={"backrest-format":5,"backrest-version":"[VERSION-1]","backup-archive-start":null,"backup-archive-stop":null,"backup-info-repo-size":[SIZE],"backup-info-repo-size-delta":[DELTA],"backup-info-size":[SIZE],"backup-info-size-delta":[DELTA],"backup-prior":"[BACKUP-FULL-3]","backup-reference":["[BACKUP-FULL-3]"],"backup-timestamp-start":[TIMESTAMP],"backup-timestamp-stop":[TIMESTAMP],"backup-type":"diff","db-id":1,"option-archive-check":true,"option-archive-copy":true,"option-backup-standby":false,"option-checksum-page":false,"option-compress":false,"option-hardlink":false,"option-online":false} +[BACKUP-DIFF-6]={"backrest-format":5,"backrest-version":"[VERSION-1]","backup-archive-start":null,"backup-archive-stop":null,"backup-info-repo-size":[SIZE],"backup-info-repo-size-delta":[DELTA],"backup-info-size":[SIZE],"backup-info-size-delta":[DELTA],"backup-prior":"[BACKUP-FULL-3]","backup-reference":["[BACKUP-FULL-3]"],"backup-timestamp-start":[TIMESTAMP],"backup-timestamp-stop":[TIMESTAMP],"backup-type":"diff","db-id":1,"option-archive-check":true,"option-archive-copy":true,"option-backup-standby":false,"option-checksum-page":false,"option-compress":false,"option-hardlink":false,"option-online":false} +[BACKUP-DIFF-7]={"backrest-format":5,"backrest-version":"[VERSION-1]","backup-archive-start":null,"backup-archive-stop":null,"backup-info-repo-size":[SIZE],"backup-info-repo-size-delta":[DELTA],"backup-info-size":[SIZE],"backup-info-size-delta":[DELTA],"backup-prior":"[BACKUP-FULL-3]","backup-reference":["[BACKUP-FULL-3]"],"backup-timestamp-start":[TIMESTAMP],"backup-timestamp-stop":[TIMESTAMP],"backup-type":"diff","db-id":1,"option-archive-check":true,"option-archive-copy":true,"option-backup-standby":false,"option-checksum-page":false,"option-compress":false,"option-hardlink":false,"option-online":false} + +[db] +db-catalog-version=201409291 +db-control-version=942 +db-id=1 +db-system-id=6353949018581704918 +db-version="9.4" + +[db:history] +1={"db-catalog-version":201409291,"db-control-version":942,"db-system-id":6353949018581704918,"db-version":"9.4"} diff --git a/test/lib/pgBackRestTest/Common/DefineTest.pm b/test/lib/pgBackRestTest/Common/DefineTest.pm index 34db49c6a..17e67e98d 100644 --- a/test/lib/pgBackRestTest/Common/DefineTest.pm +++ b/test/lib/pgBackRestTest/Common/DefineTest.pm @@ -136,7 +136,7 @@ my $oTestDef = [ { &TESTDEF_NAME => 'unit', - &TESTDEF_TOTAL => 7, + &TESTDEF_TOTAL => 1, }, { &TESTDEF_NAME => 'option', diff --git a/test/lib/pgBackRestTest/Module/Config/ConfigUnitTest.pm b/test/lib/pgBackRestTest/Module/Config/ConfigUnitTest.pm index a6e9dd0a5..4fa3e7906 100644 --- a/test/lib/pgBackRestTest/Module/Config/ConfigUnitTest.pm +++ b/test/lib/pgBackRestTest/Module/Config/ConfigUnitTest.pm @@ -28,10 +28,11 @@ sub run my $oConfig = {}; my $strConfigFile = $self->testPath() . '/pgbackrest.conf'; optionSet(OPTION_CONFIG, $strConfigFile, true); + commandSet(CMD_LOCAL); - if ($self->begin('valid option ' . OPTION_DB_PORT . ' under invalid section')) + if ($self->begin('Config::configFileValidate()')) { - my $oConfig = {}; + $oConfig = {}; $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_DB_PORT} = 1234; $self->testResult(sub {configFileValidate($oConfig)}, false, @@ -40,11 +41,9 @@ sub run "WARN: $strConfigFile valid option '" . OPTION_DB_PORT . "' is a stanza section option and is not valid in" . " section " . CONFIG_SECTION_GLOBAL . "\nHINT: global options can be specified in global or stanza sections but" . " not visa-versa"}); - } - if ($self->begin('valid option ' . OPTION_DB_PORT . ' for command ' . CMD_BACKUP . ' under invalid global section')) - { - my $oConfig = {}; + #--------------------------------------------------------------------------------------------------------------------------- + $oConfig = {}; $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_BACKUP}{&OPTION_DB_PORT} = 1234; $self->testResult(sub {configFileValidate($oConfig)}, false, @@ -53,54 +52,53 @@ sub run "WARN: $strConfigFile valid option '" . OPTION_DB_PORT . "' is a stanza section option and is not valid in" . " section " . CONFIG_SECTION_GLOBAL ."\nHINT: global options can be specified in global or stanza sections but" . " not visa-versa"}); - } - if ($self->begin('valid option ' . OPTION_DB_PORT . ' under invalid stanza section command')) - { - my $oConfig = {}; + #--------------------------------------------------------------------------------------------------------------------------- + $oConfig = {}; $$oConfig{$self->stanza() . ':' . &CMD_ARCHIVE_PUSH}{&OPTION_DB_PORT} = 1234; $self->testResult(sub {configFileValidate($oConfig)}, false, 'valid option ' . OPTION_DB_PORT . ' under invalid stanza section command', {strLogExpect => "WARN: $strConfigFile valid option '" . OPTION_DB_PORT . "' is not valid for command '" . CMD_ARCHIVE_PUSH ."'"}); - } - if ($self->begin('invalid option')) - { - my $oConfig = {}; + #--------------------------------------------------------------------------------------------------------------------------- + $oConfig = {}; $$oConfig{&CONFIG_SECTION_GLOBAL}{&BOGUS} = BOGUS; $self->testResult(sub {configFileValidate($oConfig)}, false, 'invalid option ' . $$oConfig{&CONFIG_SECTION_GLOBAL}{&BOGUS}, {strLogExpect => "WARN: $strConfigFile file contains invalid option '" . BOGUS . "'"}); - } - if ($self->begin('valid alt name')) - { - my $oConfig = {}; + #--------------------------------------------------------------------------------------------------------------------------- + $oConfig = {}; $$oConfig{&CONFIG_SECTION_GLOBAL}{'thread-max'} = 3; $self->testResult(sub {configFileValidate($oConfig)}, true, 'valid alt name found'); - } - if ($self->begin('valid config file')) - { - my $oConfig = {}; + #--------------------------------------------------------------------------------------------------------------------------- + $oConfig = {}; $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_LEVEL_STDERR} = OPTION_DEFAULT_LOG_LEVEL_STDERR; $$oConfig{$self->stanza()}{&OPTION_DB_PATH} = '/db'; $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_ARCHIVE_PUSH}{&OPTION_PROCESS_MAX} = 2; $self->testResult(sub {configFileValidate($oConfig)}, true, 'valid config file'); - } - if ($self->begin('valid unusual section name')) - { - my $oConfig = {}; + #--------------------------------------------------------------------------------------------------------------------------- + $oConfig = {}; $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_LEVEL_STDERR} = OPTION_DEFAULT_LOG_LEVEL_STDERR; $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_ARCHIVE_PUSH}{&OPTION_PROCESS_MAX} = 2; $$oConfig{'unusual-section^name!:' . &CMD_CHECK}{&OPTION_DB_PATH} = '/db'; $self->testResult(sub {configFileValidate($oConfig)}, true, 'valid unusual section name'); + + #--------------------------------------------------------------------------------------------------------------------------- + $oConfig = {}; + $$oConfig{&CONFIG_SECTION_GLOBAL}{&BOGUS} = BOGUS; + + # Change command to indicate remote + commandSet(CMD_REMOTE); + + $self->testResult(sub {configFileValidate($oConfig)}, true, 'invalid option but config file not validated on remote'); } } diff --git a/test/lib/pgBackRestTest/Module/Full/FullSyntheticTest.pm b/test/lib/pgBackRestTest/Module/Full/FullSyntheticTest.pm index a32beca68..837c6f955 100644 --- a/test/lib/pgBackRestTest/Module/Full/FullSyntheticTest.pm +++ b/test/lib/pgBackRestTest/Module/Full/FullSyntheticTest.pm @@ -1135,6 +1135,39 @@ sub run {oLogTest => $self->expect(), bRemote => $bRemote}); } + # Test config file validation + #----------------------------------------------------------------------------------------------------------------------- + if ($bNeutralTest) + { + if ($bRemote) + { + # Save off config file and add an invalid option to the remote (DB master) and confirm no warning thrown + executeTest("cp " . $oHostDbMaster->backrestConfig() . " " . $oHostDbMaster->backrestConfig() . ".save"); + $oHostDbMaster->executeSimple("echo " . BOGUS . "=" . BOGUS . " >> " . $oHostDbMaster->backrestConfig(), undef, + 'root'); + + $strBackup = $oHostBackup->backup( + $strType, 'config file not validated on remote', {oExpectedManifest => \%oManifest, + strOptionalParam => '--log-level-console=detail'}); + + executeTest('sudo rm '. $oHostDbMaster->backrestConfig()); + executeTest("mv " . $oHostDbMaster->backrestConfig() . ".save" . " " . $oHostDbMaster->backrestConfig()); + } + else + { + # Save off config file and add an invalid option to the local backup host and confirm a warning is thrown + executeTest("cp " . $oHostBackup->backrestConfig() . " " . $oHostBackup->backrestConfig() . ".save"); + $oHostBackup->executeSimple("echo " . BOGUS . "=" . BOGUS . " >> " . $oHostBackup->backrestConfig(), undef, 'root'); + + $strBackup = $oHostBackup->backup( + $strType, 'config file warning on local', {oExpectedManifest => \%oManifest, + strOptionalParam => '--log-level-console=detail 2>&1'}); + + executeTest('sudo rm '. $oHostBackup->backrestConfig()); + executeTest("mv " . $oHostBackup->backrestConfig() . ".save" . " " . $oHostBackup->backrestConfig()); + } + } + # Test backup from standby warning that standby not configured so option reset #----------------------------------------------------------------------------------------------------------------------- if (!defined($oHostDbStandby) && $bNeutralTest)