From 0e9ba98a50159fc1f26792f9032603fae0aed24c Mon Sep 17 00:00:00 2001 From: Cynthia Shang Date: Wed, 3 Jan 2018 12:23:33 -0500 Subject: [PATCH] Add stanza-delete command to cleanup unused stanzas. Contributed by Cynthia Shang. --- build/lib/pgBackRestBuild/Config/Data.pm | 32 +++++ doc/lib/BackRestDoc/Common/DocRender.pm | 4 +- doc/xml/reference.xml | 35 +++++ doc/xml/release.xml | 8 ++ doc/xml/user-guide.xml | 47 ++++-- lib/pgBackRest/Common/Lock.pm | 43 ++++-- lib/pgBackRest/Config/ConfigHelpData.pm | 72 ++++++++++ lib/pgBackRest/Main.pm | 18 +++ lib/pgBackRest/Stanza.pm | 96 ++++++++++++- libc/lib/pgBackRest/LibCAuto.pm | 1 + libc/xs/config/config.auto.xsh | 1 + src/config/config.auto.c | 5 + src/config/config.auto.h | 3 +- src/config/define.auto.c | 53 +++++++ src/config/define.auto.h | 1 + test/expect/help-help-001.log | 1 + test/expect/mock-all-001.log | 14 ++ test/expect/mock-all-002.log | 19 +++ test/expect/mock-archive-001.log | 4 + test/expect/mock-archive-002.log | 4 + test/expect/mock-stanza-001.log | 50 +++++++ test/expect/mock-stanza-002.log | 50 +++++++ test/expect/mock-stanza-003.log | 48 +++++++ test/lib/pgBackRestTest/Common/DefineTest.pm | 2 +- .../pgBackRestTest/Env/Host/HostBackupTest.pm | 49 +++++++ .../Module/Mock/MockStanzaTest.pm | 7 + .../Module/Stanza/StanzaAllTest.pm | 135 ++++++++++++++++++ 27 files changed, 776 insertions(+), 26 deletions(-) diff --git a/build/lib/pgBackRestBuild/Config/Data.pm b/build/lib/pgBackRestBuild/Config/Data.pm index 8d07a7174..ed459eb29 100644 --- a/build/lib/pgBackRestBuild/Config/Data.pm +++ b/build/lib/pgBackRestBuild/Config/Data.pm @@ -91,6 +91,8 @@ use constant CFGCMD_RESTORE => 'restore' push @EXPORT, qw(CFGCMD_RESTORE); use constant CFGCMD_STANZA_CREATE => 'stanza-create'; push @EXPORT, qw(CFGCMD_STANZA_CREATE); +use constant CFGCMD_STANZA_DELETE => 'stanza-delete'; + push @EXPORT, qw(CFGCMD_STANZA_DELETE); use constant CFGCMD_STANZA_UPGRADE => 'stanza-upgrade'; push @EXPORT, qw(CFGCMD_STANZA_UPGRADE); use constant CFGCMD_START => 'start'; @@ -494,6 +496,7 @@ my %hConfigDefine = &CFGCMD_REMOTE => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -537,6 +540,11 @@ my %hConfigDefine = &CFGDEF_DEFAULT => false, }, + &CFGCMD_STANZA_DELETE => + { + &CFGDEF_DEFAULT => false, + }, + &CFGCMD_STOP => { &CFGDEF_DEFAULT => false @@ -591,6 +599,7 @@ my %hConfigDefine = }, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => { @@ -886,6 +895,7 @@ my %hConfigDefine = &CFGCMD_REMOTE => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, } }, @@ -905,6 +915,7 @@ my %hConfigDefine = &CFGCMD_LOCAL => {}, &CFGCMD_REMOTE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, } }, @@ -940,6 +951,7 @@ my %hConfigDefine = &CFGCMD_REMOTE => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, } }, @@ -961,6 +973,7 @@ my %hConfigDefine = &CFGCMD_REMOTE => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, } }, @@ -981,6 +994,7 @@ my %hConfigDefine = &CFGCMD_REMOTE => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1003,6 +1017,7 @@ my %hConfigDefine = &CFGCMD_LOCAL => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1025,6 +1040,7 @@ my %hConfigDefine = &CFGCMD_REMOTE => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1048,6 +1064,7 @@ my %hConfigDefine = &CFGCMD_REMOTE => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1095,6 +1112,7 @@ my %hConfigDefine = &CFGCMD_REMOTE => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, } }, @@ -1143,6 +1161,7 @@ my %hConfigDefine = &CFGCMD_REMOTE => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1225,6 +1244,7 @@ my %hConfigDefine = &CFGCMD_REMOTE => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1289,6 +1309,7 @@ my %hConfigDefine = &CFGCMD_INFO => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1437,6 +1458,10 @@ my %hConfigDefine = &CFGCMD_LOCAL => {}, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => + { + &CFGDEF_INTERNAL => true, + }, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1701,6 +1726,7 @@ my %hConfigDefine = &CFGCMD_EXPIRE => {}, &CFGCMD_LOCAL => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1724,6 +1750,7 @@ my %hConfigDefine = &CFGCMD_EXPIRE => {}, &CFGCMD_LOCAL => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1752,6 +1779,7 @@ my %hConfigDefine = &CFGDEF_INTERNAL => true, }, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, &CFGCMD_START => {}, &CFGCMD_STOP => {}, @@ -1786,6 +1814,7 @@ my %hConfigDefine = }, &CFGCMD_RESTORE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, }, }, @@ -1802,6 +1831,7 @@ my %hConfigDefine = &CFGCMD_CHECK => {}, &CFGCMD_REMOTE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, } }, @@ -1832,6 +1862,7 @@ my %hConfigDefine = &CFGCMD_LOCAL => {}, &CFGCMD_REMOTE => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, } }, @@ -1848,6 +1879,7 @@ my %hConfigDefine = &CFGCMD_CHECK => {}, &CFGCMD_LOCAL => {}, &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_DELETE => {}, &CFGCMD_STANZA_UPGRADE => {}, }, &CFGDEF_REQUIRED => false, diff --git a/doc/lib/BackRestDoc/Common/DocRender.pm b/doc/lib/BackRestDoc/Common/DocRender.pm index 84afe61c3..f43004b4d 100644 --- a/doc/lib/BackRestDoc/Common/DocRender.pm +++ b/doc/lib/BackRestDoc/Common/DocRender.pm @@ -86,9 +86,9 @@ my $oRenderTag = 'b' => ['\textbf{', '}'], 'i' => ['\textit{', '}'], # 'bi' => ['', ''], - # 'ul' => ["\n", "\n"], + 'ul' => ["\\begin{itemize}\n", "\\end{itemize}\n"], # 'ol' => ["\n", "\n"], - # 'li' => ['* ', "\n"], + 'li' => ['\item ', "\n"], 'id' => ['\textnormal{\texttt{', '}}'], 'host' => ['\textnormal{\textbf{', '}}'], 'file' => ['\textnormal{\texttt{', '}}'], diff --git a/doc/xml/reference.xml b/doc/xml/reference.xml index cd2eafe92..38c3cf5eb 100644 --- a/doc/xml/reference.xml +++ b/doc/xml/reference.xml @@ -1201,6 +1201,41 @@ + + + + Delete a stanza. + + The stanza-delete command removes data in the repository associated with a stanza. Use this command with caution — it will permanently remove all backups and archives from the repository for the specified stanza. + + To delete a stanza: +
    +
  • Shut down the cluster associated with the stanza (or use --force to override).
  • +
  • Run the stop command on the backup host (the host where the repository is mounted).
  • +
  • Run the stanza-delete command on the backup host.
  • +
