diff --git a/doc/xml/release.xml b/doc/xml/release.xml index 6ce2bdb005..e4ab601406 100644 --- a/doc/xml/release.xml +++ b/doc/xml/release.xml @@ -69,6 +69,14 @@

The {[project-exe]} executable is now a C binary instead of Perl. This allows certain time-critical commands (like async archive-push) to run more quickly.

+ + + + + + +

Improve stanza-create command so that it does not error when the stanza already exists.

+
diff --git a/lib/pgBackRest/Stanza.pm b/lib/pgBackRest/Stanza.pm index ab07263bab..7b30214ea2 100644 --- a/lib/pgBackRest/Stanza.pm +++ b/lib/pgBackRest/Stanza.pm @@ -32,7 +32,7 @@ use pgBackRest::Protocol::Storage::Helper; #################################################################################################################################### # Global variables #################################################################################################################################### -my $strHintForce = "\nHINT: use stanza-create --force to force the stanza data to be created."; +my $strHintForce = "\nHINT: use stanza-create --force to force the stanza data to be recreated."; my $strInfoMissing = " information missing"; my $strStanzaCreateErrorMsg = "not empty"; my $strRepoEncryptedMsg = " and repo is encrypted and info file(s) are missing, --force cannot be used"; @@ -120,6 +120,8 @@ sub stanzaCreate # Assign function parameters, defaults, and log debug info my ($strOperation) = logDebugParam(__PACKAGE__ . '->stanzaCreate'); + my $bContinue = true; + # Get the parent paths (create if not exist) my $strParentPathArchive = $self->parentPathGet(STORAGE_REPO_ARCHIVE); my $strParentPathBackup = $self->parentPathGet(STORAGE_REPO_BACKUP); @@ -136,10 +138,23 @@ sub stanzaCreate my $strBackupInfoFile = &FILE_BACKUP_INFO; my $strArchiveInfoFile = &ARCHIVE_INFO_FILE; - # If .info exists, set to true. Do not include .info.copy + # If .info exists, set to true. my $bBackupInfoFileExists = grep(/^$strBackupInfoFile$/i, @stryFileListBackup); my $bArchiveInfoFileExists = grep(/^$strArchiveInfoFile$/i, @stryFileListArchive); + # If .info does not exist, check for .info.copy + if (!$bBackupInfoFileExists) + { + $strBackupInfoFile .= &INI_COPY_EXT; + $bBackupInfoFileExists = grep(/^$strBackupInfoFile$/i, @stryFileListBackup); + } + + if (!$bArchiveInfoFileExists) + { + $strArchiveInfoFile .= &INI_COPY_EXT; + $bArchiveInfoFileExists = grep(/^$strArchiveInfoFile$/i, @stryFileListArchive); + } + # Determine if a file exists other than the info files my $strExistingFile = $self->existingFileName(STORAGE_REPO_BACKUP, $strParentPathBackup, &FILE_BACKUP_INFO); if (!defined($strExistingFile)) @@ -168,7 +183,6 @@ sub stanzaCreate $self->errorForce('backup' . $strInfoMissing, ERROR_FILE_MISSING, $strExistingFile, $bBackupInfoFileExists, $strParentPathArchive, $strParentPathBackup); } - # If we get here then either both exist or neither exist so if neither file exists and something else exists in the # directories then need to use force option to recreate the missing info files - unless the repo is encrypted, then force # cannot be used if other than the info files exist. If only the info files exist then force must be used to overwrite the @@ -181,26 +195,39 @@ sub stanzaCreate (@stryFileListArchive ? 'archive directory ' : '') . $strStanzaCreateErrorMsg, ERROR_PATH_NOT_EMPTY, $strExistingFile, $bArchiveInfoFileExists, $strParentPathArchive, $strParentPathBackup); + + # If no error was thrown, then do not continue without --force + if (!cfgOption(CFGOPT_FORCE)) + { + $bContinue = false; + } } } - # Instantiate the info objects. Throws an error and aborts if force not used and an error occurs during instantiation. - my $oArchiveInfo = $self->infoObject(STORAGE_REPO_ARCHIVE, $strParentPathArchive, {bRequired => false, bIgnoreMissing => true}); - my $oBackupInfo = $self->infoObject(STORAGE_REPO_BACKUP, $strParentPathBackup, {bRequired => false, bIgnoreMissing => true}); - - # Create the archive info object - my ($iResult, $strResultMessage) = $self->infoFileCreate($oArchiveInfo); + my $iResult = 0; - if ($iResult == 0) + if ($bContinue) { - # Create the backup.info file - ($iResult, $strResultMessage) = $self->infoFileCreate($oBackupInfo); - } + # Instantiate the info objects. Throws an error and aborts if force not used and an error occurs during instantiation. + my $oArchiveInfo = + $self->infoObject(STORAGE_REPO_ARCHIVE, $strParentPathArchive, {bRequired => false, bIgnoreMissing => true}); + my $oBackupInfo = + $self->infoObject(STORAGE_REPO_BACKUP, $strParentPathBackup, {bRequired => false, bIgnoreMissing => true}); - if ($iResult != 0) - { - &log(WARN, "unable to create stanza '" . cfgOption(CFGOPT_STANZA) . "'"); - confess &log(ERROR, $strResultMessage, $iResult); + # Create the archive info object + ($iResult, my $strResultMessage) = $self->infoFileCreate($oArchiveInfo); + + if ($iResult == 0) + { + # Create the backup.info file + ($iResult, $strResultMessage) = $self->infoFileCreate($oBackupInfo); + } + + if ($iResult != 0) + { + &log(WARN, "unable to create stanza '" . cfgOption(CFGOPT_STANZA) . "'"); + confess &log(ERROR, $strResultMessage, $iResult); + } } # Return from function and log return values if any @@ -474,8 +501,8 @@ sub errorForce } elsif (!cfgOption(CFGOPT_FORCE)) { - # If info files exist, check to see if an upgrade is required - if ($bInfoFileExists && !defined($strFileName) && $iErrorCode == ERROR_PATH_NOT_EMPTY) + # If info files exist, check to see if the DB sections match the database - else an upgrade is required + if ($bInfoFileExists && $iErrorCode == ERROR_PATH_NOT_EMPTY) { if ($self->upgradeCheck(new pgBackRest::Backup::Info($strParentPathBackup), STORAGE_REPO_BACKUP, ERROR_BACKUP_MISMATCH) || @@ -485,10 +512,16 @@ sub errorForce confess &log(ERROR, "backup info file or archive info file invalid\n" . 'HINT: use stanza-upgrade if the database has been upgraded or use --force', ERROR_FILE_INVALID); } + else + { + &log(INFO, "stanza-create was already performed"); + } + } + else + { + # If get here something is wrong so indicate force is required + confess &log(ERROR, $strMessage . $strHintForce, $iErrorCode); } - - # If get here just indicate force is required - confess &log(ERROR, $strMessage . $strHintForce, $iErrorCode); } # Return from function and log return values if any diff --git a/test/expect/mock-all-001.log b/test/expect/mock-all-001.log index f7357ecdf6..400570f673 100644 --- a/test/expect/mock-all-001.log +++ b/test/expect/mock-all-001.log @@ -2912,7 +2912,7 @@ stanza-create db - fail on backup directory missing backup.info (db-master host) ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 ERROR: [055]: backup information missing - HINT: use stanza-create --force to force the stanza data to be created. + HINT: use stanza-create --force to force the stanza data to be recreated. P00 INFO: stanza-create command end: aborted with exception [055] + supplemental file: [TEST_PATH]/db-master/repo/archive/db/archive.info diff --git a/test/expect/mock-stanza-001.log b/test/expect/mock-stanza-001.log index 76b8050b86..9d3887f4cc 100644 --- a/test/expect/mock-stanza-001.log +++ b/test/expect/mock-stanza-001.log @@ -57,13 +57,12 @@ db-version="9.3" [db:history] 1={"db-id":1000000000000000093,"db-version":"9.3"} -stanza-create db - fail on rerun of stanza-create - info files exist (db-master host) +stanza-create db - do not fail on rerun of stanza-create - info files exist and DB section ok (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db -P00 ERROR: [040]: backup directory and/or archive directory not empty - HINT: use stanza-create --force to force the stanza data to be created. -P00 INFO: stanza-create command end: aborted with exception [040] +P00 INFO: stanza-create was already performed +P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info --------------------------------------------------------------------- @@ -228,7 +227,7 @@ stanza-create db - fail on archive info file missing from non-empty dir (db-mast ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 ERROR: [055]: archive information missing - HINT: use stanza-create --force to force the stanza data to be created. + HINT: use stanza-create --force to force the stanza data to be recreated. P00 INFO: stanza-create command end: aborted with exception [055] + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -310,46 +309,6 @@ db-version="9.3" [db:history] 1={"db-id":1000000000000000093,"db-version":"9.3"} -stanza-create db - repeat create - error that files exist (db-master host) -> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------- -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db -P00 ERROR: [040]: backup directory and/or archive directory not empty - HINT: use stanza-create --force to force the stanza data to be created. -P00 INFO: stanza-create command end: aborted with exception [040] - -+ supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info ---------------------------------------------------------------------- -[backrest] -backrest-checksum="[CHECKSUM]" -backrest-format=5 -backrest-version="[VERSION-1]" - -[db] -db-catalog-version=201306121 -db-control-version=937 -db-id=1 -db-system-id=1000000000000000093 -db-version="9.3" - -[db:history] -1={"db-catalog-version":201306121,"db-control-version":937,"db-system-id":1000000000000000093,"db-version":"9.3"} - -+ supplemental file: [TEST_PATH]/db-master/repo/archive/db/archive.info ------------------------------------------------------------------------ -[backrest] -backrest-checksum="[CHECKSUM]" -backrest-format=5 -backrest-version="[VERSION-1]" - -[db] -db-id=1 -db-system-id=1000000000000000093 -db-version="9.3" - -[db:history] -1={"db-id":1000000000000000093,"db-version":"9.3"} - stanza-create db - force create archive.info from uncompressed file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ @@ -730,7 +689,7 @@ stanza-create db - fail no force to recreate the stanza from backups (db-master ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 ERROR: [055]: backup information missing - HINT: use stanza-create --force to force the stanza data to be created. + HINT: use stanza-create --force to force the stanza data to be recreated. P00 INFO: stanza-create command end: aborted with exception [055] + supplemental file: [TEST_PATH]/db-master/repo/archive/db/archive.info diff --git a/test/expect/mock-stanza-002.log b/test/expect/mock-stanza-002.log index b5d314a11c..498ea997e9 100644 --- a/test/expect/mock-stanza-002.log +++ b/test/expect/mock-stanza-002.log @@ -63,13 +63,12 @@ db-version="9.3" [db:history] 1={"db-id":1000000000000000093,"db-version":"9.3"} -stanza-create db - fail on rerun of stanza-create - info files exist (backup host) +stanza-create db - do not fail on rerun of stanza-create - info files exist and DB section ok (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --compress-level-network=1 --config=[TEST_PATH]/backup/pgbackrest.conf --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-cipher-pass= --repo-cipher-type=aes-256-cbc --repo-path=[TEST_PATH]/backup/repo --stanza=db -P00 ERROR: [040]: backup directory and/or archive directory not empty - HINT: use stanza-create --force to force the stanza data to be created. -P00 INFO: stanza-create command end: aborted with exception [040] +P00 INFO: stanza-create was already performed +P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info ------------------------------------------------------------------ @@ -293,33 +292,6 @@ db-version="9.3" [db:history] 1={"db-catalog-version":201306121,"db-control-version":937,"db-system-id":1000000000000000093,"db-version":"9.3"} -stanza-create db - repeat create - error that files exist (backup host) -> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------- -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --compress-level-network=1 --config=[TEST_PATH]/backup/pgbackrest.conf --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-cipher-pass= --repo-cipher-type=aes-256-cbc --repo-path=[TEST_PATH]/backup/repo --stanza=db -P00 ERROR: [055]: archive information missing and repo is encrypted and info file(s) are missing, --force cannot be used -P00 INFO: stanza-create command end: aborted with exception [055] - -+ supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info ------------------------------------------------------------------- -[backrest] -backrest-checksum="[CHECKSUM]" -backrest-format=5 -backrest-version="[VERSION-1]" - -[cipher] -cipher-pass=[CIPHER-PASS-1] - -[db] -db-catalog-version=201306121 -db-control-version=937 -db-id=1 -db-system-id=1000000000000000093 -db-version="9.3" - -[db:history] -1={"db-catalog-version":201306121,"db-control-version":937,"db-system-id":1000000000000000093,"db-version":"9.3"} - > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: archive-push command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-2] --compress-level=3 --compress-level-network=1 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db diff --git a/test/expect/mock-stanza-003.log b/test/expect/mock-stanza-003.log index ad52829dbc..afdc6d116c 100644 --- a/test/expect/mock-stanza-003.log +++ b/test/expect/mock-stanza-003.log @@ -57,13 +57,12 @@ db-version="9.3" [db:history] 1={"db-id":1000000000000000093,"db-version":"9.3"} -stanza-create db - fail on rerun of stanza-create - info files exist (db-master host) +stanza-create db - do not fail on rerun of stanza-create - info files exist and DB section ok (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-key= --repo-s3-key-secret= --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db -P00 ERROR: [040]: backup directory and/or archive directory not empty - HINT: use stanza-create --force to force the stanza data to be created. -P00 INFO: stanza-create command end: aborted with exception [040] +P00 INFO: stanza-create was already performed +P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info ------------------------------------------- @@ -228,7 +227,7 @@ stanza-create db - fail on archive info file missing from non-empty dir (db-mast ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-key= --repo-s3-key-secret= --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 ERROR: [055]: archive information missing - HINT: use stanza-create --force to force the stanza data to be created. + HINT: use stanza-create --force to force the stanza data to be recreated. P00 INFO: stanza-create command end: aborted with exception [055] + supplemental file: /backup/db/backup.info @@ -286,46 +285,6 @@ db-version="9.3" [db:history] 1={"db-id":1000000000000000093,"db-version":"9.3"} -stanza-create db - repeat create - error that files exist (db-master host) -> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------- -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-key= --repo-s3-key-secret= --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db -P00 ERROR: [040]: backup directory and/or archive directory not empty - HINT: use stanza-create --force to force the stanza data to be created. -P00 INFO: stanza-create command end: aborted with exception [040] - -+ supplemental file: /backup/db/backup.info -------------------------------------------- -[backrest] -backrest-checksum="[CHECKSUM]" -backrest-format=5 -backrest-version="[VERSION-1]" - -[db] -db-catalog-version=201306121 -db-control-version=937 -db-id=1 -db-system-id=1000000000000000093 -db-version="9.3" - -[db:history] -1={"db-catalog-version":201306121,"db-control-version":937,"db-system-id":1000000000000000093,"db-version":"9.3"} - -+ supplemental file: /archive/db/archive.info ---------------------------------------------- -[backrest] -backrest-checksum="[CHECKSUM]" -backrest-format=5 -backrest-version="[VERSION-1]" - -[db] -db-id=1 -db-system-id=1000000000000000093 -db-version="9.3" - -[db:history] -1={"db-id":1000000000000000093,"db-version":"9.3"} - stanza-create db - force create archive.info from uncompressed file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ @@ -712,7 +671,7 @@ stanza-create db - fail no force to recreate the stanza from backups (db-master ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: stanza-create command begin [BACKREST-VERSION]: --compress-level=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-key= --repo-s3-key-secret= --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 ERROR: [055]: backup information missing - HINT: use stanza-create --force to force the stanza data to be created. + HINT: use stanza-create --force to force the stanza data to be recreated. P00 INFO: stanza-create command end: aborted with exception [055] + supplemental file: /archive/db/archive.info diff --git a/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm b/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm index 6b849406c5..6b0bead156 100644 --- a/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm +++ b/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm @@ -81,11 +81,11 @@ sub run #-------------------------------------------------------------------------------------------------------------------------- $oHostBackup->stanzaCreate('successfully create the stanza', {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); - # Rerun stanza-create and confirm failure - need use force since archive.info and backup.info exist + # Rerun stanza-create and confirm it does not fail #-------------------------------------------------------------------------------------------------------------------------- $oHostBackup->stanzaCreate( - 'fail on rerun of stanza-create - info files exist', - {iExpectedExitStatus => ERROR_PATH_NOT_EMPTY, strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); + 'do not fail on rerun of stanza-create - info files exist and DB section ok', + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Stanza Create fails when not using force - database mismatch with pg_control file #-------------------------------------------------------------------------------------------------------------------------- @@ -130,7 +130,6 @@ sub run if (!$bRepoEncrypt) { - $oHostBackup->stanzaCreate('fail on archive info file missing from non-empty dir', {iExpectedExitStatus => ERROR_FILE_MISSING, strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); } @@ -165,10 +164,10 @@ sub run {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE), iExpectedExitStatus => $bRepoEncrypt ? ERROR_FILE_MISSING : undef}); - # Rerun without the force to ensure the files exist - $oHostBackup->stanzaCreate('repeat create - error that files exist', - {iExpectedExitStatus => $bRepoEncrypt ? ERROR_FILE_MISSING : ERROR_PATH_NOT_EMPTY, - strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); + if (!$bRepoEncrypt) + { + $self->testResult(sub {storageRepo()->exists($strArchiveInfoFile)}, true, " archive.info file was created"); + } # Stanza Create succeeds when using force - recreates archive.info from uncompressed archive file #-------------------------------------------------------------------------------------------------------------------------- diff --git a/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm b/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm index 82c3205607..43862348c4 100644 --- a/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm +++ b/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm @@ -136,21 +136,21 @@ sub run storageRepo()->pathCreate(STORAGE_REPO_ARCHIVE . "/9.4-1"); $self->testException(sub {$oStanza->stanzaCreate()}, ERROR_PATH_NOT_EMPTY, "archive directory not empty" . - "\nHINT: use stanza-create --force to force the stanza data to be created."); + "\nHINT: use stanza-create --force to force the stanza data to be recreated."); # No force. Archive dir not empty. No archive.info file. Backup directory not empty. No backup.info file. #--------------------------------------------------------------------------------------------------------------------------- storageRepo()->pathCreate(STORAGE_REPO_BACKUP . "/12345"); $self->testException(sub {$oStanza->stanzaCreate()}, ERROR_PATH_NOT_EMPTY, "backup directory and/or archive directory not empty" . - "\nHINT: use stanza-create --force to force the stanza data to be created."); + "\nHINT: use stanza-create --force to force the stanza data to be recreated."); # No force. Archive dir empty. No archive.info file. Backup directory not empty. No backup.info file. #--------------------------------------------------------------------------------------------------------------------------- forceStorageRemove(storageRepo(), STORAGE_REPO_ARCHIVE . "/9.4-1", {bRecurse => true}); $self->testException(sub {$oStanza->stanzaCreate()}, ERROR_PATH_NOT_EMPTY, "backup directory not empty" . - "\nHINT: use stanza-create --force to force the stanza data to be created."); + "\nHINT: use stanza-create --force to force the stanza data to be recreated."); # No force. No archive.info file and no archive sub-directories or files. Backup.info exists and no backup sub-directories # or files @@ -160,17 +160,35 @@ sub run $self->dbSysId(PG_VERSION_94), $iDbControl, $iDbCatalog, true); $self->testException(sub {$oStanza->stanzaCreate()}, ERROR_FILE_MISSING, "archive information missing" . - "\nHINT: use stanza-create --force to force the stanza data to be created."); + "\nHINT: use stanza-create --force to force the stanza data to be recreated."); # No force. No backup.info file (backup.info.copy only) and no backup sub-directories or files. Archive.info exists and no # archive sub-directories or files #--------------------------------------------------------------------------------------------------------------------------- forceStorageRemove(storageRepo(), STORAGE_REPO_BACKUP . qw{/} . FILE_BACKUP_INFO); + (new pgBackRest::Archive::Info($self->{strArchivePath}, false, {bIgnoreMissing => true}))->create(PG_VERSION_94, + $self->dbSysId(PG_VERSION_94), true); + $self->testResult(sub {$oStanza->stanzaCreate()}, 0, + "no error on missing backup.info since backup.info.copy exists and DB section OK"); + + # No force. No backup.info file (backup.info.copy only) and no backup sub-directories or files. No archive.info file + # (archive.info.copy only) and no archive sub-directories or files + #--------------------------------------------------------------------------------------------------------------------------- + forceStorageRemove(storageRepo(), STORAGE_REPO_ARCHIVE . qw{/} . ARCHIVE_INFO_FILE); + (new pgBackRest::Archive::Info($self->{strArchivePath}, false, {bIgnoreMissing => true}))->create(PG_VERSION_94, + $self->dbSysId(PG_VERSION_94), true); + $self->testResult(sub {$oStanza->stanzaCreate()}, 0, + "no error on missing archive.info since archive.info.copy exists and DB section OK"); + + # No force. No backup.info files and no backup sub-directories or files. Archive.info exists and no + # archive sub-directories or files + #--------------------------------------------------------------------------------------------------------------------------- + forceStorageRemove(storageRepo(), STORAGE_REPO_BACKUP . qw{/} . FILE_BACKUP_INFO . INI_COPY_EXT); (new pgBackRest::Archive::Info($self->{strArchivePath}, false, {bIgnoreMissing => true}))->create(PG_VERSION_94, $self->dbSysId(PG_VERSION_94), true); $self->testException(sub {$oStanza->stanzaCreate()}, ERROR_FILE_MISSING, "backup information missing" . - "\nHINT: use stanza-create --force to force the stanza data to be created."); + "\nHINT: use stanza-create --force to force the stanza data to be recreated."); # No force. archive.info DB mismatch. backup.info correct DB. #--------------------------------------------------------------------------------------------------------------------------- @@ -201,16 +219,14 @@ sub run # No force with .info and .info.copy files already existing #-------------------------------------------------------------------------------------------------------------------------- - $self->testException(sub {$oStanza->stanzaCreate()}, ERROR_PATH_NOT_EMPTY, - "backup directory and/or archive directory not empty" . - "\nHINT: use stanza-create --force to force the stanza data to be created."); + $self->testResult(sub {$oStanza->stanzaCreate()}, 0, + "info files exist and check out ok - stanza create not needed"); - # No force. Remove only backup.info.copy file - confirm stanza create still throws an error since force was not used + # No force. Remove only backup.info.copy file - confirm stanza create does not throw an error since copy is still valid #--------------------------------------------------------------------------------------------------------------------------- forceStorageRemove(storageRepo(), $strBackupInfoFileCopy); - $self->testException(sub {$oStanza->stanzaCreate()}, ERROR_PATH_NOT_EMPTY, - "backup directory and/or archive directory not empty" . - "\nHINT: use stanza-create --force to force the stanza data to be created."); + $self->testResult(sub {$oStanza->stanzaCreate()}, 0, + "info.copy file exists and check out ok - stanza create not needed"); # Force on. Valid archive.info exists. Invalid backup.info exists. #--------------------------------------------------------------------------------------------------------------------------- @@ -222,6 +238,7 @@ sub run $self->dbSysId(PG_VERSION_93), $iDbControl, $iDbCatalog, true); $self->testResult(sub {$oStanza->stanzaCreate()}, 0, 'successfully created stanza with force and existing info files'); + $self->testResult(sub {(new pgBackRest::Backup::Info($self->{strBackupPath}))->check(PG_VERSION_94, $iDbControl, $iDbCatalog, $self->dbSysId(PG_VERSION_94))}, 2, ' backup.info reconstructed'); @@ -446,7 +463,7 @@ sub run storageRepo()->pathGet(STORAGE_REPO_BACKUP . qw{/} . FILE_BACKUP_INFO) . " does not exist and is required to perform a backup." . "\nHINT: has a stanza-create been performed?" . - "\nHINT: use stanza-create --force to force the stanza data to be created."); + "\nHINT: use stanza-create --force to force the stanza data to be recreated."); # Force. #--------------------------------------------------------------------------------------------------------------------------- @@ -655,7 +672,7 @@ sub run my $oStanza = new pgBackRest::Stanza(); my $strMessage = "archive information missing" . - "\nHINT: use stanza-create --force to force the stanza data to be created."; + "\nHINT: use stanza-create --force to force the stanza data to be recreated."; $self->testException(sub {$oStanza->errorForce($strMessage, ERROR_FILE_MISSING, undef, true, $self->{strArchivePath}, $self->{strBackupPath})}, ERROR_FILE_MISSING, $strMessage);