Once the command successfully completes, it is the responsibility of the user to remove the stanza from all configuration files.
+ + + + + + + + + + {[backrest-exe]} --stanza=db stanza-delete + + + Delete the db stanza repository. + + +
diff --git a/doc/xml/release.xml b/doc/xml/release.xml index f54413ab2..0f737d605 100644 --- a/doc/xml/release.xml +++ b/doc/xml/release.xml @@ -13,6 +13,14 @@ + + + + + +

Add stanza-delete command to cleanup unused stanzas.

+
+

Allow any non-boolean, non-command-line option to be negated. This allows specific options in pgbackrest.conf to be ignored (and set to default) which reduces the need to write new configuration files for specific needs. Note that boolean, non-command-line options are already negatable.

diff --git a/doc/xml/user-guide.xml b/doc/xml/user-guide.xml index 4b714d314..a9e6b46a3 100644 --- a/doc/xml/user-guide.xml +++ b/doc/xml/user-guide.xml @@ -1557,6 +1557,43 @@ + +
+ Delete a Stanza + + + + + Stop <postgres/> cluster to be removed + + + {[db-cluster-stop]} + + + + + Stop <backrest/> for the stanza + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-log-level-console=info stop + completed successfully + + + + + Delete the stanza + + + {[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-log-level-console=info stanza-delete + completed successfully + + + + {[db-cluster-start]} + + +
+
Dedicated Backup Host @@ -1664,16 +1701,6 @@ n -

The repository directory will also be removed from the database host. It will not be used anymore so leaving it around may be confusing later on.

- - - Remove repository now that it will be located on the backup host server - - - find {[backrest-repo-path]} -delete - - -

Commands are run the same as on a single host configuration except that some commands such as backup and expire are run from the backup host instead of the database host.

Create the stanza in the new repository.

diff --git a/lib/pgBackRest/Common/Lock.pm b/lib/pgBackRest/Common/Lock.pm index b7a72049c..8057a18b3 100644 --- a/lib/pgBackRest/Common/Lock.pm +++ b/lib/pgBackRest/Common/Lock.pm @@ -282,7 +282,18 @@ push @EXPORT, qw(lockStop); sub lockStopTest { # Assign function parameters, defaults, and log debug info - my ($strOperation) = logDebugParam(__PACKAGE__ . '::lockStopTest'); + my + ( + $strOperation, + $bStanzaStopRequired, + ) = + logDebugParam + ( + __PACKAGE__ . '::lockStopTest', \@_, + {name => 'bStanzaStopRequired', optional => true, default => false} + ); + + my $bStopExists = false; # Check the stanza first if it is specified if (cfgOptionTest(CFGOPT_STANZA)) @@ -292,20 +303,36 @@ sub lockStopTest if (-e $strStopFile) { - confess &log(ERROR, 'stop file exists for stanza ' . cfgOption(CFGOPT_STANZA), ERROR_STOP); + # If the stop file exists and is required then set the flag to true + if ($bStanzaStopRequired) + { + $bStopExists = true; + } + else + { + confess &log(ERROR, 'stop file exists for stanza ' . cfgOption(CFGOPT_STANZA), ERROR_STOP); + } } } - # Now check all stanzas - my $strStopFile = lockStopFileName(); - - if (-e $strStopFile) + # If not looking for a specific stanza stop file, then check all stanzas + if (!$bStanzaStopRequired) { - confess &log(ERROR, 'stop file exists for all stanzas', ERROR_STOP); + # Now check all stanzas + my $strStopFile = lockStopFileName(); + + if (-e $strStopFile) + { + confess &log(ERROR, 'stop file exists for all stanzas', ERROR_STOP); + } } # Return from function and log return values if any - logDebugReturn($strOperation); + return logDebugReturn + ( + $strOperation, + {name => 'bStopExists', value => $bStopExists} + ); } push @EXPORT, qw(lockStopTest); diff --git a/lib/pgBackRest/Config/ConfigHelpData.pm b/lib/pgBackRest/Config/ConfigHelpData.pm index c0128ccf4..a36dd2638 100644 --- a/lib/pgBackRest/Config/ConfigHelpData.pm +++ b/lib/pgBackRest/Config/ConfigHelpData.pm @@ -1608,6 +1608,78 @@ my $oConfigHelpData = } }, + # STANZA-DELETE Command Help + #--------------------------------------------------------------------------------------------------------------------------- + 'stanza-delete' => + { + summary => + "Delete a stanza.", + description => + "The stanza-delete command removes data in the repository associated with a stanza. Use this command with " . + "caution — it will permanently remove all backups and archives from the pgBackRest repository for the " . + "specified stanza.\n" . + "\n" . + "To delete a stanza:\n" . + "\n" . + "* Shut down the PostgreSQL cluster associated with the stanza (or use --force to override).\n" . + "* Run the stop command on the backup host (the host where the repository is mounted).\n" . + "* Run the stanza-delete command on the backup host.\n" . + "\n" . + "Once the command successfully completes, it is the responsibility of the user to remove the stanza from all " . + "pgBackRest configuration files.", + + option => + { + 'buffer-size' => 'section', + 'cmd-ssh' => 'section', + 'compress-level' => 'section', + 'compress-level-network' => 'section', + 'config' => 'default', + 'db-cmd' => 'section', + 'db-config' => 'section', + 'db-host' => 'section', + 'db-path' => 'section', + 'db-port' => 'section', + 'db-socket-path' => 'section', + 'db-ssh-port' => 'section', + 'db-timeout' => 'section', + 'db-user' => 'section', + + # FORCE Option Help + #------------------------------------------------------------------------------------------------------------------- + 'force' => + { + summary => + "Force stanza delete.", + description => + "If PostgreSQL is still running for the stanza, then this option can be used to force the stanza to be " . + "deleted from the repository." + }, + + 'lock-path' => 'section', + 'log-level-console' => 'section', + 'log-level-file' => 'section', + 'log-path' => 'section', + 'log-timestamp' => 'section', + 'neutral-umask' => 'section', + 'protocol-timeout' => 'section', + 'repo-cipher-pass' => 'section', + 'repo-cipher-type' => 'section', + 'repo-path' => 'section', + 'repo-s3-bucket' => 'section', + 'repo-s3-ca-file' => 'section', + 'repo-s3-ca-path' => 'section', + 'repo-s3-endpoint' => 'section', + 'repo-s3-host' => 'section', + 'repo-s3-key' => 'section', + 'repo-s3-key-secret' => 'section', + 'repo-s3-region' => 'section', + 'repo-s3-verify-ssl' => 'section', + 'repo-type' => 'section', + 'stanza' => 'default' + } + }, + # STANZA-UPGRADE Command Help #--------------------------------------------------------------------------------------------------------------------------- 'stanza-upgrade' => diff --git a/lib/pgBackRest/Main.pm b/lib/pgBackRest/Main.pm index 41e27fb87..dc4423dfd 100644 --- a/lib/pgBackRest/Main.pm +++ b/lib/pgBackRest/Main.pm @@ -192,6 +192,24 @@ sub main exitSafe(new pgBackRest::Info()->process()); } + ############################################################################################################################ + # Process stanza-delete command + ############################################################################################################################ + if (cfgCommandTest(CFGCMD_STANZA_DELETE)) + { + if (!isRepoLocal()) + { + confess &log(ERROR, + cfgCommandName(cfgCommandGet()) . ' command must be run on the backup host', ERROR_HOST_INVALID); + } + + # Load module dynamically + require pgBackRest::Stanza; + pgBackRest::Stanza->import(); + + exitSafe(new pgBackRest::Stanza()->process()); + } + ############################################################################################################################ # Acquire the command lock ############################################################################################################################ diff --git a/lib/pgBackRest/Stanza.pm b/lib/pgBackRest/Stanza.pm index d6cad6558..ab07263ba 100644 --- a/lib/pgBackRest/Stanza.pm +++ b/lib/pgBackRest/Stanza.pm @@ -13,8 +13,11 @@ use English '-no_match_vars'; use Exporter qw(import); our @EXPORT = qw(); +use pgBackRest::Backup::Common; use pgBackRest::Common::Cipher; use pgBackRest::Common::Exception; +use pgBackRest::Common::Ini; +use pgBackRest::Common::Lock; use pgBackRest::Common::Log; use pgBackRest::Config::Config; use pgBackRest::Archive::Info; @@ -22,6 +25,7 @@ use pgBackRest::Backup::Info; use pgBackRest::Db; use pgBackRest::DbVersion; use pgBackRest::InfoCommon; +use pgBackRest::Manifest; use pgBackRest::Protocol::Helper; use pgBackRest::Protocol::Storage::Helper; @@ -48,9 +52,12 @@ sub new # Assign function parameters, defaults, and log debug info my $strOperation = logDebugParam(__PACKAGE__ . '->new'); - # Initialize the database object - ($self->{oDb}) = dbObjectGet(); - $self->dbInfoGet(); + # Initialize the database object if not performing a stanza-delete + if (!cfgCommandTest(CFGCMD_STANZA_DELETE)) + { + ($self->{oDb}) = dbObjectGet(); + $self->dbInfoGet(); + } # Return from function and log return values if any return logDebugReturn @@ -82,6 +89,11 @@ sub process { $iResult = $self->stanzaUpgrade(); } + # Process stanza delete + elsif (cfgCommandTest(CFGCMD_STANZA_DELETE)) + { + $iResult = $self->stanzaDelete(); + } # Else error if any other command is found else { @@ -251,6 +263,82 @@ sub stanzaUpgrade ); } +#################################################################################################################################### +# stanzaDelete +# +# Delete a stanza. The stop file must exist and the db must be offline unless --force is used. +#################################################################################################################################### +sub stanzaDelete +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my ($strOperation) = logDebugParam(__PACKAGE__ . '->stanzaDelete'); + + my $strStanza = cfgOption(CFGOPT_STANZA); + my $oStorageRepo = storageRepo({strStanza => $strStanza}); + + # If at least an archive or backup directory exists for the stanza, then continue, else nothing to do + if ($oStorageRepo->pathExists(STORAGE_REPO_ARCHIVE) || $oStorageRepo->pathExists(STORAGE_REPO_BACKUP)) + { + # If the stop file does not exist, then error + if (!lockStopTest({bStanzaStopRequired => true})) + { + confess &log(ERROR, "stop file does not exist for stanza '${strStanza}'" . + "\nHINT: has the pgbackrest stop command been run on this server?", ERROR_FILE_MISSING); + } + + # Get the master database object and index + my ($oDbMaster, $iMasterRemoteIdx) = dbObjectGet({bMasterOnly => true}); + + # Initialize the master file object and path + my $oStorageDbMaster = storageDb({iRemoteIdx => $iMasterRemoteIdx}); + + # Check if Postgres is running and if so only continue when forced + if ($oStorageDbMaster->exists(DB_FILE_POSTMASTERPID) && !cfgOption(CFGOPT_FORCE)) + { + confess &log(ERROR, DB_FILE_POSTMASTERPID . " exists - looks like the postmaster is running. " . + "To delete stanza '${strStanza}', shutdown the postmaster for stanza '${strStanza}' and try again, " . + "or use --force.", ERROR_POSTMASTER_RUNNING); + } + + # Delete the archive info files + $oStorageRepo->remove(STORAGE_REPO_ARCHIVE . '/' . ARCHIVE_INFO_FILE, {bIgnoreMissing => true}); + $oStorageRepo->remove(STORAGE_REPO_ARCHIVE . '/' . ARCHIVE_INFO_FILE . INI_COPY_EXT, {bIgnoreMissing => true}); + + # Delete the backup info files + $oStorageRepo->remove(STORAGE_REPO_BACKUP . '/' . FILE_BACKUP_INFO, {bIgnoreMissing => true}); + $oStorageRepo->remove(STORAGE_REPO_BACKUP . '/' . FILE_BACKUP_INFO . INI_COPY_EXT, {bIgnoreMissing => true}); + + # Invalidate the backups by removing the manifest files + foreach my $strBackup ($oStorageRepo->list( + STORAGE_REPO_BACKUP, {strExpression => backupRegExpGet(true, true, true), strSortOrder => 'reverse', + bIgnoreMissing => true})) + { + $oStorageRepo->remove(STORAGE_REPO_BACKUP . "/${strBackup}/" . FILE_MANIFEST, {bIgnoreMissing => true}); + $oStorageRepo->remove(STORAGE_REPO_BACKUP . "/${strBackup}/" . FILE_MANIFEST_COPY, {bIgnoreMissing => true}); + } + + # Recursively remove the stanza archive and backup directories + $oStorageRepo->remove(STORAGE_REPO_ARCHIVE, {bRecurse => true, bIgnoreMissing => true}); + $oStorageRepo->remove(STORAGE_REPO_BACKUP, {bRecurse => true, bIgnoreMissing => true}); + + # Remove the stop file so processes can run. + lockStart(); + } + else + { + &log(INFO, "stanza ${strStanza} already deleted"); + } + + # Return from function and log return values if any + return logDebugReturn + ( + $strOperation, + {name => 'iResult', value => 0, trace => true} + ); +} + #################################################################################################################################### # parentPathGet # @@ -338,7 +426,7 @@ sub existingFileName #################################################################################################################################### # errorForce # -# Creates the parent path if it doesn't exist and returns the path. +# Determines based on encryption or not and errors when force is required but not set. #################################################################################################################################### sub errorForce { diff --git a/libc/lib/pgBackRest/LibCAuto.pm b/libc/lib/pgBackRest/LibCAuto.pm index 7fc2842e6..796765f59 100644 --- a/libc/lib/pgBackRest/LibCAuto.pm +++ b/libc/lib/pgBackRest/LibCAuto.pm @@ -110,6 +110,7 @@ sub libcAutoExportTag 'CFGCMD_REMOTE', 'CFGCMD_RESTORE', 'CFGCMD_STANZA_CREATE', + 'CFGCMD_STANZA_DELETE', 'CFGCMD_STANZA_UPGRADE', 'CFGCMD_START', 'CFGCMD_STOP', diff --git a/libc/xs/config/config.auto.xsh b/libc/xs/config/config.auto.xsh index 87a6ff361..7f525b17a 100644 --- a/libc/xs/config/config.auto.xsh +++ b/libc/xs/config/config.auto.xsh @@ -20,6 +20,7 @@ Command constants #define CFGCMD_REMOTE cfgCmdRemote #define CFGCMD_RESTORE cfgCmdRestore #define CFGCMD_STANZA_CREATE cfgCmdStanzaCreate +#define CFGCMD_STANZA_DELETE cfgCmdStanzaDelete #define CFGCMD_STANZA_UPGRADE cfgCmdStanzaUpgrade #define CFGCMD_START cfgCmdStart #define CFGCMD_STOP cfgCmdStop diff --git a/src/config/config.auto.c b/src/config/config.auto.c index 1a69f4490..ef8a270b6 100644 --- a/src/config/config.auto.c +++ b/src/config/config.auto.c @@ -64,6 +64,11 @@ ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_LIST CONFIG_COMMAND_NAME("stanza-create") ) + CONFIG_COMMAND + ( + CONFIG_COMMAND_NAME("stanza-delete") + ) + CONFIG_COMMAND ( CONFIG_COMMAND_NAME("stanza-upgrade") diff --git a/src/config/config.auto.h b/src/config/config.auto.h index 8c082f8fd..2846d4a82 100644 --- a/src/config/config.auto.h +++ b/src/config/config.auto.h @@ -9,7 +9,7 @@ Automatically generated by Build.pm -- do not modify directly. /*********************************************************************************************************************************** Command constants ***********************************************************************************************************************************/ -#define CFG_COMMAND_TOTAL 16 +#define CFG_COMMAND_TOTAL 17 /*********************************************************************************************************************************** Option constants @@ -32,6 +32,7 @@ typedef enum cfgCmdRemote, cfgCmdRestore, cfgCmdStanzaCreate, + cfgCmdStanzaDelete, cfgCmdStanzaUpgrade, cfgCmdStart, cfgCmdStop, diff --git a/src/config/define.auto.c b/src/config/define.auto.c index 30991c60c..dc16c0a6b 100644 --- a/src/config/define.auto.c +++ b/src/config/define.auto.c @@ -64,6 +64,11 @@ ConfigDefineCommandData configDefineCommandData[] = CFGDEFDATA_COMMAND_LIST CFGDEFDATA_COMMAND_NAME("stanza-create") ) + CFGDEFDATA_COMMAND + ( + CFGDEFDATA_COMMAND_NAME("stanza-delete") + ) + CFGDEFDATA_COMMAND ( CFGDEFDATA_COMMAND_NAME("stanza-upgrade") @@ -243,6 +248,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -276,6 +282,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -310,6 +317,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -338,6 +346,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -397,6 +406,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -433,6 +443,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) ) @@ -498,6 +509,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -577,6 +589,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) ) @@ -610,6 +623,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) ) @@ -644,6 +658,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -674,6 +689,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdExpire) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -705,6 +721,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdExpire) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -739,6 +756,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -790,6 +808,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) ) @@ -845,6 +864,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdCheck) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) ) @@ -874,6 +894,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) ) @@ -904,6 +925,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -937,6 +959,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) ) @@ -965,6 +988,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdCheck) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdLocal) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) ) @@ -1021,6 +1045,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdBackup) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) ) @@ -1053,6 +1078,13 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_OPTIONAL_DEFAULT("0") ) + CFGDEFDATA_OPTION_OPTIONAL_COMMAND_OVERRRIDE + ( + CFGDEFDATA_OPTION_OPTIONAL_COMMAND(cfgDefCmdStanzaDelete) + + CFGDEFDATA_OPTION_OPTIONAL_DEFAULT("0") + ) + CFGDEFDATA_OPTION_OPTIONAL_COMMAND_OVERRRIDE ( CFGDEFDATA_OPTION_OPTIONAL_COMMAND(cfgDefCmdStop) @@ -1167,6 +1199,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1200,6 +1233,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdInfo) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1244,6 +1278,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdInfo) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1334,6 +1369,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1367,6 +1403,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdInfo) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1424,6 +1461,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1611,6 +1649,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) ) @@ -1675,6 +1714,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1714,6 +1754,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1755,6 +1796,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1790,6 +1832,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1829,6 +1872,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1868,6 +1912,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1907,6 +1952,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1946,6 +1992,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -1985,6 +2032,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -2024,6 +2072,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -2063,6 +2112,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -2102,6 +2152,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -2143,6 +2194,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) @@ -2368,6 +2420,7 @@ ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRemote) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdRestore) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaCreate) + CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaDelete) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStanzaUpgrade) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStart) CFGDEFDATA_OPTION_COMMAND(cfgDefCmdStop) diff --git a/src/config/define.auto.h b/src/config/define.auto.h index 0e2b5a773..c1406bcb8 100644 --- a/src/config/define.auto.h +++ b/src/config/define.auto.h @@ -22,6 +22,7 @@ typedef enum cfgDefCmdRemote, cfgDefCmdRestore, cfgDefCmdStanzaCreate, + cfgDefCmdStanzaDelete, cfgDefCmdStanzaUpgrade, cfgDefCmdStart, cfgDefCmdStop, diff --git a/test/expect/help-help-001.log b/test/expect/help-help-001.log index da5a9f3d0..3a4e6e1c3 100644 --- a/test/expect/help-help-001.log +++ b/test/expect/help-help-001.log @@ -22,6 +22,7 @@ Commands: info Retrieve information about backups. restore Restore a database cluster. stanza-create Create the required stanza data. + stanza-delete Delete a stanza. stanza-upgrade Upgrade a stanza. start Allow pgBackRest processes to run. stop Stop pgBackRest processes from running. diff --git a/test/expect/mock-all-001.log b/test/expect/mock-all-001.log index 8a53b2b24..c47cf9b72 100644 --- a/test/expect/mock-all-001.log +++ b/test/expect/mock-all-001.log @@ -78,6 +78,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/db-master/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/db-master/log @@ -467,6 +469,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/db-master/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/db-master/log @@ -546,6 +550,7 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = P00 ERROR: [062]: stop file exists for all stanzas P00 DEBUG: Common::Exit::exitSafe(): iExitCode = [undef], oException = [object], strSignal = [undef] P00 DEBUG: Protocol::Helper::protocolDestroy(): bComplete = false, iRemoteIdx = [undef], strRemoteType = [undef] @@ -590,6 +595,7 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = P00 ERROR: [062]: stop file exists for stanza db P00 DEBUG: Common::Exit::exitSafe(): iExitCode = [undef], oException = [object], strSignal = [undef] P00 DEBUG: Protocol::Helper::protocolDestroy(): bComplete = false, iRemoteIdx = [undef], strRemoteType = [undef] @@ -643,6 +649,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/db-master/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/db-master/log @@ -999,6 +1007,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = restore +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/db-master/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/db-master/log @@ -1633,6 +1643,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/db-master/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/db-master/log @@ -1950,6 +1962,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/db-master/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/db-master/log diff --git a/test/expect/mock-all-002.log b/test/expect/mock-all-002.log index 90dcfbebf..c122df9e8 100644 --- a/test/expect/mock-all-002.log +++ b/test/expect/mock-all-002.log @@ -78,6 +78,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/backup/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/backup/log @@ -488,6 +490,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/backup/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/backup/log @@ -592,6 +596,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/backup/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/backup/log @@ -671,6 +677,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/backup/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/backup/log @@ -772,6 +780,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/backup/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/backup/log @@ -875,6 +885,7 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = P00 ERROR: [062]: stop file exists for all stanzas P00 DEBUG: Common::Exit::exitSafe(): iExitCode = [undef], oException = [object], strSignal = [undef] P00 DEBUG: Protocol::Helper::protocolDestroy(): bComplete = false, iRemoteIdx = [undef], strRemoteType = [undef] @@ -905,6 +916,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/backup/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/backup/log @@ -1280,6 +1293,8 @@ restore delta, backup '[BACKUP-FULL-2]' - add and delete files (db-master host) ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: restore command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-2] --cmd-ssh=/usr/bin/ssh --no-compress --compress-level=3 --compress-level-network=1 --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --delta --link-all --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 --set=[BACKUP-FULL-2] --stanza=db P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = restore +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/db-master/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/db-master/log @@ -1704,6 +1719,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/backup/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/backup/log @@ -2051,6 +2068,8 @@ P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBuf P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true P00 DEBUG: Common::Lock::lockAcquire(): bFailOnNoLock = , bRemote = , strLockType = backup +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/backup/lock P00 DEBUG: Common::Lock::lockAcquire=>: bResult = true P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 0770, strPathExp = [TEST_PATH]/backup/log diff --git a/test/expect/mock-archive-001.log b/test/expect/mock-archive-001.log index de78c803d..fd0dba60d 100644 --- a/test/expect/mock-archive-001.log +++ b/test/expect/mock-archive-001.log @@ -70,6 +70,8 @@ db-version="9.4" ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --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=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-cipher-pass= --repo-cipher-type=aes-256-cbc --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 DEBUG: Archive::Push::Push->process(): strWalPathFile = [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Archive::Push::File::archivePushFile(): bCompress = false, iCompressLevel = 3, strWalFile = 000000010000000100000001, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Storage::Posix::Driver->new(): bFileSync = , bPathSync = P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strCipherPassUser = , strCipherType = aes-256-cbc, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -114,6 +116,8 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --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=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-cipher-pass= --repo-cipher-type=aes-256-cbc --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: get WAL segment 000000010000000100000001 P00 DEBUG: Archive::Get::Get->get(): strDestinationFile = [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG, strSourceArchive = 000000010000000100000001 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Posix::Driver->new(): bFileSync = , bPathSync = P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strCipherPassUser = , strCipherType = aes-256-cbc, strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp P00 DEBUG: Archive::Base->getCheck(): bCheck = false, strDbVersion = [undef], strFile = 000000010000000100000001, ullDbSysId = [undef] diff --git a/test/expect/mock-archive-002.log b/test/expect/mock-archive-002.log index b92570fab..dd21c54b3 100644 --- a/test/expect/mock-archive-002.log +++ b/test/expect/mock-archive-002.log @@ -62,6 +62,8 @@ db-version="9.4" ------------------------------------------------------------------------------------------------------------------------------------ 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-1] --cmd-ssh=/usr/bin/ssh --no-compress --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 P00 DEBUG: Archive::Push::Push->process(): strWalPathFile = [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Archive::Push::File::archivePushFile(): bCompress = false, iCompressLevel = 3, strWalFile = 000000010000000100000001, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = <1>, strBackRestBin = [undef], strCommand = , strRemoteType = backup P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -100,6 +102,8 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 P00 INFO: archive-get command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-1] --no-compress --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 P00 INFO: get WAL segment 000000010000000100000001 P00 DEBUG: Archive::Get::Get->get(): strDestinationFile = [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG, strSourceArchive = 000000010000000100000001 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = <1>, strBackRestBin = [undef], strCommand = , strRemoteType = backup P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol P00 DEBUG: Protocol::Helper::protocolParam(): iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = archive-get, strRemoteType = backup diff --git a/test/expect/mock-stanza-001.log b/test/expect/mock-stanza-001.log index 50b7e3690..98bdf64fd 100644 --- a/test/expect/mock-stanza-001.log +++ b/test/expect/mock-stanza-001.log @@ -180,6 +180,8 @@ db-version="9.3" ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: archive-push 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=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 DEBUG: Archive::Push::Push->process(): strWalPathFile = [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Archive::Push::File::archivePushFile(): bCompress = true, iCompressLevel = 3, strWalFile = 000000010000000100000001, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Storage::Posix::Driver->new(): bFileSync = , bPathSync = P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strCipherPassUser = [undef], strCipherType = [undef], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -465,6 +467,8 @@ db-version="9.3" ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: archive-push 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=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 DEBUG: Archive::Push::Push->process(): strWalPathFile = [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Archive::Push::File::archivePushFile(): bCompress = true, iCompressLevel = 3, strWalFile = 000000010000000100000002, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Storage::Posix::Driver->new(): bFileSync = , bPathSync = P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strCipherPassUser = [undef], strCipherType = [undef], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -555,6 +559,8 @@ db-version="9.4" P00 INFO: archive-get 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=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: get WAL segment 000000010000000100000002 P00 DEBUG: Archive::Get::Get->get(): strDestinationFile = [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG, strSourceArchive = 000000010000000100000002 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::Posix::Driver->new(): bFileSync = , bPathSync = P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strCipherPassUser = [undef], strCipherType = [undef], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp P00 DEBUG: Archive::Base->getCheck(): bCheck = false, strDbVersion = [undef], strFile = 000000010000000100000002, ullDbSysId = [undef] @@ -967,3 +973,47 @@ info all stanzas - db upgraded - db-1 and db-2 listed (db-master host) } } ] + +stanza-delete db - fail on missing stop file (db-master host) +> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail stanza-delete +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: stanza-delete 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 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 ERROR: [055]: stop file does not exist for stanza 'db' + HINT: has the pgbackrest stop command been run on this server? +P00 INFO: stanza-delete command end: aborted with exception [055] + +db must not exist for successful delete +> ls [TEST_PATH]/db-master/repo/backup/ +------------------------------------------------------------------------------------------------------------------------------------ +db + +db must not exist for successful delete +> ls [TEST_PATH]/db-master/repo/archive/ +------------------------------------------------------------------------------------------------------------------------------------ +db + +stop db stanza (db-master host) +> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db stop +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: stop command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --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 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/db-master/lock +P00 DEBUG: Common::Exit::exitSafe(): iExitCode = 0, oException = [undef], strSignal = [undef] +P00 DEBUG: Protocol::Helper::protocolDestroy(): bComplete = true, iRemoteIdx = [undef], strRemoteType = [undef] +P00 DEBUG: Protocol::Helper::protocolDestroy=>: iExitStatus = 0 +P00 DEBUG: Common::Lock::lockRelease(): bFailOnNoLock = false +P00 INFO: stop command end: completed successfully +P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 + +stanza-delete db - successfully delete the stanza (db-master host) +> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail stanza-delete +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: stanza-delete 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 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-delete command end: completed successfully + +db must not exist for successful delete +> ls [TEST_PATH]/db-master/repo/backup/ +------------------------------------------------------------------------------------------------------------------------------------ + +db must not exist for successful delete +> ls [TEST_PATH]/db-master/repo/archive/ +------------------------------------------------------------------------------------------------------------------------------------ diff --git a/test/expect/mock-stanza-002.log b/test/expect/mock-stanza-002.log index fd91eae99..1156f99f5 100644 --- a/test/expect/mock-stanza-002.log +++ b/test/expect/mock-stanza-002.log @@ -204,6 +204,8 @@ db-version="9.3" ------------------------------------------------------------------------------------------------------------------------------------ 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 P00 DEBUG: Archive::Push::Push->process(): strWalPathFile = [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Archive::Push::File::archivePushFile(): bCompress = true, iCompressLevel = 3, strWalFile = 000000010000000100000001, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = <1>, strBackRestBin = [undef], strCommand = , strRemoteType = backup P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -322,6 +324,8 @@ db-version="9.3" ------------------------------------------------------------------------------------------------------------------------------------ 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 P00 DEBUG: Archive::Push::Push->process(): strWalPathFile = [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Archive::Push::File::archivePushFile(): bCompress = true, iCompressLevel = 3, strWalFile = 000000010000000100000002, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = <1>, strBackRestBin = [undef], strCommand = , strRemoteType = backup P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol @@ -412,6 +416,8 @@ db-version="9.4" P00 INFO: archive-get 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 P00 INFO: get WAL segment 000000010000000100000002 P00 DEBUG: Archive::Get::Get->get(): strDestinationFile = [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG, strSourceArchive = 000000010000000100000002 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = <1>, strBackRestBin = [undef], strCommand = , strRemoteType = backup P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol P00 DEBUG: Protocol::Helper::protocolParam(): iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = archive-get, strRemoteType = backup @@ -792,3 +798,47 @@ info all stanzas - db upgraded - db-1 and db-2 listed (db-master host) } } ] + +stanza-delete db - fail on missing stop file (backup host) +> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail stanza-delete +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: stanza-delete 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 --protocol-timeout=60 --repo-cipher-pass= --repo-cipher-type=aes-256-cbc --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 ERROR: [055]: stop file does not exist for stanza 'db' + HINT: has the pgbackrest stop command been run on this server? +P00 INFO: stanza-delete command end: aborted with exception [055] + +db must not exist for successful delete +> ls [TEST_PATH]/backup/repo/backup/ +------------------------------------------------------------------------------------------------------------------------------------ +db + +db must not exist for successful delete +> ls [TEST_PATH]/backup/repo/archive/ +------------------------------------------------------------------------------------------------------------------------------------ +db + +stop db stanza (backup host) +> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db stop +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: stop command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-cipher-pass= --repo-cipher-type=aes-256-cbc --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/backup/lock +P00 DEBUG: Common::Exit::exitSafe(): iExitCode = 0, oException = [undef], strSignal = [undef] +P00 DEBUG: Protocol::Helper::protocolDestroy(): bComplete = true, iRemoteIdx = [undef], strRemoteType = [undef] +P00 DEBUG: Protocol::Helper::protocolDestroy=>: iExitStatus = 0 +P00 DEBUG: Common::Lock::lockRelease(): bFailOnNoLock = false +P00 INFO: stop command end: completed successfully +P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 + +stanza-delete db - successfully delete the stanza (backup host) +> [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail stanza-delete +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: stanza-delete 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 --protocol-timeout=60 --repo-cipher-pass= --repo-cipher-type=aes-256-cbc --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-delete command end: completed successfully + +db must not exist for successful delete +> ls [TEST_PATH]/backup/repo/backup/ +------------------------------------------------------------------------------------------------------------------------------------ + +db must not exist for successful delete +> ls [TEST_PATH]/backup/repo/archive/ +------------------------------------------------------------------------------------------------------------------------------------ diff --git a/test/expect/mock-stanza-003.log b/test/expect/mock-stanza-003.log index a3a96a925..ac8309fd0 100644 --- a/test/expect/mock-stanza-003.log +++ b/test/expect/mock-stanza-003.log @@ -180,6 +180,8 @@ db-version="9.3" ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: archive-push 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=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --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 DEBUG: Archive::Push::Push->process(): strWalPathFile = [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Archive::Push::File::archivePushFile(): bCompress = true, iCompressLevel = 3, strWalFile = 000000010000000100000001, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Storage::S3::Request->new(): bVerifySsl = false, iPort = [undef], lBufferMax = 4194304, strAccessKeyId = , strBucket = pgbackrest-dev, strCaFile = [undef], strCaPath = [undef], strEndPoint = s3.amazonaws.com, strHost = [undef], strRegion = us-east-1, strSecretAccessKey = P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strCipherPassUser = [undef], strCipherType = [undef], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = /, strTempExtension = pgbackrest.tmp @@ -440,6 +442,8 @@ db-version="9.3" ------------------------------------------------------------------------------------------------------------------------------------ P00 INFO: archive-push 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=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --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 DEBUG: Archive::Push::Push->process(): strWalPathFile = [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Archive::Push::File::archivePushFile(): bCompress = true, iCompressLevel = 3, strWalFile = 000000010000000100000002, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Storage::S3::Request->new(): bVerifySsl = false, iPort = [undef], lBufferMax = 4194304, strAccessKeyId = , strBucket = pgbackrest-dev, strCaFile = [undef], strCaPath = [undef], strEndPoint = s3.amazonaws.com, strHost = [undef], strRegion = us-east-1, strSecretAccessKey = P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strCipherPassUser = [undef], strCipherType = [undef], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = /, strTempExtension = pgbackrest.tmp @@ -530,6 +534,8 @@ db-version="9.4" P00 INFO: archive-get 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=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --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 INFO: get WAL segment 000000010000000100000002 P00 DEBUG: Archive::Get::Get->get(): strDestinationFile = [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG, strSourceArchive = 000000010000000100000002 +P00 DEBUG: Common::Lock::lockStopTest(): bStanzaStopRequired = +P00 DEBUG: Common::Lock::lockStopTest=>: bStopExists = false P00 DEBUG: Storage::S3::Request->new(): bVerifySsl = false, iPort = [undef], lBufferMax = 4194304, strAccessKeyId = , strBucket = pgbackrest-dev, strCaFile = [undef], strCaPath = [undef], strEndPoint = s3.amazonaws.com, strHost = [undef], strRegion = us-east-1, strSecretAccessKey = P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strCipherPassUser = [undef], strCipherType = [undef], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = /, strTempExtension = pgbackrest.tmp P00 DEBUG: Archive::Base->getCheck(): bCheck = false, strDbVersion = [undef], strFile = 000000010000000100000002, ullDbSysId = [undef] @@ -956,3 +962,45 @@ info all stanzas - db upgraded - db-1 and db-2 listed (db-master host) } } ] + +stanza-delete db - fail on missing stop file (db-master host) +> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail stanza-delete +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: stanza-delete 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 --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]: stop file does not exist for stanza 'db' + HINT: has the pgbackrest stop command been run on this server? +P00 INFO: stanza-delete command end: aborted with exception [055] + +db must not exist for successful delete +> ls //backup/ +------------------------------------------------------------------------------------------------------------------------------------ + +db must not exist for successful delete +> ls //archive/ +------------------------------------------------------------------------------------------------------------------------------------ + +stop db stanza (db-master host) +> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db stop +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: stop command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --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 --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 DEBUG: Storage::Local->pathCreate(): bCreateParent = true, bIgnoreExists = true, strMode = 770, strPathExp = [TEST_PATH]/db-master/lock +P00 DEBUG: Common::Exit::exitSafe(): iExitCode = 0, oException = [undef], strSignal = [undef] +P00 DEBUG: Protocol::Helper::protocolDestroy(): bComplete = true, iRemoteIdx = [undef], strRemoteType = [undef] +P00 DEBUG: Protocol::Helper::protocolDestroy=>: iExitStatus = 0 +P00 DEBUG: Common::Lock::lockRelease(): bFailOnNoLock = false +P00 INFO: stop command end: completed successfully +P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 + +stanza-delete db - successfully delete the stanza (db-master host) +> [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail stanza-delete +------------------------------------------------------------------------------------------------------------------------------------ +P00 INFO: stanza-delete 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 --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 INFO: stanza-delete command end: completed successfully + +db must not exist for successful delete +> ls //backup/ +------------------------------------------------------------------------------------------------------------------------------------ + +db must not exist for successful delete +> ls //archive/ +------------------------------------------------------------------------------------------------------------------------------------ diff --git a/test/lib/pgBackRestTest/Common/DefineTest.pm b/test/lib/pgBackRestTest/Common/DefineTest.pm index 927fcce23..b725d0a5e 100644 --- a/test/lib/pgBackRestTest/Common/DefineTest.pm +++ b/test/lib/pgBackRestTest/Common/DefineTest.pm @@ -700,7 +700,7 @@ my $oTestDef = [ { &TESTDEF_NAME => 'all', - &TESTDEF_TOTAL => 8, + &TESTDEF_TOTAL => 9, &TESTDEF_CONTAINER => true, &TESTDEF_COVERAGE => diff --git a/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm b/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm index 78524ff42..3f95d9099 100644 --- a/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm +++ b/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm @@ -867,6 +867,55 @@ sub stanzaUpgrade return logDebugReturn($strOperation); } +#################################################################################################################################### +# stanzaDelete +#################################################################################################################################### +sub stanzaDelete +{ + my $self = shift; + + # Assign function parameters, defaults, and log debug info + my + ( + $strOperation, + $strComment, + $oParam, + ) = + logDebugParam + ( + __PACKAGE__ . '->stanzaDelete', \@_, + {name => 'strComment'}, + {name => 'oParam', required => false}, + ); + + $strComment = + 'stanza-delete ' . $self->stanza() . ' - ' . $strComment . + ' (' . $self->nameGet() . ' host)'; + &log(INFO, " $strComment"); + + $self->executeSimple( + $self->backrestExe() . + ' --config=' . $self->backrestConfig() . + ' --stanza=' . $self->stanza() . + ' --log-level-console=detail' . + (defined($$oParam{strOptionalParam}) ? " $$oParam{strOptionalParam}" : '') . + ' stanza-delete', + {strComment => $strComment, iExpectedExitStatus => $$oParam{iExpectedExitStatus}, oLogTest => $self->{oLogTest}, + bLogOutput => $self->synthetic()}); + + if (defined($self->{oLogTest}) && $self->synthetic()) + { + $self->{oLogTest}->logAdd( + 'ls ' . $self->repoPath() . '/backup/', $self->stanza() . ' must not exist for successful delete', + join("\n", storageRepo()->list('backup/'))); + $self->{oLogTest}->logAdd( + 'ls ' . $self->repoPath() . '/archive/', $self->stanza() . ' must not exist for successful delete', + join("\n", storageRepo()->list('archive/'))); + } + + # Return from function and log return values if any + return logDebugReturn($strOperation); +} #################################################################################################################################### # start diff --git a/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm b/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm index 92a519aa0..6b849406c 100644 --- a/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm +++ b/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm @@ -364,6 +364,13 @@ sub run # Confirm info command displays the JSON correctly $oHostDbMaster->info('db upgraded - db-1 and db-2 listed', {strOutput => CFGOPTVAL_INFO_OUTPUT_JSON}); + + # Delete the stanza + #-------------------------------------------------------------------------------------------------------------------------- + $oHostBackup->stanzaDelete('fail on missing stop file', {iExpectedExitStatus => ERROR_FILE_MISSING}); + + $oHostBackup->stop({strStanza => $self->stanza()}); + $oHostBackup->stanzaDelete('successfully delete the stanza'); } } } diff --git a/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm b/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm index 869f69b3f..82c320560 100644 --- a/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm +++ b/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm @@ -17,6 +17,7 @@ use Storable qw(dclone); use pgBackRest::Archive::Common; use pgBackRest::Archive::Info; +use pgBackRest::Backup::Common; use pgBackRest::Backup::Info; use pgBackRest::Common::Cipher; use pgBackRest::Common::Exception; @@ -667,6 +668,140 @@ sub run $self->testException(sub {$oStanza->errorForce($strMessage, ERROR_FILE_MISSING, $strFile, true, $self->{strArchivePath}, $self->{strBackupPath})}, ERROR_FILE_MISSING, $strMessage); } + + ################################################################################################################################ + if ($self->begin("Stanza::stanzaDelete()")) + { + # Create the stanza + $self->configTestLoad(CFGCMD_STANZA_CREATE); + my $oStanza = new pgBackRest::Stanza(); + $oStanza->stanzaCreate(); + + # Attempt to delete without running stop + #--------------------------------------------------------------------------------------------------------------------------- + $self->optionTestClear(CFGOPT_ONLINE); + $self->configTestLoad(CFGCMD_STANZA_DELETE); + + $self->testException(sub {$oStanza->stanzaDelete()}, ERROR_FILE_MISSING, + "stop file does not exist for stanza '" . $self->stanza() . "'" . + "\nHINT: has the pgbackrest stop command been run on this server?"); + + # Create a stop file and attempt to delete with postgres running + #--------------------------------------------------------------------------------------------------------------------------- + lockStop(); + + # Simulate postgres still running + executeTest('touch ' . $self->{strDbPath} . qw(/) . DB_FILE_POSTMASTERPID); + + $self->testException(sub {$oStanza->stanzaDelete()}, ERROR_POSTMASTER_RUNNING, + DB_FILE_POSTMASTERPID . " exists - looks like the postmaster is running. " . + "To delete stanza '" . $self->stanza() . "', shutdown the postmaster for stanza '" . $self->stanza() . + "' and try again, or use --force."); + + # Force deletion + #--------------------------------------------------------------------------------------------------------------------------- + $self->optionTestSetBool(CFGOPT_FORCE, true); + $self->configTestLoad(CFGCMD_STANZA_DELETE); + + $self->testResult(sub {$oStanza->stanzaDelete()}, 0, 'successfully delete stanza with force'); + $self->testResult(sub {storageRepo()->pathExists($self->{strArchivePath}) || + storageRepo()->pathExists($self->{strBackupPath})}, + false, ' neither archive nor backup repo paths for the stanza exist'); + + # Remove postmaster.pid and clear force + storageTest()->remove($self->{strDbPath} . qw(/) . DB_FILE_POSTMASTERPID); + $self->optionTestClear(CFGOPT_FORCE); + + # Rerun stanza-delete without force and with missing stanza directories + #--------------------------------------------------------------------------------------------------------------------------- + $self->testResult(sub {$oStanza->stanzaDelete()}, 0, 'successful - stanza already deleted'); + + # Recursive dir delete with archive directory and stanza directory but missing info files + #--------------------------------------------------------------------------------------------------------------------------- + storageTest()->pathCreate($self->{strArchivePath}, {bIgnoreExists => true, bCreateParent => true}); + storageRepo()->pathCreate(STORAGE_REPO_ARCHIVE . "/" . PG_VERSION_94 . "-1", {bCreateParent => true}); + storageRepo()->pathCreate(STORAGE_REPO_ARCHIVE . "/" . PG_VERSION_94 . "-1/0000000100000001"); + executeTest('touch ' . $self->{strArchivePath} . "/" . PG_VERSION_94 . "-1/0000000100000001/" . BOGUS); + + storageTest()->pathCreate($self->{strBackupPath}, {bIgnoreExists => true, bCreateParent => true}); + my $strFullLabel = backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_FULL, undef, 1482000000); + storageRepo()->pathCreate(STORAGE_REPO_BACKUP . "/${strFullLabel}", {bCreateParent => true}); + executeTest('touch ' . $self->{strBackupPath} . "/${strFullLabel}/" . BOGUS); + + # Create an inaccessible file + executeTest("sudo chgrp 777 " . $self->{strBackupPath} . "/${strFullLabel}/" . BOGUS); + executeTest("sudo chown 777 " . $self->{strBackupPath} . "/${strFullLabel}/" . BOGUS); + + lockStop(); + $self->testResult(sub {$oStanza->stanzaDelete()}, 0, + 'successful - recursive delete with missing info files and inaccessible file'); + $self->testResult(sub {storageRepo()->pathExists($self->{strArchivePath}) || + storageRepo()->pathExists($self->{strBackupPath})}, + false, ' neither archive nor backup repo paths for the stanza exist'); + + # Make the archive directory inaccessible + #--------------------------------------------------------------------------------------------------------------------------- + storageTest()->pathCreate($self->{strArchivePath}, {bIgnoreExists => true, bCreateParent => true}); + + executeTest("sudo chgrp 7777 " . $self->{strArchivePath}); + executeTest("sudo chown 7777 " . $self->{strArchivePath}); + + lockStop(); + $self->testException(sub {$oStanza->stanzaDelete()}, ERROR_FILE_OPEN, + "unable to remove file '" . $self->{strArchivePath} . "/" . ARCHIVE_INFO_FILE . "': Permission denied"); + + # Remove the repo + executeTest("sudo rm -rf " . $self->{strArchivePath}); + + # Clear the cached repo settings and change repo settings to encrypted + #--------------------------------------------------------------------------------------------------------------------------- + storageRepoCacheClear($self->stanza()); + $self->optionTestSet(CFGOPT_REPO_CIPHER_TYPE, CFGOPTVAL_REPO_CIPHER_TYPE_AES_256_CBC); + $self->optionTestSet(CFGOPT_REPO_CIPHER_PASS, 'x'); + $self->configTestLoad(CFGCMD_STANZA_CREATE); + $self->testResult(sub {$oStanza->stanzaCreate()}, 0, 'successfully created encrypted stanza'); + + # Create encrypted archived file + storageRepo()->pathCreate(STORAGE_REPO_ARCHIVE . "/" . PG_VERSION_93 . "-1"); + storageRepo()->pathCreate(STORAGE_REPO_ARCHIVE . "/" . PG_VERSION_93 . "-1/0000000100000001"); + my $strArchiveIdPath = storageRepo()->pathGet(STORAGE_REPO_ARCHIVE . "/" . PG_VERSION_93 . "-1"); + my $strArchivedFile = storageRepo()->pathGet($strArchiveIdPath . + "/0000000100000001/000000010000000100000001-" . $self->walGenerateContentChecksum(PG_VERSION_93)); + my $oArchiveInfo = new pgBackRest::Archive::Info($self->{strArchivePath}); + storageRepo()->put( + $strArchivedFile, $self->walGenerateContent(PG_VERSION_93), {strCipherPass => $oArchiveInfo->cipherPassSub()}); + $self->testResult(sub {storageRepo()->encrypted($strArchivedFile)}, true, ' created encrypted archive WAL'); + + my $strBackupPath = storageRepo->pathGet(STORAGE_REPO_BACKUP . "/${strFullLabel}"); + my $strBackupManifestFile = "$strBackupPath/" . FILE_MANIFEST; + my $iDbCatalogVersion = 201409291; + + storageRepo()->pathCreate(STORAGE_REPO_BACKUP . "/${strFullLabel}", {bCreateParent => true}); + my $oBackupInfo = new pgBackRest::Backup::Info($self->{strBackupPath}); + + $self->testResult(sub {(new pgBackRest::Manifest($strBackupManifestFile, {bLoad => false, strDbVersion => PG_VERSION_94, + strCipherPass => $oBackupInfo->cipherPassSub(), strCipherPassSub => 'x'}))->save()}, + "[undef]", ' manifest saved'); + + lockStop(); + $self->testResult(sub {$oStanza->stanzaDelete()}, 0, + ' successful - recursive delete on encrypted repo'); + $self->testResult(sub {storageRepo()->pathExists($self->{strArchivePath}) || + storageRepo()->pathExists($self->{strBackupPath})}, + false, ' neither archive nor backup repo paths for the stanza exist'); + + # For test coverage: create new stanza with delete command, call process and remove only backup path + #--------------------------------------------------------------------------------------------------------------------------- + lockStop(); + $self->configTestLoad(CFGCMD_STANZA_DELETE); + $oStanza = new pgBackRest::Stanza(); + storageTest()->pathCreate($self->{strBackupPath}, {bIgnoreExists => true, bCreateParent => true}); + $self->testResult(sub {$oStanza->process()}, 0, + 'successfully remove backup path'); + $self->testResult(sub {storageRepo()->pathExists($self->{strArchivePath}) || + storageRepo()->pathExists($self->{strBackupPath})}, + false, ' neither archive nor backup repo paths for the stanza exist'); + } } 1;