From 1e0ed074555df7d9079fdf52c4b6b5b049b6d155 Mon Sep 17 00:00:00 2001 From: David Steele Date: Fri, 25 Aug 2017 16:47:47 -0400 Subject: [PATCH] Configuration rules are now pulled from the C library when present. --- .gitignore | 1 - bin/pgbackrest | 73 +- build/lib/pgBackRestBuild/Build.pm | 181 ++ build/lib/pgBackRestBuild/Build/Common.pm | 67 + build/lib/pgBackRestBuild/CodeGen/Common.pm | 169 + build/lib/pgBackRestBuild/CodeGen/Lookup.pm | 86 + build/lib/pgBackRestBuild/CodeGen/Switch.pm | 288 ++ build/lib/pgBackRestBuild/CodeGen/Truth.pm | 173 + build/lib/pgBackRestBuild/Config/Build.pm | 656 ++++ build/lib/pgBackRestBuild/Config/Rule.pm | 136 + doc/doc.pl | 2 +- doc/lib/BackRestDoc/Common/Doc.pm | 4 +- doc/lib/BackRestDoc/Common/DocConfig.pm | 117 +- doc/lib/BackRestDoc/Common/DocExecute.pm | 16 +- .../BackRestDoc/Custom/DocCustomRelease.pm | 3 +- doc/lib/BackRestDoc/Html/DocHtmlPage.pm | 2 +- doc/lib/BackRestDoc/Latex/DocLatexSection.pm | 2 +- .../BackRestDoc/Markdown/DocMarkdownRender.pm | 2 +- doc/release.pl | 6 +- doc/xml/release.xml | 8 +- doc/xml/user-guide.xml | 81 + lib/pgBackRest/Archive/Base.pm | 2 +- lib/pgBackRest/Archive/Get/Get.pm | 6 +- lib/pgBackRest/Archive/Push/Async.pm | 20 +- lib/pgBackRest/Archive/Push/File.pm | 4 +- lib/pgBackRest/Archive/Push/Push.pm | 20 +- lib/pgBackRest/Backup/Backup.pm | 122 +- lib/pgBackRest/Backup/Common.pm | 14 +- lib/pgBackRest/Backup/Filter/PageChecksum.pm | 23 +- lib/pgBackRest/Backup/Info.pm | 4 +- lib/pgBackRest/Check/Check.pm | 6 +- lib/pgBackRest/Common/Lock.pm | 26 +- lib/pgBackRest/Common/Log.pm | 7 +- lib/pgBackRest/Config/Config.pm | 2868 ++--------------- lib/pgBackRest/Config/ConfigHelp.pm | 62 +- lib/pgBackRest/Config/ConfigHelpData.pm | 8 + lib/pgBackRest/Config/Data.pm | 1929 +++++++++++ lib/pgBackRest/Config/LoadFailback.pm | 37 + lib/pgBackRest/Config/Rule.pm | 526 +++ lib/pgBackRest/Db.pm | 47 +- lib/pgBackRest/Expire.pm | 18 +- lib/pgBackRest/Info.pm | 15 +- lib/pgBackRest/LibCLoad.pm | 39 + lib/pgBackRest/Manifest.pm | 14 +- lib/pgBackRest/Protocol/Helper.pm | 135 +- lib/pgBackRest/Protocol/Local/Master.pm | 4 +- lib/pgBackRest/Protocol/Local/Minion.pm | 2 +- lib/pgBackRest/Protocol/Local/Process.pm | 16 +- lib/pgBackRest/Protocol/Remote/Minion.pm | 12 +- lib/pgBackRest/Protocol/Storage/Helper.pm | 34 +- lib/pgBackRest/Protocol/Storage/Remote.pm | 4 +- lib/pgBackRest/Restore.pm | 91 +- lib/pgBackRest/Stanza.pm | 22 +- lib/pgBackRest/Storage/Helper.pm | 8 +- lib/pgBackRest/Version.pm | 2 +- libc/.gitignore | 11 +- libc/LibC.h | 40 +- libc/LibC.xs | 143 +- libc/Makefile.PL | 414 ++- libc/lib/pgBackRest/LibC.pm | 67 - libc/t/config.t | 100 + src/.gitignore | 3 + src/common/type.h | 31 + src/config/config.auto.md | 28 + src/config/config.c | 7 + src/config/config.h | 14 + src/config/configRule.auto.md | 1338 ++++++++ src/config/configRule.c | 57 + src/config/configRule.h | 40 + {libc => src/postgres}/pageChecksum.c | 0 src/postgres/pageChecksum.h | 15 + test/expect/archive-stop-001.log | 2 +- test/expect/archive-stop-002.log | 2 +- test/expect/archive-stop-003.log | 2 +- test/expect/archive-stop-004.log | 2 +- test/expect/archive-stop-005.log | 2 +- test/expect/archive-stop-006.log | 2 +- test/expect/archive-stop-007.log | 2 +- test/expect/expire-expire-001.log | 24 +- test/expect/expire-expire-002.log | 10 +- test/expect/help-help-001.log | 94 +- test/expect/mock-all-001.log | 156 +- test/expect/mock-all-002.log | 180 +- test/expect/mock-all-003.log | 14 +- test/expect/mock-archive-001.log | 36 +- test/expect/mock-archive-002.log | 44 +- test/expect/mock-archive-003.log | 2 +- test/expect/mock-stanza-001.log | 52 +- test/expect/mock-stanza-002.log | 56 +- test/expect/mock-stanza-003.log | 50 +- test/lib/pgBackRestTest/Common/JobTest.pm | 15 + test/lib/pgBackRestTest/Common/RunTest.pm | 1 - test/lib/pgBackRestTest/Env/ConfigEnvTest.pm | 148 +- test/lib/pgBackRestTest/Env/ExpireEnvTest.pm | 18 +- .../pgBackRestTest/Env/Host/HostBackupTest.pm | 120 +- .../Env/Host/HostDbCommonTest.pm | 25 +- test/lib/pgBackRestTest/Env/HostEnvTest.pm | 25 +- .../Module/Archive/ArchiveCommonTest.pm | 20 +- .../Module/Archive/ArchivePushTest.pm | 137 +- .../Module/Archive/ArchiveStopTest.pm | 2 +- .../Module/Backup/BackupInfoUnitTest.pm | 11 +- .../Module/Backup/BackupUnitTest.pm | 41 +- .../Module/Config/ConfigConfigTest.pm | 319 +- .../Module/Config/ConfigOptionTest.pm | 408 +-- .../Module/Config/ConfigUnitTest.pm | 74 +- .../Module/Expire/ExpireExpireTest.pm | 152 +- .../Module/Help/HelpHelpTest.pm | 11 +- .../Module/Info/InfoUnitTest.pm | 77 +- .../pgBackRestTest/Module/Mock/MockAllTest.pm | 178 +- .../Module/Mock/MockArchiveTest.pm | 20 +- .../Module/Mock/MockStanzaTest.pm | 56 +- .../Performance/PerformanceArchiveTest.pm | 6 +- .../Module/Protocol/ProtocolHelperTest.pm | 62 +- .../pgBackRestTest/Module/Real/RealAllTest.pm | 97 +- .../Module/Stanza/StanzaAllTest.pm | 65 +- .../Module/Storage/StorageHelperTest.pm | 22 +- .../Module/Storage/StorageS3CertTest.pm | 44 +- test/test.pl | 19 +- 118 files changed, 8911 insertions(+), 4522 deletions(-) create mode 100644 build/lib/pgBackRestBuild/Build.pm create mode 100644 build/lib/pgBackRestBuild/Build/Common.pm create mode 100644 build/lib/pgBackRestBuild/CodeGen/Common.pm create mode 100644 build/lib/pgBackRestBuild/CodeGen/Lookup.pm create mode 100644 build/lib/pgBackRestBuild/CodeGen/Switch.pm create mode 100644 build/lib/pgBackRestBuild/CodeGen/Truth.pm create mode 100644 build/lib/pgBackRestBuild/Config/Build.pm create mode 100644 build/lib/pgBackRestBuild/Config/Rule.pm create mode 100644 lib/pgBackRest/Config/Data.pm create mode 100644 lib/pgBackRest/Config/LoadFailback.pm create mode 100644 lib/pgBackRest/Config/Rule.pm create mode 100644 lib/pgBackRest/LibCLoad.pm delete mode 100644 libc/lib/pgBackRest/LibC.pm create mode 100644 libc/t/config.t create mode 100644 src/.gitignore create mode 100644 src/common/type.h create mode 100644 src/config/config.auto.md create mode 100644 src/config/config.c create mode 100644 src/config/config.h create mode 100644 src/config/configRule.auto.md create mode 100644 src/config/configRule.c create mode 100644 src/config/configRule.h rename {libc => src/postgres}/pageChecksum.c (100%) create mode 100644 src/postgres/pageChecksum.h diff --git a/.gitignore b/.gitignore index 91b7eb9d9..f106e7f6e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ **/*~ *~ *.swp -src/* diff --git a/bin/pgbackrest b/bin/pgbackrest index 3d86ab68b..7275f66f5 100755 --- a/bin/pgbackrest +++ b/bin/pgbackrest @@ -36,27 +36,27 @@ local $EVAL_ERROR = undef; eval my $bConfigResult = configLoad(); # Display help and version - if (commandTest(CMD_HELP) || commandTest(CMD_VERSION)) + if (cfgCommandTest(CFGCMD_HELP) || cfgCommandTest(CFGCMD_VERSION)) { # Load module dynamically require pgBackRest::Config::ConfigHelp; pgBackRest::Config::ConfigHelp->import(); # Generate help and exit - configHelp($ARGV[1], $ARGV[2], commandTest(CMD_VERSION), $bConfigResult); + configHelp($ARGV[1], $ARGV[2], cfgCommandTest(CFGCMD_VERSION), $bConfigResult); exitSafe(0); } # Set test options - if (optionTest(OPTION_TEST) && optionGet(OPTION_TEST)) + if (cfgOptionTest(CFGOPT_TEST) && cfgOption(CFGOPT_TEST)) { - testSet(optionGet(OPTION_TEST), optionGet(OPTION_TEST_DELAY), optionGet(OPTION_TEST_POINT, false)); + testSet(cfgOption(CFGOPT_TEST), cfgOption(CFGOPT_TEST_DELAY), cfgOption(CFGOPT_TEST_POINT, false)); } ################################################################################################################################ # Process archive-push command ################################################################################################################################ - if (commandTest(CMD_ARCHIVE_PUSH)) + if (cfgCommandTest(CFGCMD_ARCHIVE_PUSH)) { # Load module dynamically require pgBackRest::Archive::Push::Push; @@ -68,7 +68,7 @@ local $EVAL_ERROR = undef; eval ################################################################################################################################ # Process archive-get command ################################################################################################################################ - if (commandTest(CMD_ARCHIVE_GET)) + if (cfgCommandTest(CFGCMD_ARCHIVE_GET)) { # Load module dynamically require pgBackRest::Archive::Get::Get; @@ -80,15 +80,16 @@ local $EVAL_ERROR = undef; eval ################################################################################################################################ # Process remote commands ################################################################################################################################ - if (commandTest(CMD_REMOTE)) + if (cfgCommandTest(CFGCMD_REMOTE)) { # Set log levels - optionSet(OPTION_LOG_LEVEL_STDERR, PROTOCOL, true); - logLevelSet(OFF, OFF, optionGet(OPTION_LOG_LEVEL_STDERR)); + cfgOptionSet(CFGOPT_LOG_LEVEL_STDERR, PROTOCOL, true); + logLevelSet(OFF, OFF, cfgOption(CFGOPT_LOG_LEVEL_STDERR)); - if (optionTest(OPTION_TYPE, BACKUP) && !optionTest(OPTION_REPO_TYPE, REPO_TYPE_S3) && !-e optionGet(OPTION_REPO_PATH)) + if (cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_REMOTE_TYPE_BACKUP) && !cfgOptionTest(CFGOPT_REPO_TYPE, CFGOPTVAL_REPO_TYPE_S3) && + !-e cfgOption(CFGOPT_REPO_PATH)) { - confess &log(ERROR, 'repo-path \'' . optionGet(OPTION_REPO_PATH) . '\' does not exist', ERROR_PATH_MISSING); + confess &log(ERROR, 'repo-path \'' . cfgOption(CFGOPT_REPO_PATH) . '\' does not exist', ERROR_PATH_MISSING); } # Load module dynamically @@ -96,14 +97,16 @@ local $EVAL_ERROR = undef; eval pgBackRest::Protocol::Remote::Minion->import(); # Create the remote object - my $oRemote = new pgBackRest::Protocol::Remote::Minion(optionGet(OPTION_BUFFER_SIZE), optionGet(OPTION_PROTOCOL_TIMEOUT)); + my $oRemote = new pgBackRest::Protocol::Remote::Minion(cfgOption(CFGOPT_BUFFER_SIZE), cfgOption(CFGOPT_PROTOCOL_TIMEOUT)); # Acquire a remote lock (except for commands that are read-only or local processes) - if (!(optionTest(OPTION_COMMAND, CMD_ARCHIVE_GET) || optionTest(OPTION_COMMAND, CMD_INFO) || - optionTest(OPTION_COMMAND, CMD_RESTORE) || optionTest(OPTION_COMMAND, CMD_CHECK) || - optionTest(OPTION_COMMAND, CMD_LOCAL))) + if (!(cfgOptionTest(CFGOPT_COMMAND, cfgCommandName(CFGCMD_ARCHIVE_GET)) || + cfgOptionTest(CFGOPT_COMMAND, cfgCommandName(CFGCMD_INFO)) || + cfgOptionTest(CFGOPT_COMMAND, cfgCommandName(CFGCMD_RESTORE)) || + cfgOptionTest(CFGOPT_COMMAND, cfgCommandName(CFGCMD_CHECK)) || + cfgOptionTest(CFGOPT_COMMAND, cfgCommandName(CFGCMD_LOCAL)))) { - lockAcquire(optionGet(OPTION_COMMAND), undef, true); + lockAcquire(cfgOption(CFGOPT_COMMAND), undef, true); } # Process remote requests @@ -113,11 +116,11 @@ local $EVAL_ERROR = undef; eval ################################################################################################################################ # Process local commands ################################################################################################################################ - if (commandTest(CMD_LOCAL)) + if (cfgCommandTest(CFGCMD_LOCAL)) { # Set log levels - optionSet(OPTION_LOG_LEVEL_STDERR, PROTOCOL, true); - logLevelSet(OFF, OFF, optionGet(OPTION_LOG_LEVEL_STDERR)); + cfgOptionSet(CFGOPT_LOG_LEVEL_STDERR, PROTOCOL, true); + logLevelSet(OFF, OFF, cfgOption(CFGOPT_LOG_LEVEL_STDERR)); # Load module dynamically require pgBackRest::Protocol::Local::Minion; @@ -133,7 +136,7 @@ local $EVAL_ERROR = undef; eval ################################################################################################################################ # Process check command ################################################################################################################################ - if (commandTest(CMD_CHECK)) + if (cfgCommandTest(CFGCMD_CHECK)) { # Load module dynamically require pgBackRest::Check::Check; @@ -145,12 +148,12 @@ local $EVAL_ERROR = undef; eval ################################################################################################################################ # Process start/stop commands ################################################################################################################################ - if (commandTest(CMD_START)) + if (cfgCommandTest(CFGCMD_START)) { lockStart(); exitSafe(0); } - elsif (commandTest(CMD_STOP)) + elsif (cfgCommandTest(CFGCMD_STOP)) { lockStop(); exitSafe(0); @@ -160,15 +163,15 @@ local $EVAL_ERROR = undef; eval require pgBackRest::Protocol::Storage::Helper; pgBackRest::Protocol::Storage::Helper->import(); - if (isRepoLocal() && !optionTest(OPTION_REPO_TYPE, REPO_TYPE_S3) && !storageRepo()->pathExists('')) + if (isRepoLocal() && !cfgOptionTest(CFGOPT_REPO_TYPE, CFGOPTVAL_REPO_TYPE_S3) && !storageRepo()->pathExists('')) { - confess &log(ERROR, 'repo-path \'' . optionGet(OPTION_REPO_PATH) . '\' does not exist', ERROR_PATH_MISSING); + confess &log(ERROR, 'repo-path \'' . cfgOption(CFGOPT_REPO_PATH) . '\' does not exist', ERROR_PATH_MISSING); } ################################################################################################################################ # Process info command ################################################################################################################################ - if (commandTest(CMD_INFO)) + if (cfgCommandTest(CFGCMD_INFO)) { # Load module dynamically require pgBackRest::Info; @@ -180,21 +183,25 @@ local $EVAL_ERROR = undef; eval ################################################################################################################################ # Acquire the command lock ################################################################################################################################ - lockAcquire(commandGet()); + lockAcquire(cfgCommandName(cfgCommandGet())); ################################################################################################################################ # Open the log file ################################################################################################################################ - logFileSet(optionGet(OPTION_LOG_PATH) . '/' . optionGet(OPTION_STANZA) . '-' . lc(commandGet())); + require pgBackRest::Storage::Helper; + pgBackRest::Storage::Helper->import(); + + logFileSet( + storageLocal(), cfgOption(CFGOPT_LOG_PATH) . '/' . cfgOption(CFGOPT_STANZA) . '-' . lc(cfgCommandName(cfgCommandGet()))); ################################################################################################################################ # Process stanza-create command ################################################################################################################################ - if (commandTest(CMD_STANZA_CREATE) || commandTest(CMD_STANZA_UPGRADE)) + if (cfgCommandTest(CFGCMD_STANZA_CREATE) || cfgCommandTest(CFGCMD_STANZA_UPGRADE)) { if (!isRepoLocal()) { - confess &log(ERROR, commandGet() . ' command must be run on the backup host', ERROR_HOST_INVALID); + confess &log(ERROR, cfgCommandName(cfgCommandGet()) . ' command must be run on the backup host', ERROR_HOST_INVALID); } # Load module dynamically @@ -207,7 +214,7 @@ local $EVAL_ERROR = undef; eval ################################################################################################################################ # RESTORE ################################################################################################################################ - if (commandTest(CMD_RESTORE)) + if (cfgCommandTest(CFGCMD_RESTORE)) { if (!isDbLocal()) { @@ -236,7 +243,7 @@ local $EVAL_ERROR = undef; eval ############################################################################################################################ # BACKUP ############################################################################################################################ - if (commandTest(CMD_BACKUP)) + if (cfgCommandTest(CFGCMD_BACKUP)) { # Load module dynamically require pgBackRest::Backup::Backup; @@ -244,13 +251,13 @@ local $EVAL_ERROR = undef; eval new pgBackRest::Backup::Backup()->process(); - commandSet(CMD_EXPIRE); + cfgCommandSet(CFGCMD_EXPIRE); } ############################################################################################################################ # EXPIRE ############################################################################################################################ - if (commandTest(CMD_EXPIRE)) + if (cfgCommandTest(CFGCMD_EXPIRE)) { # Load module dynamically require pgBackRest::Expire; diff --git a/build/lib/pgBackRestBuild/Build.pm b/build/lib/pgBackRestBuild/Build.pm new file mode 100644 index 000000000..cb282ab09 --- /dev/null +++ b/build/lib/pgBackRestBuild/Build.pm @@ -0,0 +1,181 @@ +#################################################################################################################################### +# Auto-Generate C Files Required for Build +#################################################################################################################################### +package pgBackRestBuild::Build; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); +use English '-no_match_vars'; + +use Exporter qw(import); + our @EXPORT = qw(); +use Storable qw(dclone); + +use pgBackRest::Common::Log; +use pgBackRest::Common::String; +use pgBackRest::Storage::Local; +use pgBackRest::Storage::Posix::Driver; + +use pgBackRestBuild::Build::Common; +use pgBackRestBuild::CodeGen::Common; +use pgBackRestBuild::CodeGen::Truth; +use pgBackRestBuild::Config::Build; + +#################################################################################################################################### +# buildAll - execute all build functions and generate C source code +#################################################################################################################################### +sub buildAll +{ + my $strBuildPath = shift; + + # Storage object + my $oStorage = new pgBackRest::Storage::Local( + $strBuildPath, new pgBackRest::Storage::Posix::Driver({bFileSync => false, bPathSync => false})); + + # Build and output source code + #------------------------------------------------------------------------------------------------------------------------------- + my $rhBuild = + { + 'src/config' => buildConfig(), + }; + + foreach my $strPath (sort(keys(%{$rhBuild}))) + { + foreach my $strFile (sort(keys(%{$rhBuild->{$strPath}{&BLD_FILE}}))) + { + my $rhFile = $rhBuild->{$strPath}{&BLD_FILE}{$strFile}; + my $rhFileFunction = $rhFile->{&BLD_FUNCTION}; + my $rhFileConstant = $rhFile->{&BLD_CONSTANT_GROUP}; + my $rhSource; + + # Build the markdown documentation + #------------------------------------------------------------------------------------------------------------------------------- + if (defined($rhFileFunction)) + { + my $strTruthTable = '# ' . $rhFile->{&BLD_SUMMARY} . "\n"; + + foreach my $strFunction (sort(keys(%{$rhFileFunction}))) + { + my $rhFunction = $rhFileFunction->{$strFunction}; + + next if !defined($rhFunction->{&BLD_MATRIX}); + + # Build function summary + my $strSummary = ucfirst($rhFunction->{&BLD_SUMMARY}); + $strSummary .= $strSummary =~ /\?$/ ? '' : '.'; + + $strTruthTable .= + "\n## ${strFunction}\n\n" . + "${strSummary}\n\n" . + "### Truth Table:\n\n"; + + my $strTruthDefault; + my $strTruthSummary; + + # Does this function depend on the result of another function + if (defined($rhFunction->{&BLD_FUNCTION_DEPEND})) + { + $strTruthSummary .= + 'This function is valid when `' . $rhFunction->{&BLD_FUNCTION_DEPEND} . '()` = `' . + cgenTypeFormat(CGEN_DATATYPE_BOOL, $rhFunction->{&BLD_FUNCTION_DEPEND_RESULT}) . '`.'; + } + + # Are there permutations which are excluded? + if (exists($rhFunction->{&BLD_TRUTH_DEFAULT})) + { + $strTruthDefault = + defined($rhFunction->{&BLD_TRUTH_DEFAULT}) ? $rhFunction->{&BLD_TRUTH_DEFAULT} : CGEN_DATAVAL_NULL; + + $strTruthSummary .= + (defined($strTruthSummary) ? ' ' : '') . + 'Permutations that return `' . + cgenTypeFormat( + $rhFunction->{&BLD_RETURN_TYPE}, + defined($rhFunction->{&BLD_RETURN_VALUE_MAP}) && + defined($rhFunction->{&BLD_RETURN_VALUE_MAP}->{$strTruthDefault}) ? + $rhFunction->{&BLD_RETURN_VALUE_MAP}->{$strTruthDefault} : $strTruthDefault) . + "` are excluded for brevity."; + } + + # Build the truth table + $strTruthTable .= + (defined($strTruthSummary) ? "${strTruthSummary}\n\n" : '') . + cgenTruthTable( + $strFunction, $rhFunction->{&BLD_PARAM}, $rhFunction->{&BLD_RETURN_TYPE}, $strTruthDefault, + $rhFunction->{&BLD_MATRIX}, BLDLCL_PARAM_COMMANDID, $rhBuild->{$strPath}{&BLD_PARAM_LABEL}, + $rhFunction->{&BLD_RETURN_VALUE_MAP}); + } + + $rhSource->{&BLD_MD} = $strTruthTable; + } + + # Build general banner + #------------------------------------------------------------------------------------------------------------------------------- + my $strBanner = cgenBanner($rhFile->{&BLD_SUMMARY}); + + # Build header file + #------------------------------------------------------------------------------------------------------------------------------- + if (defined($rhFileConstant)) + { + my $strHeaderDefine = uc($strFile) . '_AUTO_H'; + + my $strHeader = + $strBanner . + "#ifndef ${strHeaderDefine}\n" . + "#define ${strHeaderDefine}\n"; + + # Iterate constant groups + foreach my $strConstantGroup (sort(keys(%{$rhFileConstant}))) + { + my $rhConstantGroup = $rhFileConstant->{$strConstantGroup}; + + $strHeader .= "\n" . cgenBanner($rhConstantGroup->{&BLD_SUMMARY} . ' constants'); + + # Iterate constants + foreach my $strConstant (sort(keys(%{$rhConstantGroup->{&BLD_CONSTANT}}))) + { + my $rhConstant = $rhConstantGroup->{&BLD_CONSTANT}{$strConstant}; + + $strHeader .= + "#define ${strConstant} " . (' ' x (69 - length($strConstant) - 10)) . + $rhConstant->{&BLD_CONSTANT_VALUE} . "\n"; + } + } + + $strHeader .= + "\n#endif"; + + $rhSource->{&BLD_HEADER} = $strHeader; + } + + # Build C file + #----------------------------------------------------------------------------------------------------------------------- + my $strFunctionCode = $strBanner; + + foreach my $strFunction (sort(keys(%{$rhFileFunction}))) + { + my $rhFunction = $rhFileFunction->{$strFunction}; + + $strFunctionCode .= + "\n" . cgenFunction($strFunction, $rhFunction->{&BLD_SUMMARY}, undef, $rhFunction->{&BLD_SOURCE}); + } + + $rhSource->{&BLD_C} = $strFunctionCode; + + # Output files + #----------------------------------------------------------------------------------------------------------------------- + foreach my $strFileType (sort(keys(%{$rhSource}))) + { + $oStorage->put("${strPath}/${strFile}.auto.${strFileType}", trim($rhSource->{$strFileType}) . "\n"); + } + } + } + + # Return build hash to caller for further processing + return $rhBuild; +} + +push @EXPORT, qw(buildAll); + +1; diff --git a/build/lib/pgBackRestBuild/Build/Common.pm b/build/lib/pgBackRestBuild/Build/Common.pm new file mode 100644 index 000000000..9d9cc7983 --- /dev/null +++ b/build/lib/pgBackRestBuild/Build/Common.pm @@ -0,0 +1,67 @@ +#################################################################################################################################### +# Build Constants and Functions +#################################################################################################################################### +package pgBackRestBuild::Build::Common; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); +use English '-no_match_vars'; + +use Cwd qw(abs_path); +use Exporter qw(import); + our @EXPORT = qw(); +use Storable qw(dclone); + +#################################################################################################################################### +# Constants +#################################################################################################################################### +use constant BLD_PATH => 'path'; + push @EXPORT, qw(BLD_PATH); +use constant BLD_FILE => 'file'; + push @EXPORT, qw(BLD_FILE); + +use constant BLD_C => 'c'; + push @EXPORT, qw(BLD_C); +use constant BLD_HEADER => 'h'; + push @EXPORT, qw(BLD_HEADER); +use constant BLD_MD => 'md'; + push @EXPORT, qw(BLD_MD); + +use constant BLD_SUMMARY => 'summary'; + push @EXPORT, qw(BLD_SUMMARY); + +use constant BLD_CONSTANT => 'constant'; + push @EXPORT, qw(BLD_CONSTANT); +use constant BLD_CONSTANT_EXPORT => 'constantExport'; + push @EXPORT, qw(BLD_CONSTANT_EXPORT); +use constant BLD_CONSTANT_GROUP => 'constantGroup'; + push @EXPORT, qw(BLD_CONSTANT_GROUP); +use constant BLD_CONSTANT_VALUE => 'constantValue'; + push @EXPORT, qw(BLD_CONSTANT_VALUE); + +use constant BLD_FUNCTION => 'function'; + push @EXPORT, qw(BLD_FUNCTION); +use constant BLD_FUNCTION_DEPEND => 'functionDepend'; + push @EXPORT, qw(BLD_FUNCTION_DEPEND); +use constant BLD_FUNCTION_DEPEND_RESULT => 'functionDependResult'; + push @EXPORT, qw(BLD_FUNCTION_DEPEND_RESULT); + +use constant BLD_PARAM => 'param'; + push @EXPORT, qw(BLD_PARAM); +use constant BLD_PARAM_LABEL => 'paramLabel'; + push @EXPORT, qw(BLD_PARAM_LABEL); +use constant BLD_RETURN_TYPE => 'returnType'; + push @EXPORT, qw(BLD_RETURN_TYPE); +use constant BLD_RETURN_VALUE_MAP => 'returnValueMap'; + push @EXPORT, qw(BLD_RETURN_VALUE_MAP); + +use constant BLD_TRUTH_DEFAULT => 'truthDefault'; + push @EXPORT, qw(BLD_TRUTH_DEFAULT); + +use constant BLD_MATRIX => 'buildMatrix'; + push @EXPORT, qw(BLD_MATRIX); +use constant BLD_SOURCE => 'buildSource'; + push @EXPORT, qw(BLD_SOURCE); + +1; diff --git a/build/lib/pgBackRestBuild/CodeGen/Common.pm b/build/lib/pgBackRestBuild/CodeGen/Common.pm new file mode 100644 index 000000000..86054621d --- /dev/null +++ b/build/lib/pgBackRestBuild/CodeGen/Common.pm @@ -0,0 +1,169 @@ +#################################################################################################################################### +# C Code Generation Formatting Functions +#################################################################################################################################### +package pgBackRestBuild::CodeGen::Common; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); +use English '-no_match_vars'; + +use Exporter qw(import); + our @EXPORT = qw(); + +use pgBackRest::Common::Log; +use pgBackRest::Common::String; + +#################################################################################################################################### +# Generate functions that return config rule data +#################################################################################################################################### +use constant CGEN_DATATYPE_BOOL => 'bool'; + push @EXPORT, qw(CGEN_DATATYPE_BOOL); +use constant CGEN_DATATYPE_DOUBLE => 'double'; + push @EXPORT, qw(CGEN_DATATYPE_DOUBLE); +use constant CGEN_DATATYPE_INT32 => 'int32'; + push @EXPORT, qw(CGEN_DATATYPE_INT32); +use constant CGEN_DATATYPE_INT64 => 'int64'; + push @EXPORT, qw(CGEN_DATATYPE_INT64); +use constant CGEN_DATATYPE_CONSTCHAR => 'const char *'; + push @EXPORT, qw(CGEN_DATATYPE_CONSTCHAR); + +use constant CGEN_DATAVAL_NULL => '^^{{[[NULL]]}}^^'; + push @EXPORT, qw(CGEN_DATAVAL_NULL); + +#################################################################################################################################### +# cgenBanner - build general banner +#################################################################################################################################### +sub cgenBanner +{ + my $strContent = shift; + + my $strBanner = + qw{/} . (qw{*} x 131) . "\n" . + trim($strContent) . "\n" . + (qw{*} x 131) . qw{/} . "\n"; + + return $strBanner; +} + +push @EXPORT, qw(cgenBanner); + +#################################################################################################################################### +# cgenFunction - format type names for C +#################################################################################################################################### +sub cgenFunction +{ + my $strName = shift; + my $strSummary = shift; + my $strDescription = shift; + my $strSource = shift; + + # Summary should always be defined + if (!defined($strSummary)) + { + confess &log(ASSERT, "${strName} must have a summary"); + } + + # Make sure summary will fit on a single line + my $iLenMax = 132 - 3 - length($strName); + + if (length($strSummary) > $iLenMax) + { + &log(ASSERT, "summary for ${strName} must be <= ${iLenMax} characters"); + } + + my $strFunction = + cgenBanner($strName . (defined($strSummary) ? " - ${strSummary}" : '')) . + $strSource; + + return $strFunction; +} + +push @EXPORT, qw(cgenFunction); + +#################################################################################################################################### +# cgenTypeFormat - format types values for C +#################################################################################################################################### +sub cgenTypeFormat +{ + my $strType = shift; + my $strValue = shift; + + if ($strType eq CGEN_DATATYPE_BOOL) + { + return ($strValue == 1 ? 'true' : 'false'); + } + elsif ($strType eq CGEN_DATATYPE_INT32 || $strType eq CGEN_DATATYPE_INT64 || $strType eq CGEN_DATATYPE_DOUBLE) + { + return $strValue; + } + elsif ($strType eq CGEN_DATATYPE_CONSTCHAR) + { + return ($strValue eq CGEN_DATAVAL_NULL ? 'NULL' : "\"${strValue}\""); + } + + confess "unknown type ${strType}"; +} + +push @EXPORT, qw(cgenTypeFormat); + +#################################################################################################################################### +# cgenTypeName - format type names for C +#################################################################################################################################### +sub cgenTypeName +{ + my $strType = shift; + + if ($strType eq CGEN_DATATYPE_BOOL) + { + return 'bool'; + } + elsif ($strType eq CGEN_DATATYPE_INT32) + { + return 'int32'; + } + elsif ($strType eq CGEN_DATATYPE_INT64) + { + return 'int64'; + } + elsif ($strType eq CGEN_DATATYPE_DOUBLE) + { + return 'double'; + } + elsif ($strType eq CGEN_DATATYPE_CONSTCHAR) + { + return 'const char *'; + } + + confess "unknown type ${strType}"; +} + +push @EXPORT, qw(cgenTypeName); + +#################################################################################################################################### +# cgenPermute - return all permutations of an array +#################################################################################################################################### +sub cgenPermute +{ + my $rxyList = shift; + + # If there are one or less elements then the existing array represents the only permutation + return map [$_], @$rxyList if @{$rxyList} <= 1; + + # Calculate permutations + my @xyPermutation; + + for my $iIndex (0 .. $#{$rxyList}) + { + my @xyRemaining = @{$rxyList}; + my $xValue = splice(@xyRemaining, $iIndex, 1); + + push @xyPermutation, [$xValue, @$_] for cgenPermute(\@xyRemaining, @{$rxyList} - 1); + } + + return @xyPermutation; +} + +push @EXPORT, qw(cgenPermute); + +1; diff --git a/build/lib/pgBackRestBuild/CodeGen/Lookup.pm b/build/lib/pgBackRestBuild/CodeGen/Lookup.pm new file mode 100644 index 000000000..7deba8e04 --- /dev/null +++ b/build/lib/pgBackRestBuild/CodeGen/Lookup.pm @@ -0,0 +1,86 @@ +#################################################################################################################################### +# Generate C Lookup Functions +#################################################################################################################################### +package pgBackRestBuild::CodeGen::Lookup; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); +use English '-no_match_vars'; + +use Exporter qw(import); + our @EXPORT = qw(); +use Storable qw(dclone); + +use pgBackRest::Common::Log; + +use pgBackRestBuild::CodeGen::Common; + +#################################################################################################################################### +# cgenLookupString - build C function that looks up strings by id +#################################################################################################################################### +sub cgenLookupString +{ + my $strName = shift; + my $strTotal = shift; + my $rhValue = shift; + my $strFilter = shift; + + # Generate list of command strings + my $strFunction = + "const char *szy${strName}Name[${strTotal}] = \n" . + "{\n"; + + my $bFirst = true; + + foreach my $strLookupName (sort(keys(%{$rhValue}))) + { + next if defined($strFilter) && $strLookupName =~ $strFilter; + + $strFunction .= ($bFirst ? '' : ",\n") . " \"${strLookupName}\""; + $bFirst = false; + } + + $strFunction .= + "\n};\n\n"; + + $strFunction .= + "const char *\n" . + "cfg${strName}Name(uint32 ui${strName}Id)\n" . + "{\n" . + " if (ui${strName}Id >= ${strTotal})\n" . + " return NULL;\n" . + "\n" . + " return szy${strName}Name[ui${strName}Id];\n" . + "}\n"; + + return $strFunction; +} + +push @EXPORT, qw(cgenLookupString); + +#################################################################################################################################### +# cgenLookupId - build C function that looks up ids by string +#################################################################################################################################### +sub cgenLookupId +{ + my $strName = shift; + my $strTotal = shift; + + my $strFunction = + "int32\n" . + "cfg${strName}Id(const char *sz${strName}Name)\n" . + "{\n" . + " for (uint32 uiIndex = 0; uiIndex < ${strTotal}; uiIndex++)\n" . + " if (strcmp(sz${strName}Name, cfg${strName}Name(uiIndex)) == 0)\n" . + " return uiIndex;\n" . + "\n" . + " return -1;\n" . + "}\n"; + + return $strFunction; +} + +push @EXPORT, qw(cgenLookupId); + +1; diff --git a/build/lib/pgBackRestBuild/CodeGen/Switch.pm b/build/lib/pgBackRestBuild/CodeGen/Switch.pm new file mode 100644 index 000000000..b3e1f72ad --- /dev/null +++ b/build/lib/pgBackRestBuild/CodeGen/Switch.pm @@ -0,0 +1,288 @@ +#################################################################################################################################### +# Generate C Switch Functions +#################################################################################################################################### +package pgBackRestBuild::CodeGen::Switch; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); +use English '-no_match_vars'; + +use Exporter qw(import); + our @EXPORT = qw(); +use Storable qw(dclone); + +use pgBackRest::Common::Log; +use pgBackRest::Common::String; + +use pgBackRestBuild::CodeGen::Common; + +#################################################################################################################################### +# Cost constants used by optimizer +#################################################################################################################################### +# Cost for setting up a new switch statement +use constant COST_SWITCH => 5; +# Cost for each case +use constant COST_SWITCH_CASE => 1; +# Cost for a clause (which might be shared with multipe cases) +use constant COST_SWITCH_CLAUSE => 2; + +#################################################################################################################################### +# cgenSwitchBuild - build switch statements to perform lookups +#################################################################################################################################### +sub cgenSwitchBuild +{ + my $strName = shift; + my $strType = shift; + my $ryMatrix = dclone(shift); + my $rstryParam = dclone(shift); + my $rhLabelMap = shift; + my $rhValueLabelMap = shift; + + # Build a hash with positions for the data in parameter order + my $rhParamOrder = {}; + + for (my $iIndex = 0; $iIndex < @{$rstryParam}; $iIndex++) + { + $rhParamOrder->{$rstryParam->[$iIndex]} = $iIndex; + } + + # Try each permutation of param order to find the most efficient switch statement + my $iBestCost; + my $strBestSwitch; + + foreach my $rstryParamPermute (cgenPermute($rstryParam)) + { + # Build a hash with positions for the data in permutation order + my $rhPermuteOrder = {}; + + for (my $iIndex = 0; $iIndex < @{$rstryParamPermute}; $iIndex++) + { + $rhPermuteOrder->{$rstryParamPermute->[$iIndex]} = $iIndex; + } + + # Arrange data in permutation order so later functions don't have to remap for every operation + my @yMatrixPermute; + + foreach my $rxyEntry (@{$ryMatrix}) + { + my @xyEntryPermute; + + for (my $iSwapIdx = 0; $iSwapIdx < @{$rstryParam}; $iSwapIdx++) + { + $xyEntryPermute[$rhPermuteOrder->{$rstryParam->[$iSwapIdx]}] = + $rxyEntry->[$rhParamOrder->{$rstryParam->[$iSwapIdx]}]; + } + + # Convert the value to a special string if it is null to ease later prcessing + $xyEntryPermute[@{$rstryParam}] = defined($rxyEntry->[-1]) ? $rxyEntry->[-1] : CGEN_DATAVAL_NULL; + + push(@yMatrixPermute, \@xyEntryPermute); + } + + # Build switch based on current param permutation + my ($strSwitch, $iCost) = cgenSwitchBuildSub( + $strType, \@yMatrixPermute, 0, $rstryParamPermute, $rhLabelMap, $rhValueLabelMap); + + # If the switch has a lower cost than the existing one then use it instead + if (!defined($iBestCost) || $iCost < $iBestCost) + { + $iBestCost = $iCost; + $strBestSwitch = $strSwitch; + } + } + + # Construct the function based on the best switch statement + return + cgenTypeName($strType) . "\n" . + "${strName}(uint32 " . join(', uint32 ', @{$rstryParam}) . ")\n" . + "{\n" . + "${strBestSwitch}\n" . + "}\n"; +} + +push @EXPORT, qw(cgenSwitchBuild); + +#################################################################################################################################### +# cgenSwitchBuildSub - build individual switch statements recursively +#################################################################################################################################### +sub cgenSwitchBuildSub +{ + my $strType = shift; + my $rstryMatrix = dclone(shift); + my $iDepth = shift; + my $rstryParam = dclone(shift); + my $rhLabelMap = shift; + my $rhValueLabelMap = shift; + my $xMostCommonParentValue = shift; + + # How much to indent the code is based on the current depth + my $strIndent = (' ' x (($iDepth * 2) + 1)); + + # Set initial cost for setting up the switch statement + my $iCost = COST_SWITCH; + + # Get the param to be used for the switch statement + my $strParam = shift(@{$rstryParam}); + + # Determine the most common value + my $iMostCommonTotal = 0; + my $xMostCommonValue; + my $rhMostCommon = {}; + + foreach my $rxyEntry (@{$rstryMatrix}) + { + my $xValue = $rxyEntry->[-1]; + + $rhMostCommon->{$xValue} = (defined($rhMostCommon->{$xValue}) ? $rhMostCommon->{$xValue} : 0) + 1; + + if ($rhMostCommon->{$xValue} > $iMostCommonTotal) + { + $iMostCommonTotal = $rhMostCommon->{$xValue}; + $xMostCommonValue = $xValue; + } + } + + # Keep going until all keys are exhausted + my $rhClauseHash; + + while (@{$rstryMatrix} > 0) + { + # Start processing the first key in the list + my $strKeyTop = $rstryMatrix->[0][0]; + + # A list of keys values to be passed to the next switch statement + my @stryEntrySub; + + # Find all instances of the key and build a hash representing the distinct list of values + my $rhKeyValue = {}; + my $iEntryIdx = 0; + + while ($iEntryIdx < @{$rstryMatrix}) + { + # If this key matches the top key then process + if ($rstryMatrix->[$iEntryIdx][0] eq $strKeyTop) + { + # Add value to unique list + $rhKeyValue->{$rstryMatrix->[$iEntryIdx][-1]} = true; + + # Get the key/value entry, remove the top key, and store for the next switch statement + my @stryEntry = @{$rstryMatrix->[$iEntryIdx]}; + shift(@stryEntry); + push(@stryEntrySub, \@stryEntry); + + # Remove the key from the list + splice(@{$rstryMatrix}, $iEntryIdx, 1); + } + # else move on to the next key + else + { + $iEntryIdx++; + } + }; + + # Only need a switch if there is more than one value or the one value is not the most common value + if (keys(%{$rhKeyValue}) > 1 || $stryEntrySub[0][-1] ne $xMostCommonValue) + { + my $strClause = ''; + + $iCost += COST_SWITCH_CASE; + + # Process next switch + if (keys(%{$rhKeyValue}) > 1 && @{$stryEntrySub[0]} > 1) + { + my ($strClauseSub, $iCostSub) = cgenSwitchBuildSub( + $strType, \@stryEntrySub, $iDepth + 1, $rstryParam, $rhLabelMap, $rhValueLabelMap, $xMostCommonValue); + + $strClause .= $strClauseSub . "\n"; + $iCost += $iCostSub; + } + # Return the value + else + { + my $strRetVal = $stryEntrySub[0][-1]; + + $strClause .= + "${strIndent} return " . + cgenTypeFormat( + $strType, + defined($rhValueLabelMap) && defined($rhValueLabelMap->{$strRetVal}) ? + $rhValueLabelMap->{$strRetVal} : $strRetVal) . + ";\n"; + } + + # Store the key and the clause in a hash to deduplicate + push(@{$rhClauseHash->{$strClause}{key}}, int($strKeyTop)); + } + } + + # Reorder clause based on an numerical/alpha representation of the case statements. This is done for primarily for readability + # but may have some optimization benefits since integer keys are ordered numerically. + my $rhClauseOrderedHash; + + foreach my $strClause (sort(keys(%{$rhClauseHash}))) + { + my $strKey; + + foreach my $iKey (@{$rhClauseHash->{$strClause}{key}}) + { + $strKey .= (defined($strKey) ? '' : ',') . sprintf('%07d', $iKey); + } + + $rhClauseOrderedHash->{$strKey}{clause} = $strClause; + $rhClauseOrderedHash->{$strKey}{key} = $rhClauseHash->{$strClause}{key}; + } + + # Build the switch statement + my $bFirst = true; + my $strFunction = + "${strIndent}switch (${strParam})\n" . + "${strIndent}{\n"; + + # Retrieve each unique clause and create a case for each key assocated with it + foreach my $strKey (sort(keys(%{$rhClauseOrderedHash}))) + { + if (!$bFirst) + { + $strFunction .= "\n"; + } + + foreach my $strKey (@{$rhClauseOrderedHash->{$strKey}{key}}) + { + $iCost += COST_SWITCH_CLAUSE; + + $strFunction .= + "${strIndent} case " . + (defined($rhLabelMap->{$strParam}) ? $rhLabelMap->{$strParam}{int($strKey)} : int($strKey)) . ":\n"; + } + + $strFunction .= $rhClauseOrderedHash->{$strKey}{clause}; + $bFirst = false; + } + + $strFunction .= + "${strIndent}}\n\n"; + + # If the most common value is the same as the parent then break instead of returning the same value. Returning the same value + # again might be slightly more efficient but the break makes it easier to debug where values are coming from. + if (defined($xMostCommonParentValue) && $xMostCommonValue eq $xMostCommonParentValue) + { + $strFunction .= + "${strIndent}break;"; + } + # Else return the most common value + else + { + $strFunction .= + "${strIndent}return " . + cgenTypeFormat( + $strType, + defined($rhValueLabelMap) && defined($rhValueLabelMap->{$xMostCommonValue}) ? + $rhValueLabelMap->{$xMostCommonValue} : $xMostCommonValue) . + ";"; + } + + return $strFunction, $iCost; +} + +1; diff --git a/build/lib/pgBackRestBuild/CodeGen/Truth.pm b/build/lib/pgBackRestBuild/CodeGen/Truth.pm new file mode 100644 index 000000000..2b903c5f1 --- /dev/null +++ b/build/lib/pgBackRestBuild/CodeGen/Truth.pm @@ -0,0 +1,173 @@ +#################################################################################################################################### +# Generate Truth Tables in Markdown Format +#################################################################################################################################### +package pgBackRestBuild::CodeGen::Truth; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); +use English '-no_match_vars'; + +use Exporter qw(import); + our @EXPORT = qw(); +use Storable qw(dclone); + +use pgBackRest::Common::Log; + +use pgBackRestBuild::CodeGen::Common; + +#################################################################################################################################### +# cgenTruthTable - Main builder +#################################################################################################################################### +sub cgenTruthTable +{ + my $strFunction = shift; + my $rstryParam = shift; + my $strReturnType = shift; + my $strReturnDefault = shift; + my $rxyMatrix = shift; + my $strRedundantParam = shift; + my $rhParamValueMap = shift; + my $rhReturnValueMap = shift; + + # Write table header + my $strTruthTable = '| Function'; + + for (my $iParamIdx = 0; $iParamIdx < @{$rstryParam}; $iParamIdx++) + { + $strTruthTable .= ' | ' . $rstryParam->[$iParamIdx]; + } + + $strTruthTable .= + " | Result |\n" . + '| --------'; + + for (my $iParamIdx = 0; $iParamIdx < @{$rstryParam}; $iParamIdx++) + { + $strTruthTable .= ' | ' . ('-' x length($rstryParam->[$iParamIdx])); + } + + $strTruthTable .= + " | ------ |\n"; + + # Format matrix data so that can be ordered (even by integer) + my @stryOrderedMatrix; + + foreach my $rxyEntry (@{$rxyMatrix}) + { + my $strEntry; + + for (my $iEntryIdx = 0; $iEntryIdx < @{$rxyEntry}; $iEntryIdx++) + { + my $strValue = defined($rxyEntry->[$iEntryIdx]) ? $rxyEntry->[$iEntryIdx] : CGEN_DATAVAL_NULL; + + if ($iEntryIdx != @{$rxyEntry} - 1) + { + $strEntry .= (defined($strEntry) ? '~' : '') . sprintf('%016d', $strValue); + } + else + { + $strEntry .= '~' . $strValue; + } + } + + push(@stryOrderedMatrix, $strEntry); + } + + # Optimize away one parameter that is frequently redundant + my $rhMatrixFilter; + my @stryFilteredMatrix; + + if ($rstryParam->[0] eq $strRedundantParam) + { + foreach my $strEntry (sort(@stryOrderedMatrix)) + { + my @xyEntry = split('\~', $strEntry); + + shift(@xyEntry); + my $strValue = pop(@xyEntry); + my $strKey = join('~', @xyEntry); + + push(@{$rhMatrixFilter->{$strKey}{entry}}, $strEntry); + $rhMatrixFilter->{$strKey}{value}{$strValue} = true; + } + + foreach my $strKey (sort(keys(%{$rhMatrixFilter}))) + { + if (keys(%{$rhMatrixFilter->{$strKey}{value}}) == 1) + { + my $strEntry = + + push( + @stryFilteredMatrix, + CGEN_DATAVAL_NULL . "~${strKey}~" . (keys(%{$rhMatrixFilter->{$strKey}{value}}))[0]); + } + else + { + push(@stryFilteredMatrix, @{$rhMatrixFilter->{$strKey}{entry}}); + } + } + } + else + { + @stryFilteredMatrix = @stryOrderedMatrix; + } + + # Output function entry + foreach my $strEntry (sort(@stryFilteredMatrix)) + { + my @xyEntry = split('\~', $strEntry); + my $strRow = '| ' . $strFunction; + my $strValue; + + for (my $iEntryIdx = 0; $iEntryIdx < @xyEntry; $iEntryIdx++) + { + $strValue = $xyEntry[$iEntryIdx]; + $strRow .= ' | '; + + if ($iEntryIdx != @xyEntry - 1) + { + my $strParam = $rstryParam->[$iEntryIdx]; + + if ($strValue eq CGEN_DATAVAL_NULL) + { + $strRow .= '_\_'; + } + else + { + $strRow .= + '`' . + (defined($rhParamValueMap->{$strParam}) ? + $rhParamValueMap->{$strParam}{int($strValue)} : int($strValue)) . + '`'; + } + } + else + { + $strRow .= + '`' . + cgenTypeFormat( + $strReturnType, + defined($rhReturnValueMap) && + defined($rhReturnValueMap->{$strValue}) ? + $rhReturnValueMap->{$strValue} : $strValue) . + '`'; + + } + } + + # If default default value is returned then skip this entry + if (defined($strReturnDefault) && $strReturnDefault eq $strValue) + { + next; + } + + $strTruthTable .= "${strRow} |\n"; + } + + return $strTruthTable; +} + +push @EXPORT, qw(cgenTruthTable); + +1; diff --git a/build/lib/pgBackRestBuild/Config/Build.pm b/build/lib/pgBackRestBuild/Config/Build.pm new file mode 100644 index 000000000..2e1a04990 --- /dev/null +++ b/build/lib/pgBackRestBuild/Config/Build.pm @@ -0,0 +1,656 @@ +#################################################################################################################################### +# Build Makefile and Auto-Generate Files Required for Build +#################################################################################################################################### +package pgBackRestBuild::Config::Build; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); +use English '-no_match_vars'; + +use Cwd qw(abs_path); +use Exporter qw(import); + our @EXPORT = qw(); +use File::Basename qw(dirname); +use Storable qw(dclone); + +use pgBackRest::Common::Log; +use pgBackRest::Common::String; +use pgBackRest::Config::Data; +use pgBackRest::Config::Rule; +use pgBackRest::Version; + +use pgBackRestBuild::Build::Common; +use pgBackRestBuild::CodeGen::Common; +use pgBackRestBuild::CodeGen::Lookup; +use pgBackRestBuild::CodeGen::Switch; +use pgBackRestBuild::Config::Rule; + +#################################################################################################################################### +# Constants +#################################################################################################################################### +use constant BLDLCL_FILE_CONFIG => 'config'; +use constant BLDLCL_FILE_CONFIG_RULE => BLDLCL_FILE_CONFIG . 'Rule'; + +use constant BLDLCL_PARAM_OPTIONID => 'uiOptionId'; +use constant BLDLCL_PARAM_COMMANDID => 'uiCommandId'; + push @EXPORT, qw(BLDLCL_PARAM_COMMANDID); +use constant BLDLCL_PARAM_VALUEID => 'uiValueId'; + +use constant BLDLCL_CONSTANT_COMMAND => 'CFGCMDDEF'; +use constant BLDLCL_CONSTANT_COMMAND_TOTAL => BLDLCL_CONSTANT_COMMAND . '_TOTAL'; + +use constant BLDLCL_CONSTANT_OPTION => 'CFGOPTDEF'; +use constant BLDLCL_CONSTANT_OPTION_TOTAL => BLDLCL_CONSTANT_OPTION . '_TOTAL'; +use constant BLDLCL_CONSTANT_OPTION_TYPE => BLDLCL_CONSTANT_OPTION . '_TYPE'; + +use constant BLDLCL_PREFIX_COMMAND => 'cfgCommand'; + +use constant BLDLCL_FUNCTION_COMMAND_NAME => BLDLCL_PREFIX_COMMAND . 'Name'; +use constant BLDLCL_FUNCTION_COMMAND_ID => BLDLCL_PREFIX_COMMAND . 'Id'; + +use constant BLDLCL_PREFIX_OPTION => 'cfgOption'; + +use constant BLDLCL_FUNCTION_INDEX_TOTAL => BLDLCL_PREFIX_OPTION . 'IndexTotal'; +use constant BLDLCL_FUNCTION_OPTION_NAME => BLDLCL_PREFIX_OPTION . 'Name'; +use constant BLDLCL_FUNCTION_OPTION_ID => BLDLCL_PREFIX_OPTION . 'Id'; + +use constant BLDLCL_PREFIX_RULE_OPTION => 'cfgRuleOption'; + +use constant BLDLCL_FUNCTION_ALLOW_LIST => BLDLCL_PREFIX_RULE_OPTION . 'AllowList'; +use constant BLDLCL_FUNCTION_ALLOW_LIST_VALUE => BLDLCL_FUNCTION_ALLOW_LIST . 'Value'; +use constant BLDLCL_FUNCTION_ALLOW_LIST_VALUE_TOTAL => BLDLCL_FUNCTION_ALLOW_LIST_VALUE . 'Total'; + +use constant BLDLCL_FUNCTION_ALLOW_RANGE => BLDLCL_PREFIX_RULE_OPTION . 'AllowRange'; +use constant BLDLCL_FUNCTION_ALLOW_RANGE_MAX => BLDLCL_FUNCTION_ALLOW_RANGE . 'Max'; +use constant BLDLCL_FUNCTION_ALLOW_RANGE_MIN => BLDLCL_FUNCTION_ALLOW_RANGE . 'Min'; + +use constant BLDLCL_FUNCTION_DEFAULT => BLDLCL_PREFIX_RULE_OPTION . "Default"; + +use constant BLDLCL_FUNCTION_DEPEND => BLDLCL_PREFIX_RULE_OPTION . 'Depend'; +use constant BLDLCL_FUNCTION_DEPEND_OPTION => BLDLCL_FUNCTION_DEPEND . 'Option'; +use constant BLDLCL_FUNCTION_DEPEND_VALUE => BLDLCL_FUNCTION_DEPEND . 'Value'; +use constant BLDLCL_FUNCTION_DEPEND_VALUE_TOTAL => BLDLCL_FUNCTION_DEPEND_VALUE . 'Total'; + +use constant BLDLCL_FUNCTION_HINT => BLDLCL_PREFIX_RULE_OPTION . 'Hint'; +use constant BLDLCL_FUNCTION_NAME_ALT => BLDLCL_PREFIX_RULE_OPTION . 'NameAlt'; +use constant BLDLCL_FUNCTION_NEGATE => BLDLCL_PREFIX_RULE_OPTION . 'Negate'; +use constant BLDLCL_FUNCTION_PREFIX => BLDLCL_PREFIX_RULE_OPTION . 'Prefix'; +use constant BLDLCL_FUNCTION_REQUIRED => BLDLCL_PREFIX_RULE_OPTION . 'Required'; +use constant BLDLCL_FUNCTION_SECTION => BLDLCL_PREFIX_RULE_OPTION . 'Section'; +use constant BLDLCL_FUNCTION_SECURE => BLDLCL_PREFIX_RULE_OPTION . 'Secure'; +use constant BLDLCL_FUNCTION_TYPE => BLDLCL_PREFIX_RULE_OPTION . 'Type'; +use constant BLDLCL_FUNCTION_VALID => BLDLCL_PREFIX_RULE_OPTION . 'Valid'; +use constant BLDLCL_FUNCTION_VALUE_HASH => BLDLCL_PREFIX_RULE_OPTION . 'ValueHash'; + +#################################################################################################################################### +# Build command constant maps +#################################################################################################################################### +my $rhCommandIdConstantMap; +my $rhCommandNameConstantMap; +my $rhCommandNameIdMap; +my $iCommandTotal = 0; + +foreach my $strCommand (sort(keys(%{cfgbldCommandGet()}))) +{ + my $strCommandConstant = "CFGCMD_" . uc($strCommand); + $strCommandConstant =~ s/\-/\_/g; + + $rhCommandIdConstantMap->{$iCommandTotal} = $strCommandConstant; + $rhCommandNameConstantMap->{$strCommand} = $strCommandConstant; + $rhCommandNameIdMap->{$strCommand} = $iCommandTotal; + + $iCommandTotal++; +}; + +#################################################################################################################################### +# Build option constant maps +#################################################################################################################################### +my $rhOptionIdConstantMap; +my $rhOptionNameConstantMap; +my $rhOptionNameIdMap; +my $iOptionTotal = 0; +my $rhOptionRule = cfgdefRuleIndex(); +my @stryOptionAlt; + +foreach my $strOption (sort(keys(%{$rhOptionRule}))) +{ + my $rhOption = $rhOptionRule->{$strOption}; + my $strOptionConstant = "CFGOPT_" . uc($strOption); + $strOptionConstant =~ s/\-/\_/g; + + $rhOptionIdConstantMap->{$iOptionTotal} = $strOptionConstant; + $rhOptionNameConstantMap->{$strOption} = $strOptionConstant; + $rhOptionNameIdMap->{$strOption} = $iOptionTotal; + + # Create constants for the db- alt names + my $strOptionAlt = $rhOption->{&CFGBLDDEF_RULE_ALT_NAME}; + + if (defined($strOptionAlt) && $strOptionAlt =~ /^db-/) + { + $strOptionConstant = "CFGOPT_" . uc($strOptionAlt); + $strOptionConstant =~ s/\-/\_/g; + + $rhOptionNameConstantMap->{$strOptionAlt} = $strOptionConstant; + $rhOptionNameIdMap->{$strOptionAlt} = $iOptionTotal; + + push(@stryOptionAlt, $strOptionAlt); + } + + $iOptionTotal++; +}; + +#################################################################################################################################### +# Build option type constant maps +#################################################################################################################################### +my $rhOptionTypeIdConstantMap; +my $rhOptionTypeNameConstantMap; +my $rhOptionTypeNameIdMap; +my $iOptionTypeTotal = 0; + +foreach my $strOption (sort(keys(%{$rhOptionRule}))) +{ + my $strOptionType = $rhOptionRule->{$strOption}{&CFGBLDDEF_RULE_TYPE}; + + if (!defined($rhOptionTypeNameConstantMap->{$strOptionType})) + { + my $strOptionTypeConstant = BLDLCL_CONSTANT_OPTION_TYPE . '_' . uc($strOptionType); + $strOptionTypeConstant =~ s/\-/\_/g; + + $rhOptionTypeIdConstantMap->{$iOptionTypeTotal} = $strOptionTypeConstant; + $rhOptionTypeNameConstantMap->{$strOptionType} = $strOptionTypeConstant; + $rhOptionTypeNameIdMap->{$strOptionType} = $iOptionTypeTotal; + + $iOptionTypeTotal++; + } +}; + +#################################################################################################################################### +# Definitions for functions to build +#################################################################################################################################### +my $rhBuild = +{ + &BLD_PARAM_LABEL => + { + &BLDLCL_PARAM_OPTIONID => $rhOptionIdConstantMap, + &BLDLCL_PARAM_COMMANDID => $rhCommandIdConstantMap, + }, + + &BLD_FILE => + { + #--------------------------------------------------------------------------------------------------------------------------- + &BLDLCL_FILE_CONFIG => + { + &BLD_SUMMARY => 'Query Configuration Settings', + + &BLD_CONSTANT_GROUP => + { + &BLDLCL_CONSTANT_COMMAND => + { + &BLD_SUMMARY => 'Command', + + &BLD_CONSTANT => + { + &BLDLCL_CONSTANT_COMMAND_TOTAL => + { + &BLD_CONSTANT_VALUE => $iCommandTotal, + }, + }, + }, + + &BLDLCL_CONSTANT_OPTION => + { + &BLD_SUMMARY => 'Option', + + &BLD_CONSTANT => + { + &BLDLCL_CONSTANT_OPTION_TOTAL => + { + &BLD_CONSTANT_VALUE => $iOptionTotal, + }, + }, + }, + + &BLDLCL_CONSTANT_OPTION_TYPE => + { + &BLD_SUMMARY => 'Option type', + &BLD_CONSTANT => {}, + }, + }, + + &BLD_FUNCTION => + { + &BLDLCL_FUNCTION_COMMAND_NAME => + { + &BLD_SUMMARY => 'lookup command name using command id', + }, + + &BLDLCL_FUNCTION_INDEX_TOTAL => + { + &BLD_SUMMARY => 'total index values allowed', + &BLD_RETURN_TYPE => CGEN_DATATYPE_INT32, + &BLD_PARAM => [BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => 1, + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_VALID, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_OPTION_NAME => + { + &BLD_SUMMARY => 'lookup option name using option id', + }, + }, + }, + + #--------------------------------------------------------------------------------------------------------------------------- + &BLDLCL_FILE_CONFIG_RULE => + { + &BLD_SUMMARY => 'Parse Configuration Settings', + + &BLD_FUNCTION => + { + &BLDLCL_FUNCTION_COMMAND_ID => + { + &BLD_SUMMARY => 'lookup command id using command name', + }, + + &BLDLCL_FUNCTION_ALLOW_LIST => + { + &BLD_SUMMARY => 'is there an allow list for this option?', + &BLD_RETURN_TYPE => CGEN_DATATYPE_BOOL, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => false, + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_VALID, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_ALLOW_LIST_VALUE => + { + &BLD_SUMMARY => 'get value from allowed list', + &BLD_RETURN_TYPE => CGEN_DATATYPE_CONSTCHAR, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID, BLDLCL_PARAM_VALUEID], + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_ALLOW_LIST, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_ALLOW_LIST_VALUE_TOTAL => + { + &BLD_SUMMARY => 'total number of values allowed', + &BLD_RETURN_TYPE => CGEN_DATATYPE_INT32, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_ALLOW_LIST, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_ALLOW_RANGE => + { + &BLD_SUMMARY => 'is the option constrained to a range?', + &BLD_RETURN_TYPE => CGEN_DATATYPE_BOOL, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => false, + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_VALID, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_ALLOW_RANGE_MIN => + { + &BLD_SUMMARY => 'minimum value allowed (if the option is constrained to a range)', + &BLD_RETURN_TYPE => CGEN_DATATYPE_DOUBLE, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_ALLOW_RANGE, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_ALLOW_RANGE_MAX => + { + &BLD_SUMMARY => 'maximum value allowed (if the option is constrained to a range)', + &BLD_RETURN_TYPE => CGEN_DATATYPE_DOUBLE, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_ALLOW_RANGE, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_DEFAULT => + { + &BLD_SUMMARY => 'default value', + &BLD_RETURN_TYPE => CGEN_DATATYPE_CONSTCHAR, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => undef, + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_VALID, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_DEPEND => + { + &BLD_SUMMARY => 'does the option have a dependency on another option?', + &BLD_RETURN_TYPE => CGEN_DATATYPE_BOOL, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => false, + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_VALID, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_DEPEND_OPTION => + { + &BLD_SUMMARY => 'name of the option that this option depends in order to be set', + &BLD_RETURN_TYPE => CGEN_DATATYPE_INT32, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_RETURN_VALUE_MAP => $rhOptionIdConstantMap, + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_DEPEND, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_DEPEND_VALUE => + { + &BLD_SUMMARY => 'the depend option must have one of these values before this option is set', + &BLD_RETURN_TYPE => CGEN_DATATYPE_CONSTCHAR, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID, BLDLCL_PARAM_VALUEID], + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_DEPEND, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_DEPEND_VALUE_TOTAL => + { + &BLD_SUMMARY => 'total depend values for this option', + &BLD_RETURN_TYPE => CGEN_DATATYPE_INT32, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_DEPEND, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_HINT => + { + &BLD_SUMMARY => 'some clue as to what value the user should provide when the option is missing but required', + &BLD_RETURN_TYPE => CGEN_DATATYPE_CONSTCHAR, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => undef, + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_VALID, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_OPTION_ID => + { + &BLD_SUMMARY => 'lookup option id using option name', + }, + + &BLDLCL_FUNCTION_NAME_ALT => + { + &BLD_SUMMARY => 'alternate name for the option primarily used for deprecated names', + &BLD_RETURN_TYPE => CGEN_DATATYPE_CONSTCHAR, + &BLD_PARAM => [BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => undef, + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_VALID, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_NEGATE => + { + &BLD_SUMMARY => 'can the boolean option be negated?', + &BLD_RETURN_TYPE => CGEN_DATATYPE_BOOL, + &BLD_PARAM => [BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => false, + }, + + &BLDLCL_FUNCTION_PREFIX => + { + &BLD_SUMMARY => 'prefix when the option has an index > 1 (e.g. "db")', + &BLD_RETURN_TYPE => CGEN_DATATYPE_CONSTCHAR, + &BLD_PARAM => [BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => undef, + }, + + &BLDLCL_FUNCTION_REQUIRED => + { + &BLD_SUMMARY => 'is the option required?', + &BLD_RETURN_TYPE => CGEN_DATATYPE_BOOL, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => false, + &BLD_FUNCTION_DEPEND => BLDLCL_FUNCTION_VALID, + &BLD_FUNCTION_DEPEND_RESULT => true, + }, + + &BLDLCL_FUNCTION_SECTION => + { + &BLD_SUMMARY => 'section that the option belongs in, NULL means command-line only', + &BLD_RETURN_TYPE => CGEN_DATATYPE_CONSTCHAR, + &BLD_PARAM => [BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => undef, + }, + + &BLDLCL_FUNCTION_SECURE => + { + &BLD_SUMMARY => 'secure options can never be passed on the commmand-line', + &BLD_RETURN_TYPE => CGEN_DATATYPE_BOOL, + &BLD_PARAM => [BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => false, + }, + + &BLDLCL_FUNCTION_TYPE => + { + &BLD_SUMMARY => 'secure options can never be passed on the commmand-line', + &BLD_RETURN_TYPE => CGEN_DATATYPE_INT32, + &BLD_PARAM => [BLDLCL_PARAM_OPTIONID], + &BLD_RETURN_VALUE_MAP => $rhOptionTypeIdConstantMap, + }, + + &BLDLCL_FUNCTION_VALID => + { + &BLD_SUMMARY => 'is the option valid for this command?', + &BLD_RETURN_TYPE => CGEN_DATATYPE_BOOL, + &BLD_PARAM => [BLDLCL_PARAM_COMMANDID, BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => false, + }, + + &BLDLCL_FUNCTION_VALUE_HASH => + { + &BLD_SUMMARY => 'is the option a true hash or just a list of keys?', + &BLD_RETURN_TYPE => CGEN_DATATYPE_BOOL, + &BLD_PARAM => [BLDLCL_PARAM_OPTIONID], + &BLD_TRUTH_DEFAULT => false, + }, + }, + }, + }, +}; + +#################################################################################################################################### +# functionMatrix - add a param/value array to the function matrix +#################################################################################################################################### +sub functionMatrix +{ + my $strFunction = shift; + my $rxyParam = shift; + my $strValue = shift; + + # Find the function in a file + my $rhMatrix; + + foreach my $strFileMatch (sort(keys(%{$rhBuild->{&BLD_FILE}}))) + { + foreach my $strFunctionMatch (sort(keys(%{$rhBuild->{&BLD_FILE}{$strFileMatch}{&BLD_FUNCTION}}))) + { + if ($strFunctionMatch eq $strFunction) + { + my $rhFunction = $rhBuild->{&BLD_FILE}{$strFileMatch}{&BLD_FUNCTION}{$strFunctionMatch}; + + if (!defined($rhFunction->{&BLD_MATRIX})) + { + $rhFunction->{&BLD_MATRIX} = []; + } + + $rhMatrix = $rhFunction->{&BLD_MATRIX}; + } + } + } + + # Error if function is not found + if (!defined($rhMatrix)) + { + confess &log(ASSERT, "function '${strFunction}' not found in build hash"); + } + + push(@{$rhMatrix}, [@{$rxyParam}, $strValue]); +} + +#################################################################################################################################### +# Build configuration functions and constants +#################################################################################################################################### +sub buildConfig +{ + # Build constants + #------------------------------------------------------------------------------------------------------------------------------- + # Add command constants + my $rhConstant = $rhBuild->{&BLD_FILE}{&BLDLCL_FILE_CONFIG}{&BLD_CONSTANT_GROUP}{&BLDLCL_CONSTANT_COMMAND}{&BLD_CONSTANT}; + + foreach my $strCommand (sort(keys(%{$rhCommandNameConstantMap}))) + { + my $strConstant = $rhCommandNameConstantMap->{$strCommand}; + my $strConstantValue = $rhCommandNameIdMap->{$strCommand}; + + $rhConstant->{$strConstant}{&BLD_CONSTANT_VALUE} = $strConstantValue; + $rhConstant->{$strConstant}{&BLD_CONSTANT_EXPORT} = true; + } + + # Add option type constants + $rhConstant = $rhBuild->{&BLD_FILE}{&BLDLCL_FILE_CONFIG}{&BLD_CONSTANT_GROUP}{&BLDLCL_CONSTANT_OPTION_TYPE}{&BLD_CONSTANT}; + + foreach my $strOptionType (sort(keys(%{$rhOptionTypeNameConstantMap}))) + { + my $strConstant = $rhOptionTypeNameConstantMap->{$strOptionType}; + my $strConstantValue = $rhOptionTypeNameIdMap->{$strOptionType}; + + $rhConstant->{$strConstant}{&BLD_CONSTANT_VALUE} = $strConstantValue; + $rhConstant->{$strConstant}{&BLD_CONSTANT_EXPORT} = true; + } + + # Add option constants + $rhConstant = $rhBuild->{&BLD_FILE}{&BLDLCL_FILE_CONFIG}{&BLD_CONSTANT_GROUP}{&BLDLCL_CONSTANT_OPTION}{&BLD_CONSTANT}; + + foreach my $strOption (sort(keys(%{$rhOptionNameConstantMap}))) + { + my $strConstant = $rhOptionNameConstantMap->{$strOption}; + my $strConstantValue = $rhOptionNameIdMap->{$strOption}; + + $rhConstant->{$strConstant}{&BLD_CONSTANT_VALUE} = $strConstantValue; + $rhConstant->{$strConstant}{&BLD_CONSTANT_EXPORT} = true; + } + + # Build config rule maps used to create functions + #------------------------------------------------------------------------------------------------------------------------------- + foreach my $strOption (sort(keys(%{$rhOptionRule}))) + { + my $iOptionId = $rhOptionNameIdMap->{$strOption}; + + foreach my $strCommand (sort(keys(%{cfgbldCommandGet()}))) + { + my $iCommandId = $rhCommandNameIdMap->{$strCommand}; + + functionMatrix(BLDLCL_FUNCTION_VALID, [$iCommandId, $iOptionId], cfgRuleOptionValid($strCommand, $strOption)); + + if (cfgRuleOptionValid($strCommand, $strOption)) + { + functionMatrix(BLDLCL_FUNCTION_DEFAULT, [$iCommandId, $iOptionId], cfgRuleOptionDefault($strCommand, $strOption)); + functionMatrix(BLDLCL_FUNCTION_HINT, [$iCommandId, $iOptionId], cfgRuleOptionHint($strCommand, $strOption)); + functionMatrix(BLDLCL_FUNCTION_REQUIRED, [$iCommandId, $iOptionId], cfgRuleOptionRequired($strCommand, $strOption)); + + # Option dependencies + functionMatrix(BLDLCL_FUNCTION_DEPEND, [$iCommandId, $iOptionId], cfgRuleOptionDepend($strCommand, $strOption)); + + if (cfgRuleOptionDepend($strCommand, $strOption)) + { + functionMatrix( + BLDLCL_FUNCTION_DEPEND_OPTION, [$iCommandId, $iOptionId], + $rhOptionNameIdMap->{cfgRuleOptionDependOption($strCommand, $strOption)}); + + functionMatrix( + BLDLCL_FUNCTION_DEPEND_VALUE_TOTAL, [$iCommandId, $iOptionId], + cfgRuleOptionDependValueTotal($strCommand, $strOption)); + + for (my $iValueIdx = 0; $iValueIdx < cfgRuleOptionDependValueTotal($strCommand, $strOption); $iValueIdx++) + { + functionMatrix( + BLDLCL_FUNCTION_DEPEND_VALUE, [$iCommandId, $iOptionId, $iValueIdx], + cfgRuleOptionDependValue($strCommand, $strOption, $iValueIdx)); + } + } + + # Allow range + functionMatrix( + BLDLCL_FUNCTION_ALLOW_RANGE, [$iCommandId, $iOptionId], cfgRuleOptionAllowRange($strCommand, $strOption)); + + if (cfgRuleOptionAllowRange($strCommand, $strOption)) + { + functionMatrix( + BLDLCL_FUNCTION_ALLOW_RANGE_MIN, [$iCommandId, $iOptionId], + cfgRuleOptionAllowRangeMin($strCommand, $strOption)); + functionMatrix( + BLDLCL_FUNCTION_ALLOW_RANGE_MAX, [$iCommandId, $iOptionId], + cfgRuleOptionAllowRangeMax($strCommand, $strOption)); + } + + # Allow list + functionMatrix( + BLDLCL_FUNCTION_ALLOW_LIST, [$iCommandId, $iOptionId], cfgRuleOptionAllowList($strCommand, $strOption)); + + if (cfgRuleOptionAllowList($strCommand, $strOption)) + { + functionMatrix( + BLDLCL_FUNCTION_ALLOW_LIST_VALUE_TOTAL, [$iCommandId, $iOptionId], + cfgRuleOptionAllowListValueTotal($strCommand, $strOption)); + + for (my $iValueIdx = 0; $iValueIdx < cfgRuleOptionAllowListValueTotal($strCommand, $strOption); $iValueIdx++) + { + functionMatrix( + BLDLCL_FUNCTION_ALLOW_LIST_VALUE, [$iCommandId, $iOptionId, $iValueIdx], + cfgRuleOptionAllowListValue($strCommand, $strOption, $iValueIdx)); + } + } + } + } + + functionMatrix(BLDLCL_FUNCTION_INDEX_TOTAL, [$iOptionId], cfgOptionIndexTotal($strOption)); + functionMatrix(BLDLCL_FUNCTION_NEGATE, [$iOptionId], cfgRuleOptionNegate($strOption)); + functionMatrix(BLDLCL_FUNCTION_NAME_ALT, [$iOptionId], cfgRuleOptionNameAlt($strOption)); + functionMatrix(BLDLCL_FUNCTION_PREFIX, [$iOptionId], cfgRuleOptionPrefix($strOption)); + functionMatrix(BLDLCL_FUNCTION_SECTION, [$iOptionId], cfgRuleOptionSection($strOption)); + functionMatrix(BLDLCL_FUNCTION_SECURE, [$iOptionId], cfgRuleOptionSecure($strOption)); + functionMatrix(BLDLCL_FUNCTION_TYPE, [$iOptionId], $rhOptionTypeNameIdMap->{cfgRuleOptionType($strOption)}); + functionMatrix(BLDLCL_FUNCTION_VALUE_HASH, [$iOptionId], cfgRuleOptionValueHash($strOption)); + } + + # Build lookup functions that are not implemented with switch statements + #------------------------------------------------------------------------------------------------------------------------------- + $rhBuild->{&BLD_FILE}{&BLDLCL_FILE_CONFIG}{&BLD_FUNCTION}{&BLDLCL_FUNCTION_COMMAND_NAME}{&BLD_SOURCE} = cgenLookupString( + 'Command', BLDLCL_CONSTANT_COMMAND_TOTAL, $rhCommandNameConstantMap); + $rhBuild->{&BLD_FILE}{&BLDLCL_FILE_CONFIG}{&BLD_FUNCTION}{&BLDLCL_FUNCTION_OPTION_NAME}{&BLD_SOURCE} = cgenLookupString( + 'Option', BLDLCL_CONSTANT_OPTION_TOTAL, $rhOptionNameConstantMap, '^(' . join('|', @stryOptionAlt) . ')$'); + + $rhBuild->{&BLD_FILE}{&BLDLCL_FILE_CONFIG_RULE}{&BLD_FUNCTION}{&BLDLCL_FUNCTION_COMMAND_ID}{&BLD_SOURCE} = cgenLookupId( + 'Command', BLDLCL_CONSTANT_COMMAND_TOTAL); + $rhBuild->{&BLD_FILE}{&BLDLCL_FILE_CONFIG_RULE}{&BLD_FUNCTION}{&BLDLCL_FUNCTION_OPTION_ID}{&BLD_SOURCE} = cgenLookupId( + 'Option', BLDLCL_CONSTANT_OPTION_TOTAL); + + # Build switch functions for all files + #------------------------------------------------------------------------------------------------------------------------------- + foreach my $strFile (sort(keys(%{$rhBuild->{&BLD_FILE}}))) + { + my $rhFileFunction = $rhBuild->{&BLD_FILE}{$strFile}{&BLD_FUNCTION}; + + foreach my $strFunction (sort(keys(%{$rhFileFunction}))) + { + my $rhFunction = $rhFileFunction->{$strFunction}; + + next if !defined($rhFunction->{&BLD_MATRIX}); + + $rhFunction->{&BLD_SOURCE} = cgenSwitchBuild( + $strFunction, $rhFunction->{&BLD_RETURN_TYPE}, $rhFunction->{&BLD_MATRIX}, $rhFunction->{&BLD_PARAM}, + $rhBuild->{&BLD_PARAM_LABEL}, $rhFunction->{&BLD_RETURN_VALUE_MAP}); + } + } + + return $rhBuild; +} + +push @EXPORT, qw(buildConfig); + +1; diff --git a/build/lib/pgBackRestBuild/Config/Rule.pm b/build/lib/pgBackRestBuild/Config/Rule.pm new file mode 100644 index 000000000..e4d678312 --- /dev/null +++ b/build/lib/pgBackRestBuild/Config/Rule.pm @@ -0,0 +1,136 @@ +#################################################################################################################################### +# Legacy Rules Used Primarily by Documentation +# +# Most of these can be removed, but it will required some refactoring on DocConfig.pm. +#################################################################################################################################### +package pgBackRestBuild::Config::Rule; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Exporter qw(import); + our @EXPORT = qw(); + +use pgBackRest::Common::Exception; +use pgBackRest::Common::Log; +use pgBackRest::Config::Data; + +#################################################################################################################################### +# Option rules hash +#################################################################################################################################### +my $rhOptionRule = cfgdefRule(); + +#################################################################################################################################### +# cfgbldCommandRule - returns the option rules based on the command. +#################################################################################################################################### +sub cfgbldCommandRule +{ + my $strOption = shift; + my $strCommand = shift; + + if (defined($strCommand)) + { + return defined($rhOptionRule->{$strOption}{&CFGBLDDEF_RULE_COMMAND}) && + defined($rhOptionRule->{$strOption}{&CFGBLDDEF_RULE_COMMAND}{$strCommand}) && + ref($rhOptionRule->{$strOption}{&CFGBLDDEF_RULE_COMMAND}{$strCommand}) eq 'HASH' ? + $rhOptionRule->{$strOption}{&CFGBLDDEF_RULE_COMMAND}{$strCommand} : undef; + } + + return; +} + +#################################################################################################################################### +# cfgbldOptionDefault - does the option have a default for this command? +#################################################################################################################################### +sub cfgbldOptionDefault +{ + my $strOption = shift; + my $strCommand = shift; + + # Get the command rule + my $oCommandRule = cfgbldCommandRule($strOption, $strCommand); + + # Check for default in command + my $strDefault = defined($oCommandRule) ? $$oCommandRule{&CFGBLDDEF_RULE_DEFAULT} : undef; + + # If defined return, else try to grab the global default + return defined($strDefault) ? $strDefault : $rhOptionRule->{$strOption}{&CFGBLDDEF_RULE_DEFAULT}; +} + +push @EXPORT, qw(cfgbldOptionDefault); + +#################################################################################################################################### +# cfgbldOptionRange - get the allowed setting range for the option if it exists +#################################################################################################################################### +sub cfgbldOptionRange +{ + my $strOption = shift; + my $strCommand = shift; + + # Get the command rule + my $oCommandRule = cfgbldCommandRule($strOption, $strCommand); + + # Check for default in command + if (defined($oCommandRule) && defined($$oCommandRule{&CFGBLDDEF_RULE_ALLOW_RANGE})) + { + return $$oCommandRule{&CFGBLDDEF_RULE_ALLOW_RANGE}[0], $$oCommandRule{&CFGBLDDEF_RULE_ALLOW_RANGE}[1]; + } + + # If defined return, else try to grab the global default + return $rhOptionRule->{$strOption}{&CFGBLDDEF_RULE_ALLOW_RANGE}[0], $rhOptionRule->{$strOption}{&CFGBLDDEF_RULE_ALLOW_RANGE}[1]; +} + +push @EXPORT, qw(cfgbldOptionRange); + +#################################################################################################################################### +# cfgbldOptionType - get the option type +#################################################################################################################################### +sub cfgbldOptionType +{ + my $strOption = shift; + + return $rhOptionRule->{$strOption}{&CFGBLDDEF_RULE_TYPE}; +} + +push @EXPORT, qw(cfgbldOptionType); + +#################################################################################################################################### +# cfgbldOptionTypeTest - test the option type +#################################################################################################################################### +sub cfgbldOptionTypeTest +{ + my $strOption = shift; + my $strType = shift; + + return cfgbldOptionType($strOption) eq $strType; +} + +push @EXPORT, qw(cfgbldOptionTypeTest); + +#################################################################################################################################### +# cfgbldCommandGet - get the hash that contains all valid commands +#################################################################################################################################### +sub cfgbldCommandGet +{ + my $rhCommand; + + # Get commands from the rule hash + foreach my $strOption (sort(keys(%{$rhOptionRule}))) + { + foreach my $strCommand (sort(keys(%{$rhOptionRule->{$strOption}{&CFGBLDDEF_RULE_COMMAND}}))) + { + $rhCommand->{$strCommand} = true; + } + } + + # Add special commands + $rhCommand->{&CFGCMD_HELP} = true; + $rhCommand->{&CFGCMD_VERSION} = true; + + return $rhCommand; +} + +push @EXPORT, qw(cfgbldCommandGet); + +1; diff --git a/doc/doc.pl b/doc/doc.pl index 57b83f052..e56d04e49 100755 --- a/doc/doc.pl +++ b/doc/doc.pl @@ -21,6 +21,7 @@ use Storable; use lib dirname($0) . '/lib'; use lib dirname(dirname($0)) . '/lib'; +use lib dirname(dirname($0)) . '/build/lib'; use lib dirname(dirname($0)) . '/test/lib'; use BackRestDoc::Common::Doc; @@ -34,7 +35,6 @@ use BackRestDoc::Markdown::DocMarkdown; use pgBackRest::Common::Exception; use pgBackRest::Common::Log; use pgBackRest::Common::String; -use pgBackRest::Config::Config; use pgBackRest::Storage::Local; use pgBackRest::Storage::Posix::Driver; use pgBackRest::Version; diff --git a/doc/lib/BackRestDoc/Common/Doc.pm b/doc/lib/BackRestDoc/Common/Doc.pm index 11ae2829a..c92eeca20 100644 --- a/doc/lib/BackRestDoc/Common/Doc.pm +++ b/doc/lib/BackRestDoc/Common/Doc.pm @@ -32,18 +32,20 @@ sub new ( my $strOperation, $self->{strFileName}, + my $strSgmlSearchPath, ) = logDebugParam ( __PACKAGE__ . '->new', \@_, {name => 'strFileName', required => false}, + {name => 'strSgmlSearchPath', required => false}, ); # Load the doc from a file if one has been defined if (defined($self->{strFileName})) { my $oParser = XML::Checker::Parser->new(ErrorContext => 2, Style => 'Tree'); - $oParser->set_sgml_search_path(dirname(dirname($0)) . '/doc/xml/dtd'); + $oParser->set_sgml_search_path(defined($strSgmlSearchPath) ? $strSgmlSearchPath : dirname(dirname($0)) . '/doc/xml/dtd'); my $oTree; diff --git a/doc/lib/BackRestDoc/Common/DocConfig.pm b/doc/lib/BackRestDoc/Common/DocConfig.pm index 776b47491..5c92306bb 100644 --- a/doc/lib/BackRestDoc/Common/DocConfig.pm +++ b/doc/lib/BackRestDoc/Common/DocConfig.pm @@ -13,15 +13,40 @@ use File::Basename qw(dirname); use pgBackRest::Common::Log; use pgBackRest::Common::String; -use pgBackRest::Config::Config; -use pgBackRest::Config::ConfigHelp; +use pgBackRest::Config::Data; use pgBackRest::Version; +use pgBackRestBuild::Config::Rule; + #################################################################################################################################### # Help types #################################################################################################################################### -use constant CONFIG_HELP_NAME => 'name'; +use constant CONFIG_HELP_COMMAND => 'command'; + push @EXPORT, qw(CONFIG_HELP_COMMAND); +use constant CONFIG_HELP_CURRENT => 'current'; +use constant CONFIG_HELP_DEFAULT => 'default'; +use constant CONFIG_HELP_DESCRIPTION => 'description'; + push @EXPORT, qw(CONFIG_HELP_DESCRIPTION); use constant CONFIG_HELP_EXAMPLE => 'example'; +use constant CONFIG_HELP_NAME => 'name'; +use constant CONFIG_HELP_OPTION => 'option'; + push @EXPORT, qw(CONFIG_HELP_OPTION); +use constant CONFIG_HELP_SECTION => 'section'; +use constant CONFIG_HELP_SUMMARY => 'summary'; + +use constant CONFIG_HELP_SOURCE => 'source'; +use constant CONFIG_HELP_SOURCE_DEFAULT => 'default'; +use constant CONFIG_HELP_SOURCE_SECTION => CONFIG_HELP_SECTION; +use constant CONFIG_HELP_SOURCE_COMMAND => CONFIG_HELP_COMMAND; + +#################################################################################################################################### +# Config Section Types +#################################################################################################################################### +use constant CFGDEF_COMMAND => 'command'; +use constant CFGDEF_GENERAL => 'general'; +use constant CFGDEF_LOG => 'log'; +use constant CFGDEF_EXPIRE => 'expire'; +use constant CFGDEF_REPOSITORY => 'repository'; #################################################################################################################################### # CONSTRUCTOR @@ -44,7 +69,7 @@ sub new ( __PACKAGE__ . '->new', \@_, {name => 'oDoc'}, - {name => 'oDocRender'} + {name => 'oDocRender', required => false} ); $self->process(); @@ -73,9 +98,9 @@ sub process my $oDoc = $self->{oDoc}; my $oConfigHash = {}; - foreach my $strCommand (sort(keys(%{commandHashGet()}))) + foreach my $strCommand (sort(keys(%{cfgbldCommandGet()}))) { - if ($strCommand eq CMD_REMOTE || $strCommand eq CMD_LOCAL) + if ($strCommand eq CFGCMD_REMOTE || $strCommand eq CFGCMD_LOCAL) { next; } @@ -90,18 +115,18 @@ sub process } # Iterate through all options - my $oOptionRule = optionRuleGet(); + my $oOptionRule = cfgdefRule(); foreach my $strOption (sort(keys(%{$oOptionRule}))) { - if ($strOption =~ /^test/ || $strOption eq OPTION_ARCHIVE_MAX_MB) + if ($strOption =~ /^test/ || $strOption eq CFGOPT_ARCHIVE_MAX_MB) { next; } # Iterate through all commands - my @stryCommandList = sort(keys(%{defined($$oOptionRule{$strOption}{&OPTION_RULE_COMMAND}) ? - $$oOptionRule{$strOption}{&OPTION_RULE_COMMAND} : $$oConfigHash{&CONFIG_HELP_COMMAND}})); + my @stryCommandList = sort(keys(%{defined($$oOptionRule{$strOption}{&CFGBLDDEF_RULE_COMMAND}) ? + $$oOptionRule{$strOption}{&CFGBLDDEF_RULE_COMMAND} : $$oConfigHash{&CONFIG_HELP_COMMAND}})); foreach my $strCommand (@stryCommandList) { @@ -110,8 +135,8 @@ sub process next; } - if (ref(\$$oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand}) eq 'SCALAR' && - $$oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand} == false) + if (ref(\$$oOptionRule{$strOption}{&CFGBLDDEF_RULE_COMMAND}{$strCommand}) eq 'SCALAR' && + $$oOptionRule{$strOption}{&CFGBLDDEF_RULE_COMMAND}{$strCommand} == false) { next; } @@ -136,7 +161,7 @@ sub process if (!defined($oOptionDoc)) { # Next see if it's documented in the section - if (defined($$oOptionRule{$strOption}{&OPTION_RULE_SECTION})) + if (defined($$oOptionRule{$strOption}{&CFGBLDDEF_RULE_SECTION})) { # &log(INFO, " trying section ${strSection}"); foreach my $oSectionNode ($oDoc->nodeGet('config')->nodeGet('config-section-list')->nodeList()) @@ -176,15 +201,17 @@ sub process # if the option is documented in the command then it should be accessible from the command line only. if (!defined($strSection)) { - if (defined($$oOptionRule{$strOption}{&OPTION_RULE_SECTION})) + if (defined($$oOptionRule{$strOption}{&CFGBLDDEF_RULE_SECTION})) { - &log(ERROR, "option ${strOption} defined in command ${strCommand} must not have " . OPTION_RULE_SECTION . - " defined"); + &log(ERROR, + "option ${strOption} defined in command ${strCommand} must not have " . CFGBLDDEF_RULE_SECTION . + " defined"); } } # Store the option in the command - $$oConfigHash{&CONFIG_HELP_COMMAND}{$strCommand}{&CONFIG_HELP_OPTION}{$strOption}{&CONFIG_HELP_SOURCE} = $strOptionSource; + $$oConfigHash{&CONFIG_HELP_COMMAND}{$strCommand}{&CONFIG_HELP_OPTION}{$strOption}{&CONFIG_HELP_SOURCE} = + $strOptionSource; my $oCommandOption = $$oConfigHash{&CONFIG_HELP_COMMAND}{$strCommand}{&CONFIG_HELP_OPTION}{$strOption}; @@ -529,7 +556,7 @@ sub manGet } # Build command and config hashes - my $hOptionRule = optionRuleGet(); + my $hOptionRule = cfgdefRule(); my $hConfig = $self->{oConfigHash}; my $hCommandList = {}; my $iCommandMaxLen = 0; @@ -563,7 +590,7 @@ sub manGet { my $hOption = $$hConfig{&CONFIG_HELP_OPTION}{$strOption}; $iOptionMaxLen = length($strOption) > $iOptionMaxLen ? length($strOption) : $iOptionMaxLen; - my $strSection = defined($$hOption{&CONFIG_HELP_SECTION}) ? $$hOption{&CONFIG_HELP_SECTION} : CONFIG_SECTION_GENERAL; + my $strSection = defined($$hOption{&CONFIG_HELP_SECTION}) ? $$hOption{&CONFIG_HELP_SECTION} : CFGDEF_GENERAL; $$hOptionList{$strSection}{$strOption}{&CONFIG_HELP_SUMMARY} = $$hOption{&CONFIG_HELP_SUMMARY}; } @@ -598,16 +625,16 @@ sub manGet my $hOption = $$hOptionList{$strSection}{$strOption}; # Contruct the default - my $strCommand = defined(${commandHashGet()}{$strSection}) ? $strSection : undef; - my $strDefault = optionDefault($strOption, $strCommand); + my $strCommand = defined(${cfgbldCommandGet()}{$strSection}) ? $strSection : undef; + my $strDefault = cfgbldOptionDefault($strOption, $strCommand); if (defined($strDefault)) { - if ($strOption eq OPTION_BACKUP_CMD || $strOption eq OPTION_DB_CMD) + if ($strOption eq CFGOPT_BACKUP_CMD || $strOption eq CFGOPT_DB_CMD) { $strDefault = BACKREST_EXE; } - elsif ($$hOptionRule{$strOption}{&OPTION_RULE_TYPE} eq &OPTION_TYPE_BOOLEAN) + elsif ($$hOptionRule{$strOption}{&CFGBLDDEF_RULE_TYPE} eq &CFGOPTDEF_TYPE_BOOLEAN) { $strDefault = $strDefault ? 'y' : 'n'; } @@ -633,31 +660,31 @@ sub manGet $strManPage .= "\n\n" . "FILES\n" . "\n" . - ' ' . OPTION_DEFAULT_CONFIG . "\n" . - ' ' . OPTION_DEFAULT_REPO_PATH . "\n" . - ' ' . OPTION_DEFAULT_LOG_PATH . "\n" . - ' ' . OPTION_DEFAULT_SPOOL_PATH . "\n" . - ' ' . OPTION_DEFAULT_LOCK_PATH . "\n" . + ' ' . cfgbldOptionDefault(CFGOPT_CONFIG) . "\n" . + ' ' . cfgbldOptionDefault(CFGOPT_REPO_PATH) . "\n" . + ' ' . cfgbldOptionDefault(CFGOPT_LOG_PATH) . "\n" . + ' ' . cfgbldOptionDefault(CFGOPT_SPOOL_PATH) . "\n" . + ' ' . cfgbldOptionDefault(CFGOPT_LOCK_PATH) . "\n" . "\n" . "EXAMPLES\n" . "\n" . " * Create a backup of the PostgreSQL `main` cluster:\n" . "\n" . - ' $ ' . BACKREST_EXE . ' --' . OPTION_STANZA . "=main backup\n" . + ' $ ' . BACKREST_EXE . ' --' . CFGOPT_STANZA . "=main backup\n" . "\n" . - ' The `main` cluster should be configured in `' . OPTION_DEFAULT_CONFIG . "`\n" . + ' The `main` cluster should be configured in `' . cfgbldOptionDefault(CFGOPT_CONFIG) . "`\n" . "\n" . " * Show all available backups:\n" . "\n" . - ' $ ' . BACKREST_EXE . ' ' . CMD_INFO . "\n" . + ' $ ' . BACKREST_EXE . ' ' . CFGCMD_INFO . "\n" . "\n" . " * Show all available backups for a specific cluster:\n" . "\n" . - ' $ ' . BACKREST_EXE . ' --' . OPTION_STANZA . '=main ' . CMD_INFO . "\n" . + ' $ ' . BACKREST_EXE . ' --' . CFGOPT_STANZA . '=main ' . CFGCMD_INFO . "\n" . "\n" . " * Show backup specific options:\n" . "\n" . - ' $ ' . BACKREST_EXE . ' ' . CMD_HELP . ' ' . CMD_BACKUP . "\n" . + ' $ ' . BACKREST_EXE . ' ' . CFGCMD_HELP . ' ' . CFGCMD_BACKUP . "\n" . "\n" . "SEE ALSO\n" . "\n" . @@ -774,7 +801,7 @@ sub helpCommandDocGet # Working variables my $oConfigHash = $self->{oConfigHash}; my $oOperationDoc = $self->{oDoc}->nodeGet('operation'); - my $oOptionRule = optionRuleGet(); + my $oOptionRule = cfgdefRule(); my $oDoc = new BackRestDoc::Common::Doc(); $oDoc->paramSet('title', $oOperationDoc->paramGet('title')); @@ -855,7 +882,7 @@ sub helpCommandDocGetOptionFind if ($$oOption{&CONFIG_HELP_SOURCE} eq CONFIG_HELP_SOURCE_DEFAULT) { - $strSection = CONFIG_SECTION_GENERAL; + $strSection = CFGDEF_GENERAL; } elsif ($$oOption{&CONFIG_HELP_SOURCE} eq CONFIG_HELP_SOURCE_SECTION) { @@ -866,9 +893,9 @@ sub helpCommandDocGetOptionFind $strSection = $$oOption{&CONFIG_HELP_SECTION}; } - if (($strSection ne CONFIG_SECTION_GENERAL && $strSection ne CONFIG_SECTION_LOG && - $strSection ne CONFIG_SECTION_REPOSITORY && $strSection ne CONFIG_SECTION_STANZA && - $strSection ne CONFIG_SECTION_EXPIRE) || + if (($strSection ne CFGDEF_GENERAL && $strSection ne CFGDEF_LOG && + $strSection ne CFGDEF_REPOSITORY && $strSection ne CFGDEF_SECTION_STANZA && + $strSection ne CFGDEF_EXPIRE) || $strSection eq $strCommand) { $strSection = CONFIG_HELP_COMMAND; @@ -910,23 +937,23 @@ sub helpOptionGet # Get the default value (or required=n if there is no default) my $strCodeBlock; - if (defined(optionDefault($strOption, $strCommand))) + if (defined(cfgbldOptionDefault($strOption, $strCommand))) { my $strDefault; - if ($strOption eq OPTION_BACKUP_CMD || $strOption eq OPTION_DB_CMD) + if ($strOption eq CFGOPT_BACKUP_CMD || $strOption eq CFGOPT_DB_CMD) { $strDefault = '[INSTALL-PATH]/' . BACKREST_EXE; } else { - if (optionTypeTest($strOption, OPTION_TYPE_BOOLEAN)) + if (cfgbldOptionTypeTest($strOption, CFGOPTDEF_TYPE_BOOLEAN)) { - $strDefault = optionDefault($strOption, $strCommand) ? 'y' : 'n'; + $strDefault = cfgbldOptionDefault($strOption, $strCommand) ? 'y' : 'n'; } else { - $strDefault = optionDefault($strOption, $strCommand); + $strDefault = cfgbldOptionDefault($strOption, $strCommand); } } @@ -939,7 +966,7 @@ sub helpOptionGet # } # Get the allowed range if it exists - my ($strRangeMin, $strRangeMax) = optionRange($strOption, $strCommand); + my ($strRangeMin, $strRangeMax) = cfgbldOptionRange($strOption, $strCommand); if (defined($strRangeMin)) { @@ -951,7 +978,7 @@ sub helpOptionGet if (defined($strCommand)) { - if (optionTypeTest($strOption, OPTION_TYPE_BOOLEAN)) + if (cfgbldOptionTypeTest($strOption, CFGOPTDEF_TYPE_BOOLEAN)) { if ($$oOptionHash{&CONFIG_HELP_EXAMPLE} ne 'n' && $$oOptionHash{&CONFIG_HELP_EXAMPLE} ne 'y') { diff --git a/doc/lib/BackRestDoc/Common/DocExecute.pm b/doc/lib/BackRestDoc/Common/DocExecute.pm index c515ca315..ac9af7d19 100644 --- a/doc/lib/BackRestDoc/Common/DocExecute.pm +++ b/doc/lib/BackRestDoc/Common/DocExecute.pm @@ -17,7 +17,7 @@ use pgBackRest::Common::Exception; use pgBackRest::Common::Ini; use pgBackRest::Common::Log; use pgBackRest::Common::String; -use pgBackRest::Config::Config; +use pgBackRest::Config::Data; use pgBackRest::Version; use pgBackRestTest::Common::ExecuteTest; @@ -516,7 +516,7 @@ sub backrestConfig else { # Get the config options hash - my $oOption = optionRuleGet(); + my $oOption = cfgdefRuleIndex(); # Make sure the specified option exists # ??? This is too simplistic to handle new indexed options. The check below works for now but it would be good @@ -528,7 +528,7 @@ sub backrestConfig # If this option is a hash and the value is already set then append to the array if (defined($$oOption{$strKey}) && - $$oOption{$strKey}{&OPTION_RULE_TYPE} eq OPTION_TYPE_HASH && + $$oOption{$strKey}{&CFGBLDDEF_RULE_TYPE} eq CFGOPTDEF_TYPE_HASH && defined(${$self->{config}}{$strHostName}{$$hCacheKey{file}}{$strSection}{$strKey})) { my @oValue = (); @@ -570,13 +570,13 @@ sub backrestConfig # Remove the log-console-stderr option before pushing into the cache # ??? This is not very pretty and should be replaced with a general way to hide config options my $oConfigClean = dclone($self->{config}{$strHostName}{$$hCacheKey{file}}); - delete($$oConfigClean{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_LEVEL_STDERR}); - delete($$oConfigClean{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_TIMESTAMP}); - delete($$oConfigClean{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_S3_VERIFY_SSL}); + delete($$oConfigClean{&CFGDEF_SECTION_GLOBAL}{&CFGOPT_LOG_LEVEL_STDERR}); + delete($$oConfigClean{&CFGDEF_SECTION_GLOBAL}{&CFGOPT_LOG_TIMESTAMP}); + delete($$oConfigClean{&CFGDEF_SECTION_GLOBAL}{&CFGOPT_REPO_S3_VERIFY_SSL}); - if (keys(%{$$oConfigClean{&CONFIG_SECTION_GLOBAL}}) == 0) + if (keys(%{$$oConfigClean{&CFGDEF_SECTION_GLOBAL}}) == 0) { - delete($$oConfigClean{&CONFIG_SECTION_GLOBAL}); + delete($$oConfigClean{&CFGDEF_SECTION_GLOBAL}); } $self->{oManifest}->storage()->put("${strLocalFile}.clean", iniRender($oConfigClean, true)); diff --git a/doc/lib/BackRestDoc/Custom/DocCustomRelease.pm b/doc/lib/BackRestDoc/Custom/DocCustomRelease.pm index 949e9037c..d6afb3f9a 100644 --- a/doc/lib/BackRestDoc/Custom/DocCustomRelease.pm +++ b/doc/lib/BackRestDoc/Custom/DocCustomRelease.pm @@ -12,8 +12,7 @@ use Exporter qw(import); use pgBackRest::Common::Log; use pgBackRest::Common::String; -use pgBackRest::Config::Config; -use pgBackRest::Config::ConfigHelp; +use pgBackRest::Config::Data; use BackRestDoc::Common::DocRender; diff --git a/doc/lib/BackRestDoc/Html/DocHtmlPage.pm b/doc/lib/BackRestDoc/Html/DocHtmlPage.pm index 193a13c09..48e5b79b9 100644 --- a/doc/lib/BackRestDoc/Html/DocHtmlPage.pm +++ b/doc/lib/BackRestDoc/Html/DocHtmlPage.pm @@ -14,8 +14,8 @@ use Exporter qw(import); use pgBackRest::Common::Log; use pgBackRest::Common::String; -use pgBackRest::Config::ConfigHelp; +use BackRestDoc::Common::DocConfig; use BackRestDoc::Common::DocManifest; use BackRestDoc::Common::DocRender; use BackRestDoc::Html::DocHtmlBuilder; diff --git a/doc/lib/BackRestDoc/Latex/DocLatexSection.pm b/doc/lib/BackRestDoc/Latex/DocLatexSection.pm index 3b7fa8927..b3a3ebe76 100644 --- a/doc/lib/BackRestDoc/Latex/DocLatexSection.pm +++ b/doc/lib/BackRestDoc/Latex/DocLatexSection.pm @@ -14,8 +14,8 @@ use Exporter qw(import); use pgBackRest::Common::Ini; use pgBackRest::Common::Log; use pgBackRest::Common::String; -use pgBackRest::Config::ConfigHelp; +use BackRestDoc::Common::DocConfig; use BackRestDoc::Common::DocManifest; #################################################################################################################################### diff --git a/doc/lib/BackRestDoc/Markdown/DocMarkdownRender.pm b/doc/lib/BackRestDoc/Markdown/DocMarkdownRender.pm index f17044f1c..a0d92d60d 100644 --- a/doc/lib/BackRestDoc/Markdown/DocMarkdownRender.pm +++ b/doc/lib/BackRestDoc/Markdown/DocMarkdownRender.pm @@ -17,8 +17,8 @@ use Storable qw(dclone); use pgBackRest::Common::Log; use pgBackRest::Common::String; -use pgBackRest::Config::ConfigHelp; +use BackRestDoc::Common::DocConfig; use BackRestDoc::Common::DocManifest; #################################################################################################################################### diff --git a/doc/release.pl b/doc/release.pl index 7dddb3c8d..11135575f 100755 --- a/doc/release.pl +++ b/doc/release.pl @@ -20,8 +20,9 @@ use Pod::Usage qw(pod2usage); use Storable; use lib dirname($0) . '/lib'; -use lib dirname($0) . '/../lib'; -use lib dirname($0) . '/../test/lib'; +use lib dirname(dirname($0)) . '/build/lib'; +use lib dirname(dirname($0)) . '/lib'; +use lib dirname(dirname($0)) . '/test/lib'; use BackRestDoc::Common::Doc; use BackRestDoc::Common::DocConfig; @@ -34,7 +35,6 @@ use BackRestDoc::Markdown::DocMarkdown; use pgBackRest::Common::Exception; use pgBackRest::Common::Log; use pgBackRest::Common::String; -use pgBackRest::Config::Config; use pgBackRest::Storage::Local; use pgBackRest::Storage::Posix::Driver; use pgBackRest::Version; diff --git a/doc/xml/release.xml b/doc/xml/release.xml index 611590df2..12448291e 100644 --- a/doc/xml/release.xml +++ b/doc/xml/release.xml @@ -23,6 +23,10 @@ + +

Configuration rules are now pulled from the C library when present.

+
+

Move contributor list to the end of release.xml for convenience.

@@ -46,11 +50,11 @@ -

Ignore auto-generated C code created by release 2.

+

Ignore auto-generated C code.

-

Merge release 2 container build changes.

+

Update containers to support C library builds in the documentation.

diff --git a/doc/xml/user-guide.xml b/doc/xml/user-guide.xml index 6ca918b1d..52b4fdd8b 100644 --- a/doc/xml/user-guide.xml +++ b/doc/xml/user-guide.xml @@ -192,9 +192,18 @@ cp -r /backrest/bin /root/pgbackrest-release-{[version]} + + cp -r /backrest/build /root/pgbackrest-release-{[version]} + cp -r /backrest/lib /root/pgbackrest-release-{[version]} + + cp -r /backrest/libc /root/pgbackrest-release-{[version]} + + + cp -r /backrest/src /root/pgbackrest-release-{[version]} +

is written in Perl which is included with {[user-guide-os]} by default. The DBD::Pg module must also be installed.

@@ -297,6 +306,24 @@ + + +

should now be properly installed but it is best to check. If any dependencies were missed then you will get an error when running from the command line.

@@ -1432,6 +1459,33 @@ chown backrest:postgres /var/log/pgbackrest + + + @@ -1816,6 +1870,33 @@ chown postgres:postgres /var/log/pgbackrest + + + {[db-cluster-create]} diff --git a/lib/pgBackRest/Archive/Base.pm b/lib/pgBackRest/Archive/Base.pm index 637c08268..56068ebd0 100644 --- a/lib/pgBackRest/Archive/Base.pm +++ b/lib/pgBackRest/Archive/Base.pm @@ -90,7 +90,7 @@ sub getCheck # Get db info from the repo if (!isRepoLocal()) { - ($strArchiveId, $strArchiveFile) = protocolGet(BACKUP)->cmdExecute( + ($strArchiveId, $strArchiveFile) = protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP)->cmdExecute( OP_ARCHIVE_GET_CHECK, [$strDbVersion, $ullDbSysId, $strWalFile], true); } else diff --git a/lib/pgBackRest/Archive/Get/Get.pm b/lib/pgBackRest/Archive/Get/Get.pm index 79968667c..e27f20e08 100644 --- a/lib/pgBackRest/Archive/Get/Get.pm +++ b/lib/pgBackRest/Archive/Get/Get.pm @@ -44,7 +44,7 @@ sub process # Make sure the command happens on the db side if (!isDbLocal()) { - confess &log(ERROR, CMD_ARCHIVE_GET . ' operation must run on db host', ERROR_HOST_INVALID); + confess &log(ERROR, cfgCommandName(CFGCMD_ARCHIVE_GET) . ' operation must run on db host', ERROR_HOST_INVALID); } # Make sure the archive file is defined @@ -97,7 +97,7 @@ sub get my $oStorageRepo = storageRepo(); # Construct absolute path to the WAL file when it is relative - $strDestinationFile = walPath($strDestinationFile, optionGet(OPTION_DB_PATH, false), commandGet()); + $strDestinationFile = walPath($strDestinationFile, cfgOption(CFGOPT_DB_PATH, false), cfgCommandName(cfgCommandGet())); # Get the wal segment filename my ($strArchiveId, $strArchiveFile) = $self->getCheck( @@ -162,7 +162,7 @@ sub getArchiveId if (!isRepoLocal()) { - $strArchiveId = protocolGet(BACKUP)->cmdExecute(OP_ARCHIVE_GET_ARCHIVE_ID, undef, true); + $strArchiveId = protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP)->cmdExecute(OP_ARCHIVE_GET_ARCHIVE_ID, undef, true); } else { diff --git a/lib/pgBackRest/Archive/Push/Async.pm b/lib/pgBackRest/Archive/Push/Async.pm index f85a2d34f..48da14c69 100644 --- a/lib/pgBackRest/Archive/Push/Async.pm +++ b/lib/pgBackRest/Archive/Push/Async.pm @@ -84,11 +84,11 @@ sub process # This first lock request is a quick test to see if the async process is running. If the lock is successful we need to release # the lock, fork, and then let the async process acquire its own lock. Otherwise the lock will be held by the client process # which will soon exit and leave the async process unlocked. - if (lockAcquire(commandGet(), false)) + if (lockAcquire(cfgCommandName(cfgCommandGet()), false)) { &log(TEST, TEST_ARCHIVE_PUSH_ASYNC_START); - lockRelease(commandGet()); + lockRelease(cfgCommandName(cfgCommandGet())); $bClient = fork() == 0 ? false : true; } else @@ -100,10 +100,10 @@ sub process if (!$bClient) { # uncoverable branch false - reacquire the lock since it was released by the client process above - if (lockAcquire(commandGet(), false)) + if (lockAcquire(cfgCommandName(cfgCommandGet()), false)) { # Open the log file - logFileSet(optionGet(OPTION_LOG_PATH) . '/' . optionGet(OPTION_STANZA) . '-archive-async'); + logFileSet(storageLocal(), cfgOption(CFGOPT_LOG_PATH) . '/' . cfgOption(CFGOPT_STANZA) . '-archive-async'); # uncoverable branch true - chdir to / chdir '/' @@ -153,9 +153,9 @@ sub initServer # Initialize the archive process $self->{oArchiveProcess} = new pgBackRest::Protocol::Local::Process( - BACKUP, optionGet(OPTION_PROTOCOL_TIMEOUT) < 60 ? optionGet(OPTION_PROTOCOL_TIMEOUT) / 2 : 30, + CFGOPTVAL_LOCAL_TYPE_BACKUP, cfgOption(CFGOPT_PROTOCOL_TIMEOUT) < 60 ? cfgOption(CFGOPT_PROTOCOL_TIMEOUT) / 2 : 30, $self->{strBackRestBin}, false); - $self->{oArchiveProcess}->hostAdd(1, optionGet(OPTION_PROCESS_MAX)); + $self->{oArchiveProcess}->hostAdd(1, cfgOption(CFGOPT_PROCESS_MAX)); # Return from function and log return values if any return logDebugReturn($strOperation); @@ -201,7 +201,7 @@ sub processQueue foreach my $strWalFile (@{$stryWalFile}) { $self->{oArchiveProcess}->queueJob( - 1, 'default', $strWalFile, OP_ARCHIVE_PUSH_FILE, [$self->{strWalPath}, $strWalFile, optionGet(OPTION_COMPRESS)]); + 1, 'default', $strWalFile, OP_ARCHIVE_PUSH_FILE, [$self->{strWalPath}, $strWalFile, cfgOption(CFGOPT_COMPRESS)]); } # Process jobs if there are any @@ -218,7 +218,7 @@ sub processQueue eval { # Hold a lock when the repo is remote to be sure no other process is pushing WAL - !isRepoLocal() && protocolGet(BACKUP); + !isRepoLocal() && protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP); while (my $hyJob = $self->{oArchiveProcess}->process()) { @@ -256,7 +256,7 @@ sub processQueue } # Drop any jobs that exceed the queue max - if (optionTest(OPTION_ARCHIVE_QUEUE_MAX)) + if (cfgOptionTest(CFGOPT_ARCHIVE_QUEUE_MAX)) { my $stryDropList = $self->dropList($self->readyList()); @@ -267,7 +267,7 @@ sub processQueue $self->walStatusWrite( WAL_STATUS_OK, $strDropFile, 0, "dropped WAL file ${strDropFile} because archive queue exceeded " . - optionGet(OPTION_ARCHIVE_QUEUE_MAX) . ' bytes'); + cfgOption(CFGOPT_ARCHIVE_QUEUE_MAX) . ' bytes'); $iDropTotal++; } diff --git a/lib/pgBackRest/Archive/Push/File.pm b/lib/pgBackRest/Archive/Push/File.pm index 9a3fda973..b9864fef3 100644 --- a/lib/pgBackRest/Archive/Push/File.pm +++ b/lib/pgBackRest/Archive/Push/File.pm @@ -60,7 +60,7 @@ sub archivePushCheck if (!isRepoLocal()) { # Execute the command - ($strArchiveId, $strChecksum) = protocolGet(BACKUP)->cmdExecute( + ($strArchiveId, $strChecksum) = protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP)->cmdExecute( OP_ARCHIVE_PUSH_CHECK, [$strArchiveFile, $strDbVersion, $ullDbSysId], true); } else @@ -89,7 +89,7 @@ sub archivePushCheck my $strWarning; - if (defined($strChecksum) && !commandTest(CMD_REMOTE)) + if (defined($strChecksum) && !cfgCommandTest(CFGCMD_REMOTE)) { my ($strChecksumNew) = storageDb()->hashSize($strWalFile); diff --git a/lib/pgBackRest/Archive/Push/Push.pm b/lib/pgBackRest/Archive/Push/Push.pm index e85c4ae64..72766eafb 100644 --- a/lib/pgBackRest/Archive/Push/Push.pm +++ b/lib/pgBackRest/Archive/Push/Push.pm @@ -56,7 +56,7 @@ sub process # Make sure the command happens on the db side if (!isDbLocal()) { - confess &log(ERROR, CMD_ARCHIVE_PUSH . ' operation must run on db host', ERROR_HOST_INVALID); + confess &log(ERROR, cfgCommandName(CFGCMD_ARCHIVE_PUSH) . ' operation must run on db host', ERROR_HOST_INVALID); } if (!defined($strWalPathFile)) @@ -68,21 +68,21 @@ sub process lockStopTest(); # Extract WAL path and file - my $strWalPath = dirname(walPath($strWalPathFile, optionGet(OPTION_DB_PATH, false), commandGet())); + my $strWalPath = dirname(walPath($strWalPathFile, cfgOption(CFGOPT_DB_PATH, false), cfgCommandName(cfgCommandGet()))); my $strWalFile = basename($strWalPathFile); # Is the async client or server? my $bClient = true; # Start the async process and wait for WAL to complete - if (optionGet(OPTION_ARCHIVE_ASYNC)) + if (cfgOption(CFGOPT_ARCHIVE_ASYNC)) { # Get the spool path $self->{strSpoolPath} = storageSpool()->pathGet(STORAGE_SPOOL_ARCHIVE_OUT); # Loop to check for status files and launch async process my $bPushed = false; - my $oWait = waitInit(optionGet(OPTION_ARCHIVE_TIMEOUT)); + my $oWait = waitInit(cfgOption(CFGOPT_ARCHIVE_TIMEOUT)); $self->{bConfessOnError} = false; do @@ -106,7 +106,7 @@ sub process if (!$bPushed && $bClient) { confess &log(ERROR, - "unable to push WAL ${strWalFile} asynchronously after " . optionGet(OPTION_ARCHIVE_TIMEOUT) . " second(s)", + "unable to push WAL ${strWalFile} asynchronously after " . cfgOption(CFGOPT_ARCHIVE_TIMEOUT) . " second(s)", ERROR_ARCHIVE_TIMEOUT); } } @@ -120,22 +120,22 @@ sub process # Drop file if queue max has been exceeded $self->{strWalPath} = $strWalPath; - if (optionTest(OPTION_ARCHIVE_QUEUE_MAX) && @{$self->dropList($self->readyList())} > 0) + if (cfgOptionTest(CFGOPT_ARCHIVE_QUEUE_MAX) && @{$self->dropList($self->readyList())} > 0) { &log(WARN, - "dropped WAL file ${strWalFile} because archive queue exceeded " . optionGet(OPTION_ARCHIVE_QUEUE_MAX) . ' bytes'); + "dropped WAL file ${strWalFile} because archive queue exceeded " . cfgOption(CFGOPT_ARCHIVE_QUEUE_MAX) . ' bytes'); } # Else push the WAL file else { - archivePushFile($strWalPath, $strWalFile, optionGet(OPTION_COMPRESS)); + archivePushFile($strWalPath, $strWalFile, cfgOption(CFGOPT_COMPRESS)); } } # Only print the message if this is the async client or the WAL file was pushed synchronously if ($bClient) { - &log(INFO, "pushed WAL segment ${strWalFile}" . (optionGet(OPTION_ARCHIVE_ASYNC) ? ' asynchronously' : '')); + &log(INFO, "pushed WAL segment ${strWalFile}" . (cfgOption(CFGOPT_ARCHIVE_ASYNC) ? ' asynchronously' : '')); } # Return from function and log return values if any @@ -337,7 +337,7 @@ sub dropList my $stryDropFile = []; # Determine if there are any to be dropped - if (@{$stryReadyFile} > int(optionGet(OPTION_ARCHIVE_QUEUE_MAX) / PG_WAL_SIZE)) + if (@{$stryReadyFile} > int(cfgOption(CFGOPT_ARCHIVE_QUEUE_MAX) / PG_WAL_SIZE)) { $stryDropFile = $stryReadyFile; } diff --git a/lib/pgBackRest/Backup/Backup.pm b/lib/pgBackRest/Backup/Backup.pm index 3049b3326..efd91f10f 100644 --- a/lib/pgBackRest/Backup/Backup.pm +++ b/lib/pgBackRest/Backup/Backup.pm @@ -13,7 +13,6 @@ use File::Basename; use pgBackRest::Archive::Common; use pgBackRest::Archive::Get::Get; -use pgBackRest::Backup::Filter::PageChecksum; # ??? Temporary until isLibC is moved to a better place use pgBackRest::Backup::Common; use pgBackRest::Backup::File; use pgBackRest::Backup::Info; @@ -26,6 +25,7 @@ use pgBackRest::Common::String; use pgBackRest::Config::Config; use pgBackRest::Db; use pgBackRest::DbVersion; +use pgBackRest::LibCLoad; use pgBackRest::Manifest; use pgBackRest::Protocol::Local::Process; use pgBackRest::Protocol::Helper; @@ -227,25 +227,26 @@ sub processManifest # Get the master protocol for keep-alive my $oProtocolMaster = - !isDbLocal({iRemoteIdx => $self->{iMasterRemoteIdx}}) ? protocolGet(DB, $self->{iMasterRemoteIdx}) : undef; + !isDbLocal({iRemoteIdx => $self->{iMasterRemoteIdx}}) ? + protocolGet(CFGOPTVAL_REMOTE_TYPE_DB, $self->{iMasterRemoteIdx}) : undef; defined($oProtocolMaster) && $oProtocolMaster->noOp(); # Initialize the backup process - my $oBackupProcess = new pgBackRest::Protocol::Local::Process(DB); + my $oBackupProcess = new pgBackRest::Protocol::Local::Process(CFGOPTVAL_LOCAL_TYPE_DB); if ($self->{iCopyRemoteIdx} != $self->{iMasterRemoteIdx}) { $oBackupProcess->hostAdd($self->{iMasterRemoteIdx}, 1); } - $oBackupProcess->hostAdd($self->{iCopyRemoteIdx}, optionGet(OPTION_PROCESS_MAX)); + $oBackupProcess->hostAdd($self->{iCopyRemoteIdx}, cfgOption(CFGOPT_PROCESS_MAX)); # Variables used for parallel copy my $lFileTotal = 0; my $lSizeTotal = 0; # If this is a full backup or hard-linked then create all paths and tablespace links - if ($bHardLink || $strType eq BACKUP_TYPE_FULL) + if ($bHardLink || $strType eq CFGOPTVAL_BACKUP_TYPE_FULL) { # Create paths foreach my $strPath ($oBackupManifest->keys(MANIFEST_SECTION_TARGET_PATH)) @@ -345,9 +346,9 @@ sub processManifest $iHostConfigIdx, $strQueueKey, $strRepoFile, OP_BACKUP_FILE, [$strDbFile, $strRepoFile, $lSize, $oBackupManifest->get(MANIFEST_SECTION_TARGET_FILE, $strRepoFile, MANIFEST_SUBKEY_CHECKSUM, false), - optionGet(OPTION_CHECKSUM_PAGE) ? isChecksumPage($strRepoFile) : false, $strBackupLabel, $bCompress, + cfgOption(CFGOPT_CHECKSUM_PAGE) ? isChecksumPage($strRepoFile) : false, $strBackupLabel, $bCompress, $oBackupManifest->numericGet(MANIFEST_SECTION_TARGET_FILE, $strRepoFile, MANIFEST_SUBKEY_TIMESTAMP, false), - $bIgnoreMissing, optionGet(OPTION_CHECKSUM_PAGE) && isChecksumPage($strRepoFile) ? $hStartLsnParam : undef]); + $bIgnoreMissing, cfgOption(CFGOPT_CHECKSUM_PAGE) && isChecksumPage($strRepoFile) ? $hStartLsnParam : undef]); # Size and checksum will be removed and then verified later as a sanity check $oBackupManifest->remove(MANIFEST_SECTION_TARGET_FILE, $strRepoFile, MANIFEST_SUBKEY_SIZE); @@ -355,7 +356,7 @@ sub processManifest } # pg_control should always be in the backup (unless this is an offline backup) - if (!$oBackupManifest->test(MANIFEST_SECTION_TARGET_FILE, MANIFEST_FILE_PGCONTROL) && optionGet(OPTION_ONLINE)) + if (!$oBackupManifest->test(MANIFEST_SECTION_TARGET_FILE, MANIFEST_FILE_PGCONTROL) && cfgOption(CFGOPT_ONLINE)) { confess &log(ERROR, DB_FILE_PGCONTROL . " must be present in all online backups\n" . 'HINT: is something wrong with the clock or filesystem timestamps?', ERROR_FILE_MISSING); @@ -363,7 +364,7 @@ sub processManifest # If there are no files to backup then we'll exit with an error unless in test mode. The other way this could happen is if # the database is down and backup is called with --no-online twice in a row. - if ($lFileTotal == 0 && !optionGet(OPTION_TEST)) + if ($lFileTotal == 0 && !cfgOption(CFGOPT_TEST)) { confess &log(ERROR, "no files have changed since the last backup - this seems unlikely", ERROR_FILE_MISSING); } @@ -375,10 +376,10 @@ sub processManifest my $lManifestSaveCurrent = 0; my $lManifestSaveSize = int($lSizeTotal / 100); - if (optionSource(OPTION_MANIFEST_SAVE_THRESHOLD) ne SOURCE_DEFAULT || - $lManifestSaveSize < optionGet(OPTION_MANIFEST_SAVE_THRESHOLD)) + if (cfgOptionSource(CFGOPT_MANIFEST_SAVE_THRESHOLD) ne CFGDEF_SOURCE_DEFAULT || + $lManifestSaveSize < cfgOption(CFGOPT_MANIFEST_SAVE_THRESHOLD)) { - $lManifestSaveSize = optionGet(OPTION_MANIFEST_SAVE_THRESHOLD); + $lManifestSaveSize = cfgOption(CFGOPT_MANIFEST_SAVE_THRESHOLD); } # Run the backup jobs and process results @@ -387,7 +388,7 @@ sub processManifest foreach my $hJob (@{$hyJob}) { ($lSizeCurrent, $lManifestSaveCurrent) = backupManifestUpdate( - $oBackupManifest, optionGet(optionIndex(OPTION_DB_HOST, $hJob->{iHostConfigIdx}), false), $hJob->{iProcessId}, + $oBackupManifest, cfgOption(cfgOptionIndex(CFGOPT_DB_HOST, $hJob->{iHostConfigIdx}), false), $hJob->{iProcessId}, @{$hJob->{rParam}}[0..4], @{$hJob->{rResult}}, $lSizeTotal, $lSizeCurrent, $lManifestSaveSize, $lManifestSaveCurrent); } @@ -427,9 +428,9 @@ sub process my $oStorageRepo = storageRepo(); # Store local type, compress, and hardlink options since they can be modified by the process - my $strType = optionGet(OPTION_TYPE); - my $bCompress = optionGet(OPTION_COMPRESS); - my $bHardLink = optionGet(OPTION_HARDLINK); + my $strType = cfgOption(CFGOPT_TYPE); + my $bCompress = cfgOption(CFGOPT_COMPRESS); + my $bHardLink = cfgOption(CFGOPT_HARDLINK); # Create the cluster backup and history path $oStorageRepo->pathCreate( @@ -451,11 +452,11 @@ sub process $self->{iCopyRemoteIdx} = $self->{iMasterRemoteIdx}; } - # If backup from standby option is set but we could not get the standby object then, turn off OPTION_BACKUP_STANDBY & warn that + # If backup from standby option is set but we could not get the standby object then, turn off CFGOPT_BACKUP_STANDBY & warn that # backups will be performed from the master. - if (!defined($oDbStandby) && optionGet(OPTION_BACKUP_STANDBY)) + if (!defined($oDbStandby) && cfgOption(CFGOPT_BACKUP_STANDBY)) { - optionSet(OPTION_BACKUP_STANDBY, false); + cfgOptionSet(CFGOPT_BACKUP_STANDBY, false); &log(WARN, 'option backup-standby is enabled but standby is not properly configured - ' . 'backups will be performed from the master'); } @@ -464,8 +465,8 @@ sub process my $oStorageDbMaster = storageDb({iRemoteIdx => $self->{iMasterRemoteIdx}}); # Determine the database paths - my $strDbMasterPath = optionGet(optionIndex(OPTION_DB_PATH, $self->{iMasterRemoteIdx})); - my $strDbCopyPath = optionGet(optionIndex(OPTION_DB_PATH, $self->{iCopyRemoteIdx})); + my $strDbMasterPath = cfgOption(cfgOptionIndex(CFGOPT_DB_PATH, $self->{iMasterRemoteIdx})); + my $strDbCopyPath = cfgOption(cfgOptionIndex(CFGOPT_DB_PATH, $self->{iCopyRemoteIdx})); # Database info my ($strDbVersion, $iControlVersion, $iCatalogVersion, $ullDbSysId) = $oDbMaster->info(); @@ -476,9 +477,10 @@ sub process my $oLastManifest; my $strBackupLastPath; - if ($strType ne BACKUP_TYPE_FULL) + if ($strType ne CFGOPTVAL_BACKUP_TYPE_FULL) { - $strBackupLastPath = $oBackupInfo->last($strType eq BACKUP_TYPE_DIFF ? BACKUP_TYPE_FULL : BACKUP_TYPE_INCR); + $strBackupLastPath = $oBackupInfo->last( + $strType eq CFGOPTVAL_BACKUP_TYPE_DIFF ? CFGOPTVAL_BACKUP_TYPE_FULL : CFGOPTVAL_BACKUP_TYPE_INCR); # If there is a prior backup and it is for the current database, then use it as base if (defined($strBackupLastPath) && $oBackupInfo->confirmDb($strBackupLastPath, $strDbVersion, $ullDbSysId)) @@ -511,7 +513,7 @@ sub process else { &log(WARN, "no prior backup exists, ${strType} backup has been changed to full"); - $strType = BACKUP_TYPE_FULL; + $strType = CFGOPTVAL_BACKUP_TYPE_FULL; $strBackupLastPath = undef; } } @@ -534,7 +536,7 @@ sub process # Attempt to read the manifest file in the aborted backup to see if it can be used. If any error at all occurs then the # backup will be considered unusable and a resume will not be attempted. - if (optionGet(OPTION_RESUME)) + if (cfgOption(CFGOPT_RESUME)) { $strReason = "unable to read ${strBackupPath}/" . FILE_MANIFEST; @@ -580,18 +582,18 @@ sub process } # Check compression elsif ($oAbortedManifest->boolGet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_COMPRESS) != - optionGet(OPTION_COMPRESS)) + cfgOption(CFGOPT_COMPRESS)) { $strKey = MANIFEST_KEY_COMPRESS; - $strValueNew = optionGet(OPTION_COMPRESS); + $strValueNew = cfgOption(CFGOPT_COMPRESS); $strValueAborted = $oAbortedManifest->boolGet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_COMPRESS); } # Check hardlink elsif ($oAbortedManifest->boolGet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_HARDLINK) != - optionGet(OPTION_HARDLINK)) + cfgOption(CFGOPT_HARDLINK)) { $strKey = MANIFEST_KEY_HARDLINK; - $strValueNew = optionGet(OPTION_HARDLINK); + $strValueNew = cfgOption(CFGOPT_HARDLINK); $strValueAborted = $oAbortedManifest->boolGet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_HARDLINK); } @@ -645,15 +647,15 @@ sub process # Backup settings $oBackupManifest->set(MANIFEST_SECTION_BACKUP, MANIFEST_KEY_TYPE, undef, $strType); $oBackupManifest->numericSet(MANIFEST_SECTION_BACKUP, MANIFEST_KEY_TIMESTAMP_START, undef, $lTimestampStart); - $oBackupManifest->boolSet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_BACKUP_STANDBY, undef, optionGet(OPTION_BACKUP_STANDBY)); + $oBackupManifest->boolSet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_BACKUP_STANDBY, undef, cfgOption(CFGOPT_BACKUP_STANDBY)); $oBackupManifest->boolSet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_COMPRESS, undef, $bCompress); $oBackupManifest->boolSet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_HARDLINK, undef, $bHardLink); - $oBackupManifest->boolSet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_ONLINE, undef, optionGet(OPTION_ONLINE)); + $oBackupManifest->boolSet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_ONLINE, undef, cfgOption(CFGOPT_ONLINE)); $oBackupManifest->boolSet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_ARCHIVE_COPY, undef, - !optionGet(OPTION_ONLINE) || - (optionGet(OPTION_BACKUP_ARCHIVE_CHECK) && optionGet(OPTION_BACKUP_ARCHIVE_COPY))); + !cfgOption(CFGOPT_ONLINE) || + (cfgOption(CFGOPT_ARCHIVE_CHECK) && cfgOption(CFGOPT_ARCHIVE_COPY))); $oBackupManifest->boolSet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_ARCHIVE_CHECK, undef, - !optionGet(OPTION_ONLINE) || optionGet(OPTION_BACKUP_ARCHIVE_CHECK)); + !cfgOption(CFGOPT_ONLINE) || cfgOption(CFGOPT_ARCHIVE_CHECK)); # Database settings $oBackupManifest->numericSet(MANIFEST_SECTION_BACKUP_DB, MANIFEST_KEY_DB_ID, undef, $iDbHistoryId); @@ -663,11 +665,11 @@ sub process $oBackupManifest->numericSet(MANIFEST_SECTION_BACKUP_DB, MANIFEST_KEY_SYSTEM_ID, undef, $ullDbSysId); # Backup from standby can only be used on PostgreSQL >= 9.1 - if (optionGet(OPTION_ONLINE) && optionGet(OPTION_BACKUP_STANDBY) && $strDbVersion < PG_VERSION_BACKUP_STANDBY) + if (cfgOption(CFGOPT_ONLINE) && cfgOption(CFGOPT_BACKUP_STANDBY) && $strDbVersion < PG_VERSION_BACKUP_STANDBY) { - confess &log( - ERROR, - 'option \'' . OPTION_BACKUP_STANDBY . '\' not valid for PostgreSQL < ' . PG_VERSION_BACKUP_STANDBY, ERROR_CONFIG); + confess &log(ERROR, + 'option \'' . cfgOptionName(CFGOPT_BACKUP_STANDBY) . '\' not valid for PostgreSQL < ' . PG_VERSION_BACKUP_STANDBY, + ERROR_CONFIG); } # Start backup (unless --no-online is set) @@ -677,33 +679,33 @@ sub process my $hDatabaseMap = undef; # Only allow page checksums if the C library is available - if (!isLibC()) + if (!libC()) { # Warn if page checksums were expicitly requested - if (optionTest(OPTION_CHECKSUM_PAGE) && optionGet(OPTION_CHECKSUM_PAGE)) + if (cfgOptionTest(CFGOPT_CHECKSUM_PAGE) && cfgOption(CFGOPT_CHECKSUM_PAGE)) { &log(WARN, "page checksums disabled - pgBackRest::LibC module is not present"); } # Disable page checksums - optionSet(OPTION_CHECKSUM_PAGE, false); + cfgOptionSet(CFGOPT_CHECKSUM_PAGE, false); } # If this is an offline backup - if (!optionGet(OPTION_ONLINE)) + if (!cfgOption(CFGOPT_ONLINE)) { # If checksum-page is not explictly enabled then disable it. Even if the version is high enough to have checksums we can't # know if they are enabled without asking the database. When pg_control can be reliably parsed then this decision could be # based on that. - if (!optionTest(OPTION_CHECKSUM_PAGE)) + if (!cfgOptionTest(CFGOPT_CHECKSUM_PAGE)) { - optionSet(OPTION_CHECKSUM_PAGE, false); + cfgOptionSet(CFGOPT_CHECKSUM_PAGE, false); } # Check if Postgres is running and if so only continue when forced if ($oStorageDbMaster->exists($strDbMasterPath . '/' . DB_FILE_POSTMASTERPID)) { - if (optionGet(OPTION_FORCE)) + if (cfgOption(CFGOPT_FORCE)) { &log(WARN, '--no-online passed and ' . DB_FILE_POSTMASTERPID . ' exists but --force was passed so backup will ' . 'continue though it looks like the postmaster is running and the backup will probably not be ' . @@ -722,7 +724,7 @@ sub process # Start the backup ($strArchiveStart, $strLsnStart) = $oDbMaster->backupStart( - BACKREST_NAME . ' backup started at ' . timestampFormat(undef, $lTimestampStart), optionGet(OPTION_START_FAST)); + BACKREST_NAME . ' backup started at ' . timestampFormat(undef, $lTimestampStart), cfgOption(CFGOPT_START_FAST)); # Record the archive start location $oBackupManifest->set(MANIFEST_SECTION_BACKUP, MANIFEST_KEY_ARCHIVE_START, undef, $strArchiveStart); @@ -736,7 +738,7 @@ sub process $hDatabaseMap = $oDbMaster->databaseMapGet(); # Wait for replay on the standby to catch up - if (optionGet(OPTION_BACKUP_STANDBY)) + if (cfgOption(CFGOPT_BACKUP_STANDBY)) { my ($strStandbyDbVersion, $iStandbyControlVersion, $iStandbyCatalogVersion, $ullStandbyDbSysId) = $oDbStandby->info(); $oBackupInfo->check($strStandbyDbVersion, $iStandbyControlVersion, $iStandbyCatalogVersion, $ullStandbyDbSysId); @@ -754,41 +756,41 @@ sub process # The standby db object won't be used anymore so undef it to catch any subsequent references undef($oDbStandby); - protocolDestroy(DB, $self->{iCopyRemoteIdx}, true); + protocolDestroy(CFGOPTVAL_REMOTE_TYPE_DB, $self->{iCopyRemoteIdx}, true); } } # Don't allow the checksum-page option to change in a diff or incr backup. This could be confusing as only certain files would # be checksummed and the list could be incomplete during reporting. - if ($strType ne BACKUP_TYPE_FULL && defined($strBackupLastPath)) + if ($strType ne CFGOPTVAL_BACKUP_TYPE_FULL && defined($strBackupLastPath)) { # If not defined this backup was done in a version prior to page checksums being introduced. Just set checksum-page to # false and move on without a warning. Page checksums will start on the next full backup. if (!$oLastManifest->test(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_CHECKSUM_PAGE)) { - optionSet(OPTION_CHECKSUM_PAGE, false); + cfgOptionSet(CFGOPT_CHECKSUM_PAGE, false); } else { my $bChecksumPageLast = $oLastManifest->boolGet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_CHECKSUM_PAGE); - if ($bChecksumPageLast != optionGet(OPTION_CHECKSUM_PAGE)) + if ($bChecksumPageLast != cfgOption(CFGOPT_CHECKSUM_PAGE)) { &log(WARN, - "${strType} backup cannot alter '" . OPTION_CHECKSUM_PAGE . "' option to '" . - boolFormat(optionGet(OPTION_CHECKSUM_PAGE)) . "', reset to '" . boolFormat($bChecksumPageLast) . + "${strType} backup cannot alter '" . cfgOptionName(CFGOPT_CHECKSUM_PAGE) . "' option to '" . + boolFormat(cfgOption(CFGOPT_CHECKSUM_PAGE)) . "', reset to '" . boolFormat($bChecksumPageLast) . "' from ${strBackupLastPath}"); - optionSet(OPTION_CHECKSUM_PAGE, $bChecksumPageLast); + cfgOptionSet(CFGOPT_CHECKSUM_PAGE, $bChecksumPageLast); } } } # Record checksum-page option in the manifest - $oBackupManifest->boolSet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_CHECKSUM_PAGE, undef, optionGet(OPTION_CHECKSUM_PAGE)); + $oBackupManifest->boolSet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_CHECKSUM_PAGE, undef, cfgOption(CFGOPT_CHECKSUM_PAGE)); # Build the manifest - $oBackupManifest->build($oStorageDbMaster, $strDbVersion, $strDbMasterPath, $oLastManifest, optionGet(OPTION_ONLINE), + $oBackupManifest->build($oStorageDbMaster, $strDbVersion, $strDbMasterPath, $oLastManifest, cfgOption(CFGOPT_ONLINE), $hTablespaceMap, $hDatabaseMap); &log(TEST, TEST_MANIFEST_BUILD); @@ -825,7 +827,7 @@ sub process my $strArchiveStop = undef; my $strLsnStop = undef; - if (optionGet(OPTION_ONLINE)) + if (cfgOption(CFGOPT_ONLINE)) { ($strArchiveStop, $strLsnStop, my $strTimestampDbStop, my $oFileHash) = $oDbMaster->backupStop(); @@ -872,7 +874,7 @@ sub process # If archive logs are required to complete the backup, then check them. This is the default, but can be overridden if the # archive logs are going to a different server. Be careful of this option because there is no way to verify that the backup # will be consistent - at least not here. - if (optionGet(OPTION_ONLINE) && optionGet(OPTION_BACKUP_ARCHIVE_CHECK)) + if (cfgOption(CFGOPT_ONLINE) && cfgOption(CFGOPT_ARCHIVE_CHECK)) { # Save the backup manifest before getting archive logs in case of failure $oBackupManifest->saveCopy(); @@ -887,10 +889,10 @@ sub process foreach my $strArchive (@stryArchive) { - my $strArchiveFile = walSegmentFind($oStorageRepo, $strArchiveId, $strArchive, optionGet(OPTION_ARCHIVE_TIMEOUT)); + my $strArchiveFile = walSegmentFind($oStorageRepo, $strArchiveId, $strArchive, cfgOption(CFGOPT_ARCHIVE_TIMEOUT)); $strArchive = substr($strArchiveFile, 0, 24); - if (optionGet(OPTION_BACKUP_ARCHIVE_COPY)) + if (cfgOption(CFGOPT_ARCHIVE_COPY)) { logDebugMisc($strOperation, "archive: ${strArchive} (${strArchiveFile})"); diff --git a/lib/pgBackRest/Backup/Common.pm b/lib/pgBackRest/Backup/Common.pm index df02db81e..8ac623cef 100644 --- a/lib/pgBackRest/Backup/Common.pm +++ b/lib/pgBackRest/Backup/Common.pm @@ -22,7 +22,7 @@ use pgBackRest::Manifest; #################################################################################################################################### # Latest backup link constant #################################################################################################################################### -use constant LINK_LATEST => OPTION_DEFAULT_RESTORE_SET; +use constant LINK_LATEST => 'latest'; push @EXPORT, qw(LINK_LATEST); #################################################################################################################################### @@ -140,7 +140,7 @@ sub backupLabelFormat # Full backup label my $strBackupLabel; - if ($strType eq BACKUP_TYPE_FULL) + if ($strType eq CFGOPTVAL_BACKUP_TYPE_FULL) { # Last backup label must not be defined if (defined($strBackupLabelLast)) @@ -167,7 +167,7 @@ sub backupLabelFormat $strBackupLabel .= '_' . timestampFileFormat(undef, $lTimestampStart); # Add the diff indicator - if ($strType eq BACKUP_TYPE_DIFF) + if ($strType eq CFGOPTVAL_BACKUP_TYPE_DIFF) { $strBackupLabel .= 'D'; } @@ -223,13 +223,13 @@ sub backupLabel if ($oStorageRepo->list( STORAGE_REPO_BACKUP, {strExpression => - ($strType eq BACKUP_TYPE_FULL ? '^' : '_') . timestampFileFormat(undef, $lTimestampStart) . - ($strType eq BACKUP_TYPE_FULL ? 'F' : '(D|I)$')}) || + ($strType eq CFGOPTVAL_BACKUP_TYPE_FULL ? '^' : '_') . timestampFileFormat(undef, $lTimestampStart) . + ($strType eq CFGOPTVAL_BACKUP_TYPE_FULL ? 'F' : '(D|I)$')}) || $oStorageRepo->list( STORAGE_REPO_BACKUP . qw{/} . PATH_BACKUP_HISTORY . '/' . timestampFormat('%4d', $lTimestampStart), {strExpression => - ($strType eq BACKUP_TYPE_FULL ? '^' : '_') . timestampFileFormat(undef, $lTimestampStart) . - ($strType eq BACKUP_TYPE_FULL ? 'F' : '(D|I)\.manifest\.' . COMPRESS_EXT . qw{$}), + ($strType eq CFGOPTVAL_BACKUP_TYPE_FULL ? '^' : '_') . timestampFileFormat(undef, $lTimestampStart) . + ($strType eq CFGOPTVAL_BACKUP_TYPE_FULL ? 'F' : '(D|I)\.manifest\.' . COMPRESS_EXT . qw{$}), bIgnoreMissing => true})) { waitRemainder(); diff --git a/lib/pgBackRest/Backup/Filter/PageChecksum.pm b/lib/pgBackRest/Backup/Filter/PageChecksum.pm index 166f97853..2eaae468e 100644 --- a/lib/pgBackRest/Backup/Filter/PageChecksum.pm +++ b/lib/pgBackRest/Backup/Filter/PageChecksum.pm @@ -14,6 +14,7 @@ use Exporter qw(import); use pgBackRest::Common::Exception; use pgBackRest::Common::Log; use pgBackRest::DbVersion qw(PG_PAGE_SIZE); +use pgBackRest::LibCLoad; #################################################################################################################################### # Package name constant @@ -24,30 +25,12 @@ use constant BACKUP_FILTER_PAGECHECKSUM => __PACKAGE #################################################################################################################################### # Load the C library if present #################################################################################################################################### -my $bLibC = false; - -eval +if (libC()) { # Load the C library only if page checksums are required require pgBackRest::LibC; pgBackRest::LibC->import(qw(:checksum)); - - $bLibC = true; - - return 1; -} or do {}; - -#################################################################################################################################### -# isLibC -# -# Does the C library exist? -#################################################################################################################################### -sub isLibC -{ - return $bLibC; -} - -push @EXPORT, qw(isLibC); +}; #################################################################################################################################### # CONSTRUCTOR diff --git a/lib/pgBackRest/Backup/Info.pm b/lib/pgBackRest/Backup/Info.pm index a837fcf07..0cfcbd6e0 100644 --- a/lib/pgBackRest/Backup/Info.pm +++ b/lib/pgBackRest/Backup/Info.pm @@ -520,7 +520,7 @@ sub add $oBackupManifest->get(MANIFEST_SECTION_BACKUP_DB, MANIFEST_KEY_DB_ID)); } - if (!$oBackupManifest->test(MANIFEST_SECTION_BACKUP, MANIFEST_KEY_TYPE, undef, BACKUP_TYPE_FULL)) + if (!$oBackupManifest->test(MANIFEST_SECTION_BACKUP, MANIFEST_KEY_TYPE, undef, CFGOPTVAL_BACKUP_TYPE_FULL)) { my @stryReference = sort(keys(%$oReferenceHash)); @@ -774,7 +774,7 @@ sub last {name => 'strType'} ); - my $strFilter = backupRegExpGet(true, $strType ne BACKUP_TYPE_FULL, $strType eq BACKUP_TYPE_INCR); + my $strFilter = backupRegExpGet(true, $strType ne CFGOPTVAL_BACKUP_TYPE_FULL, $strType eq CFGOPTVAL_BACKUP_TYPE_INCR); my $strBackup = ($self->list($strFilter, 'reverse'))[0]; # Return from function and log return values if any diff --git a/lib/pgBackRest/Check/Check.pm b/lib/pgBackRest/Check/Check.pm index f47006cca..246245769 100644 --- a/lib/pgBackRest/Check/Check.pm +++ b/lib/pgBackRest/Check/Check.pm @@ -62,7 +62,7 @@ sub process $oDb->configValidate(); # Get the timeout and error message to display - if it is 0 we are testing - my $iArchiveTimeout = optionGet(OPTION_ARCHIVE_TIMEOUT); + my $iArchiveTimeout = cfgOption(CFGOPT_ARCHIVE_TIMEOUT); # Initialize the result variables my $iResult = 0; @@ -127,7 +127,7 @@ sub process } # Reset the console logging - logLevelSet(undef, optionGet(OPTION_LOG_LEVEL_CONSOLE)); + logLevelSet(undef, cfgOption(CFGOPT_LOG_LEVEL_CONSOLE)); # If the archiving was successful and backup.info check did not error in an unexpected way, then indicate success # Else, log the error. @@ -204,7 +204,7 @@ sub backupInfoCheck if (!isRepoLocal()) { - $iDbHistoryId = protocolGet(BACKUP)->cmdExecute( + $iDbHistoryId = protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP)->cmdExecute( OP_CHECK_BACKUP_INFO_CHECK, [$strDbVersion, $iControlVersion, $iCatalogVersion, $ullDbSysId]); } else diff --git a/lib/pgBackRest/Common/Lock.pm b/lib/pgBackRest/Common/Lock.pm index 040a6ac33..b7a72049c 100644 --- a/lib/pgBackRest/Common/Lock.pm +++ b/lib/pgBackRest/Common/Lock.pm @@ -36,7 +36,7 @@ sub lockFileName my $strStanza = shift; my $bRemote = shift; - return optionGet(OPTION_LOCK_PATH) . '/' . (defined($strStanza) ? $strStanza : 'global') . "_${strLockType}" . + return cfgOption(CFGOPT_LOCK_PATH) . '/' . (defined($strStanza) ? $strStanza : 'global') . "_${strLockType}" . (defined($bRemote) && $bRemote ? '_remote' : '') . '.lock'; } @@ -47,7 +47,7 @@ sub lockFileName #################################################################################################################################### sub lockPathCreate { - storageLocal()->pathCreate(optionGet(OPTION_LOCK_PATH), {strMode => '770', bIgnoreExists => true, bCreateParent => true}); + storageLocal()->pathCreate(cfgOption(CFGOPT_LOCK_PATH), {strMode => '770', bIgnoreExists => true, bCreateParent => true}); } #################################################################################################################################### @@ -92,7 +92,7 @@ sub lockAcquire lockPathCreate(); # Attempt to open the lock file - $strCurrentLockFile = lockFileName($strLockType, optionGet(OPTION_STANZA, false), $bRemote); + $strCurrentLockFile = lockFileName($strLockType, cfgOption(CFGOPT_STANZA, false), $bRemote); sysopen($hCurrentLockHandle, $strCurrentLockFile, O_WRONLY | O_CREAT, oct(640)) or confess &log(ERROR, "unable to open lock file ${strCurrentLockFile}", ERROR_FILE_OPEN); @@ -182,7 +182,7 @@ sub lockStopFileName { my $strStanza = shift; - return optionGet(OPTION_LOCK_PATH) . (defined($strStanza) ? "/${strStanza}" : '/all') . '.stop'; + return cfgOption(CFGOPT_LOCK_PATH) . (defined($strStanza) ? "/${strStanza}" : '/all') . '.stop'; } #################################################################################################################################### @@ -197,13 +197,13 @@ sub lockStop lockPathCreate(); # Generate the stop file name - my $strStopFile = lockStopFileName(optionGet(OPTION_STANZA, false)); + my $strStopFile = lockStopFileName(cfgOption(CFGOPT_STANZA, false)); # If the stop file already exists then warn if (-e $strStopFile) { &log(WARN, 'stop file already exists' . - (optionTest(OPTION_STANZA) ? ' for stanza ' . optionGet(OPTION_STANZA) : ' for all stanzas')); + (cfgOptionTest(CFGOPT_STANZA) ? ' for stanza ' . cfgOption(CFGOPT_STANZA) : ' for all stanzas')); return false; } @@ -213,9 +213,9 @@ sub lockStop close($hStopHandle); # If --force was specified then send term signals to running processes - if (optionGet(OPTION_FORCE)) + if (cfgOption(CFGOPT_FORCE)) { - my $strLockPath = optionGet(OPTION_LOCK_PATH); + my $strLockPath = cfgOption(CFGOPT_LOCK_PATH); opendir(my $hPath, $strLockPath) or confess &log(ERROR, "unable to open lock path ${strLockPath}", ERROR_PATH_OPEN); @@ -285,14 +285,14 @@ sub lockStopTest my ($strOperation) = logDebugParam(__PACKAGE__ . '::lockStopTest'); # Check the stanza first if it is specified - if (optionTest(OPTION_STANZA)) + if (cfgOptionTest(CFGOPT_STANZA)) { # Generate the stop file name - my $strStopFile = lockStopFileName(optionGet(OPTION_STANZA)); + my $strStopFile = lockStopFileName(cfgOption(CFGOPT_STANZA)); if (-e $strStopFile) { - confess &log(ERROR, 'stop file exists for stanza ' . optionGet(OPTION_STANZA), ERROR_STOP); + confess &log(ERROR, 'stop file exists for stanza ' . cfgOption(CFGOPT_STANZA), ERROR_STOP); } } @@ -318,12 +318,12 @@ push @EXPORT, qw(lockStopTest); sub lockStart { # Generate the stop file name - my $strStopFile = lockStopFileName(optionGet(OPTION_STANZA, false)); + my $strStopFile = lockStopFileName(cfgOption(CFGOPT_STANZA, false)); # If the stop file doesn't exist then warn if (!-e $strStopFile) { - &log(WARN, 'stop file does not exist' . (optionTest(OPTION_STANZA) ? ' for stanza ' . optionGet(OPTION_STANZA) : '')); + &log(WARN, 'stop file does not exist' . (cfgOptionTest(CFGOPT_STANZA) ? ' for stanza ' . cfgOption(CFGOPT_STANZA) : '')); return false; } diff --git a/lib/pgBackRest/Common/Log.pm b/lib/pgBackRest/Common/Log.pm index e3fd5972d..eecb4f552 100644 --- a/lib/pgBackRest/Common/Log.pm +++ b/lib/pgBackRest/Common/Log.pm @@ -114,16 +114,13 @@ use constant TEST_ARCHIVE_PUSH_ASYNC_START => 'ARCHIVE- #################################################################################################################################### sub logFileSet { + my $oStorage = shift; my $strFile = shift; # Only open the log file if file logging is enabled if ($strLogLevelFile ne OFF) { - # Load Storage::Helper module - require pgBackRest::Storage::Helper; - pgBackRest::Storage::Helper->import(); - - storageLocal()->pathCreate(dirname($strFile), {strMode => '0770', bIgnoreExists => true, bCreateParent => true}); + $oStorage->pathCreate(dirname($strFile), {strMode => '0770', bIgnoreExists => true, bCreateParent => true}); $strFile .= '.log'; $bLogFileExists = -e $strFile ? true : false; diff --git a/lib/pgBackRest/Config/Config.pm b/lib/pgBackRest/Config/Config.pm index 8dee57f2f..eb59b5f42 100644 --- a/lib/pgBackRest/Config/Config.pm +++ b/lib/pgBackRest/Config/Config.pm @@ -18,2119 +18,44 @@ use pgBackRest::Common::Exception; use pgBackRest::Common::Ini; use pgBackRest::Common::Io::Base; use pgBackRest::Common::Log; +use pgBackRest::Common::String; use pgBackRest::Common::Wait; +use pgBackRest::Config::LoadFailback; use pgBackRest::Version; #################################################################################################################################### -# Command constants - basic commands that are allowed in backrest +# Export config constants and functions #################################################################################################################################### -my %oCommandHash; - -use constant CMD_ARCHIVE_GET => 'archive-get'; - push @EXPORT, qw(CMD_ARCHIVE_GET); - $oCommandHash{&CMD_ARCHIVE_GET} = true; -use constant CMD_ARCHIVE_PUSH => 'archive-push'; - push @EXPORT, qw(CMD_ARCHIVE_PUSH); - $oCommandHash{&CMD_ARCHIVE_PUSH} = true; -use constant CMD_BACKUP => 'backup'; - push @EXPORT, qw(CMD_BACKUP); - $oCommandHash{&CMD_BACKUP} = true; -use constant CMD_CHECK => 'check'; - push @EXPORT, qw(CMD_CHECK); - $oCommandHash{&CMD_CHECK} = true; -use constant CMD_EXPIRE => 'expire'; - push @EXPORT, qw(CMD_EXPIRE); - $oCommandHash{&CMD_EXPIRE} = true; -use constant CMD_HELP => 'help'; - push @EXPORT, qw(CMD_HELP); - $oCommandHash{&CMD_HELP} = true; -use constant CMD_INFO => 'info'; - push @EXPORT, qw(CMD_INFO); - $oCommandHash{&CMD_INFO} = true; -use constant CMD_LOCAL => 'local'; - push @EXPORT, qw(CMD_LOCAL); - $oCommandHash{&CMD_LOCAL} = true; -use constant CMD_REMOTE => 'remote'; - push @EXPORT, qw(CMD_REMOTE); - $oCommandHash{&CMD_REMOTE} = true; -use constant CMD_RESTORE => 'restore'; - push @EXPORT, qw(CMD_RESTORE); - $oCommandHash{&CMD_RESTORE} = true; -use constant CMD_STANZA_CREATE => 'stanza-create'; - push @EXPORT, qw(CMD_STANZA_CREATE); - $oCommandHash{&CMD_STANZA_CREATE} = true; -use constant CMD_STANZA_UPGRADE => 'stanza-upgrade'; - push @EXPORT, qw(CMD_STANZA_UPGRADE); - $oCommandHash{&CMD_STANZA_UPGRADE} = true; -use constant CMD_START => 'start'; - push @EXPORT, qw(CMD_START); - $oCommandHash{&CMD_START} = true; -use constant CMD_STOP => 'stop'; - push @EXPORT, qw(CMD_STOP); - $oCommandHash{&CMD_STOP} = true; -use constant CMD_VERSION => 'version'; - push @EXPORT, qw(CMD_VERSION); - $oCommandHash{&CMD_VERSION} = true; - -#################################################################################################################################### -# DB/BACKUP Constants -#################################################################################################################################### -use constant DB => 'db'; - push @EXPORT, qw(DB); -use constant BACKUP => 'backup'; - push @EXPORT, qw(BACKUP); - -#################################################################################################################################### -# BACKUP Type Constants -#################################################################################################################################### -use constant BACKUP_TYPE_FULL => 'full'; - push @EXPORT, qw(BACKUP_TYPE_FULL); -use constant BACKUP_TYPE_DIFF => 'diff'; - push @EXPORT, qw(BACKUP_TYPE_DIFF); -use constant BACKUP_TYPE_INCR => 'incr'; - push @EXPORT, qw(BACKUP_TYPE_INCR); - -#################################################################################################################################### -# REPO Type Constants -#################################################################################################################################### -use constant REPO_TYPE_CIFS => 'cifs'; - push @EXPORT, qw(REPO_TYPE_CIFS); -use constant REPO_TYPE_POSIX => 'posix'; - push @EXPORT, qw(REPO_TYPE_POSIX); -use constant REPO_TYPE_S3 => 's3'; - push @EXPORT, qw(REPO_TYPE_S3); - -#################################################################################################################################### -# INFO Output Constants -#################################################################################################################################### -use constant INFO_OUTPUT_TEXT => 'text'; - push @EXPORT, qw(INFO_OUTPUT_TEXT); -use constant INFO_OUTPUT_JSON => 'json'; - push @EXPORT, qw(INFO_OUTPUT_JSON); +push(@EXPORT, @pgBackRest::Config::LoadFailback::EXPORT); #################################################################################################################################### # SOURCE Constants #################################################################################################################################### -use constant SOURCE_CONFIG => 'config'; - push @EXPORT, qw(SOURCE_CONFIG); -use constant SOURCE_PARAM => 'param'; - push @EXPORT, qw(SOURCE_PARAM); -use constant SOURCE_DEFAULT => 'default'; - push @EXPORT, qw(SOURCE_DEFAULT); - -#################################################################################################################################### -# RECOVERY Type Constants -#################################################################################################################################### -use constant RECOVERY_TYPE_NAME => 'name'; - push @EXPORT, qw(RECOVERY_TYPE_NAME); -use constant RECOVERY_TYPE_TIME => 'time'; - push @EXPORT, qw(RECOVERY_TYPE_TIME); -use constant RECOVERY_TYPE_XID => 'xid'; - push @EXPORT, qw(RECOVERY_TYPE_XID); -use constant RECOVERY_TYPE_PRESERVE => 'preserve'; - push @EXPORT, qw(RECOVERY_TYPE_PRESERVE); -use constant RECOVERY_TYPE_NONE => 'none'; - push @EXPORT, qw(RECOVERY_TYPE_NONE); -use constant RECOVERY_TYPE_IMMEDIATE => 'immediate'; - push @EXPORT, qw(RECOVERY_TYPE_IMMEDIATE); -use constant RECOVERY_TYPE_DEFAULT => 'default'; - push @EXPORT, qw(RECOVERY_TYPE_DEFAULT); - -#################################################################################################################################### -# RECOVERY Action Constants -#################################################################################################################################### -use constant RECOVERY_ACTION_PAUSE => 'pause'; - push @EXPORT, qw(RECOVERY_ACTION_PAUSE); -use constant RECOVERY_ACTION_PROMOTE => 'promote'; - push @EXPORT, qw(RECOVERY_ACTION_PROMOTE); -use constant RECOVERY_ACTION_SHUTDOWN => 'shutdown'; - push @EXPORT, qw(RECOVERY_ACTION_SHUTDOWN); - -#################################################################################################################################### -# Option Rules -#################################################################################################################################### -use constant OPTION_RULE_ALT_NAME => 'alt-name'; - push @EXPORT, qw(OPTION_RULE_ALT_NAME); -use constant OPTION_RULE_ALLOW_LIST => 'allow-list'; - push @EXPORT, qw(OPTION_RULE_ALLOW_LIST); -use constant OPTION_RULE_ALLOW_RANGE => 'allow-range'; - push @EXPORT, qw(OPTION_RULE_ALLOW_RANGE); -use constant OPTION_RULE_DEFAULT => 'default'; - push @EXPORT, qw(OPTION_RULE_DEFAULT); -use constant OPTION_RULE_DEPEND => 'depend'; - push @EXPORT, qw(OPTION_RULE_DEPEND); -use constant OPTION_RULE_DEPEND_OPTION => 'depend-option'; - push @EXPORT, qw(OPTION_RULE_DEPEND_OPTION); -use constant OPTION_RULE_DEPEND_LIST => 'depend-list'; - push @EXPORT, qw(OPTION_RULE_DEPEND_LIST); -use constant OPTION_RULE_DEPEND_VALUE => 'depend-value'; - push @EXPORT, qw(OPTION_RULE_DEPEND_VALUE); -use constant OPTION_RULE_HASH_VALUE => 'hash-value'; - push @EXPORT, qw(OPTION_RULE_HASH_VALUE); -use constant OPTION_RULE_HINT => 'hint'; - push @EXPORT, qw(OPTION_RULE_HINT); -use constant OPTION_RULE_NEGATE => 'negate'; - push @EXPORT, qw(OPTION_RULE_NEGATE); -use constant OPTION_RULE_PREFIX => 'prefix'; - push @EXPORT, qw(OPTION_RULE_PREFIX); -use constant OPTION_RULE_COMMAND => 'command'; - push @EXPORT, qw(OPTION_RULE_COMMAND); -use constant OPTION_RULE_REQUIRED => 'required'; - push @EXPORT, qw(OPTION_RULE_REQUIRED); -use constant OPTION_RULE_SECTION => 'section'; - push @EXPORT, qw(OPTION_RULE_SECTION); -use constant OPTION_RULE_SECURE => 'secure'; - push @EXPORT, qw(OPTION_RULE_SECURE); -use constant OPTION_RULE_TYPE => 'type'; - push @EXPORT, qw(OPTION_RULE_TYPE); - -#################################################################################################################################### -# Option Types -#################################################################################################################################### -use constant OPTION_TYPE_BOOLEAN => 'boolean'; - push @EXPORT, qw(OPTION_TYPE_BOOLEAN); -use constant OPTION_TYPE_FLOAT => 'float'; - push @EXPORT, qw(OPTION_TYPE_FLOAT); -use constant OPTION_TYPE_HASH => 'hash'; - push @EXPORT, qw(OPTION_TYPE_HASH); -use constant OPTION_TYPE_INTEGER => 'integer'; - push @EXPORT, qw(OPTION_TYPE_INTEGER); -use constant OPTION_TYPE_STRING => 'string'; - push @EXPORT, qw(OPTION_TYPE_STRING); +use constant CFGDEF_SOURCE_CONFIG => 'config'; + push @EXPORT, qw(CFGDEF_SOURCE_CONFIG); +use constant CFGDEF_SOURCE_PARAM => 'param'; + push @EXPORT, qw(CFGDEF_SOURCE_PARAM); +use constant CFGDEF_SOURCE_DEFAULT => 'default'; + push @EXPORT, qw(CFGDEF_SOURCE_DEFAULT); #################################################################################################################################### # Configuration section constants #################################################################################################################################### -use constant CONFIG_SECTION_GLOBAL => 'global'; - push @EXPORT, qw(CONFIG_SECTION_GLOBAL); -use constant CONFIG_SECTION_STANZA => 'stanza'; - push @EXPORT, qw(CONFIG_SECTION_STANZA); - -#################################################################################################################################### -# Option constants -#################################################################################################################################### -# Command-line only -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_CONFIG => 'config'; - push @EXPORT, qw(OPTION_CONFIG); -use constant OPTION_DELTA => 'delta'; - push @EXPORT, qw(OPTION_DELTA); -use constant OPTION_FORCE => 'force'; - push @EXPORT, qw(OPTION_FORCE); -use constant OPTION_ONLINE => 'online'; - push @EXPORT, qw(OPTION_ONLINE); -use constant OPTION_SET => 'set'; - push @EXPORT, qw(OPTION_SET); -use constant OPTION_STANZA => 'stanza'; - push @EXPORT, qw(OPTION_STANZA); -use constant OPTION_TARGET => 'target'; - push @EXPORT, qw(OPTION_TARGET); -use constant OPTION_TARGET_EXCLUSIVE => 'target-exclusive'; - push @EXPORT, qw(OPTION_TARGET_EXCLUSIVE); -use constant OPTION_TARGET_ACTION => 'target-action'; - push @EXPORT, qw(OPTION_TARGET_ACTION); -use constant OPTION_TARGET_TIMELINE => 'target-timeline'; - push @EXPORT, qw(OPTION_TARGET_TIMELINE); -use constant OPTION_TYPE => 'type'; - push @EXPORT, qw(OPTION_TYPE); -use constant OPTION_OUTPUT => 'output'; - push @EXPORT, qw(OPTION_OUTPUT); - -# Command-line only help/version -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_HELP => 'help'; - push @EXPORT, qw(OPTION_HELP); -use constant OPTION_VERSION => 'version'; - push @EXPORT, qw(OPTION_VERSION); - -# Command-line only local/remote -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_COMMAND => 'command'; - push @EXPORT, qw(OPTION_COMMAND); -use constant OPTION_PROCESS => 'process'; - push @EXPORT, qw(OPTION_PROCESS); -use constant OPTION_HOST_ID => 'host-id'; - push @EXPORT, qw(OPTION_HOST_ID); - -# Command-line only test -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_TEST => 'test'; - push @EXPORT, qw(OPTION_TEST); -use constant OPTION_TEST_DELAY => 'test-delay'; - push @EXPORT, qw(OPTION_TEST_DELAY); -use constant OPTION_TEST_POINT => 'test-point'; - push @EXPORT, qw(OPTION_TEST_POINT); - -# GENERAL Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_ARCHIVE_TIMEOUT => 'archive-timeout'; - push @EXPORT, qw(OPTION_ARCHIVE_TIMEOUT); -use constant OPTION_BUFFER_SIZE => 'buffer-size'; - push @EXPORT, qw(OPTION_BUFFER_SIZE); -use constant OPTION_DB_TIMEOUT => 'db-timeout'; - push @EXPORT, qw(OPTION_DB_TIMEOUT); -use constant OPTION_COMPRESS => 'compress'; - push @EXPORT, qw(OPTION_COMPRESS); -use constant OPTION_COMPRESS_LEVEL => 'compress-level'; - push @EXPORT, qw(OPTION_COMPRESS_LEVEL); -use constant OPTION_COMPRESS_LEVEL_NETWORK => 'compress-level-network'; - push @EXPORT, qw(OPTION_COMPRESS_LEVEL_NETWORK); -use constant OPTION_NEUTRAL_UMASK => 'neutral-umask'; - push @EXPORT, qw(OPTION_NEUTRAL_UMASK); -use constant OPTION_PROTOCOL_TIMEOUT => 'protocol-timeout'; - push @EXPORT, qw(OPTION_PROTOCOL_TIMEOUT); -use constant OPTION_PROCESS_MAX => 'process-max'; - push @EXPORT, qw(OPTION_PROCESS_MAX); - -# Commands -use constant OPTION_CMD_SSH => 'cmd-ssh'; - push @EXPORT, qw(OPTION_CMD_SSH); - -# Paths -use constant OPTION_LOCK_PATH => 'lock-path'; - push @EXPORT, qw(OPTION_LOCK_PATH); -use constant OPTION_LOG_PATH => 'log-path'; - push @EXPORT, qw(OPTION_LOG_PATH); -use constant OPTION_SPOOL_PATH => 'spool-path'; - push @EXPORT, qw(OPTION_SPOOL_PATH); - -# Repository -use constant OPTION_REPO_PATH => 'repo-path'; - push @EXPORT, qw(OPTION_REPO_PATH); -use constant OPTION_REPO_TYPE => 'repo-type'; - push @EXPORT, qw(OPTION_REPO_TYPE); - -# Repository S3 -use constant OPTION_REPO_S3_KEY => 'repo-s3-key'; - push @EXPORT, qw(OPTION_REPO_S3_KEY); -use constant OPTION_REPO_S3_KEY_SECRET => 'repo-s3-key-secret'; - push @EXPORT, qw(OPTION_REPO_S3_KEY_SECRET); -use constant OPTION_REPO_S3_BUCKET => 'repo-s3-bucket'; - push @EXPORT, qw(OPTION_REPO_S3_BUCKET); -use constant OPTION_REPO_S3_CA_FILE => 'repo-s3-ca-file'; - push @EXPORT, qw(OPTION_REPO_S3_CA_FILE); -use constant OPTION_REPO_S3_CA_PATH => 'repo-s3-ca-path'; - push @EXPORT, qw(OPTION_REPO_S3_CA_PATH); -use constant OPTION_REPO_S3_ENDPOINT => 'repo-s3-endpoint'; - push @EXPORT, qw(OPTION_REPO_S3_ENDPOINT); -use constant OPTION_REPO_S3_HOST => 'repo-s3-host'; - push @EXPORT, qw(OPTION_REPO_S3_HOST); -use constant OPTION_REPO_S3_REGION => 'repo-s3-region'; - push @EXPORT, qw(OPTION_REPO_S3_REGION); -use constant OPTION_REPO_S3_VERIFY_SSL => 'repo-s3-verify-ssl'; - push @EXPORT, qw(OPTION_REPO_S3_VERIFY_SSL); - -# Log level -use constant OPTION_LOG_LEVEL_CONSOLE => 'log-level-console'; - push @EXPORT, qw(OPTION_LOG_LEVEL_CONSOLE); -use constant OPTION_LOG_LEVEL_FILE => 'log-level-file'; - push @EXPORT, qw(OPTION_LOG_LEVEL_FILE); -use constant OPTION_LOG_LEVEL_STDERR => 'log-level-stderr'; - push @EXPORT, qw(OPTION_LOG_LEVEL_STDERR); -use constant OPTION_LOG_TIMESTAMP => 'log-timestamp'; - push @EXPORT, qw(OPTION_LOG_TIMESTAMP); - -# ARCHIVE Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_ARCHIVE_ASYNC => 'archive-async'; - push @EXPORT, qw(OPTION_ARCHIVE_ASYNC); -# Deprecated and to be removed -use constant OPTION_ARCHIVE_MAX_MB => 'archive-max-mb'; - push @EXPORT, qw(OPTION_ARCHIVE_MAX_MB); -use constant OPTION_ARCHIVE_QUEUE_MAX => 'archive-queue-max'; - push @EXPORT, qw(OPTION_ARCHIVE_QUEUE_MAX); - -# BACKUP Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_BACKUP_ARCHIVE_CHECK => 'archive-check'; - push @EXPORT, qw(OPTION_BACKUP_ARCHIVE_CHECK); -use constant OPTION_BACKUP_ARCHIVE_COPY => 'archive-copy'; - push @EXPORT, qw(OPTION_BACKUP_ARCHIVE_COPY); -use constant OPTION_BACKUP_CMD => 'backup-cmd'; - push @EXPORT, qw(OPTION_BACKUP_CMD); -use constant OPTION_BACKUP_CONFIG => 'backup-config'; - push @EXPORT, qw(OPTION_BACKUP_CONFIG); -use constant OPTION_BACKUP_HOST => 'backup-host'; - push @EXPORT, qw(OPTION_BACKUP_HOST); -use constant OPTION_BACKUP_SSH_PORT => 'backup-ssh-port'; - push @EXPORT, qw(OPTION_BACKUP_SSH_PORT); -use constant OPTION_BACKUP_STANDBY => 'backup-standby'; - push @EXPORT, qw(OPTION_BACKUP_STANDBY); -use constant OPTION_BACKUP_USER => 'backup-user'; - push @EXPORT, qw(OPTION_BACKUP_USER); -use constant OPTION_CHECKSUM_PAGE => 'checksum-page'; - push @EXPORT, qw(OPTION_CHECKSUM_PAGE); -use constant OPTION_HARDLINK => 'hardlink'; - push @EXPORT, qw(OPTION_HARDLINK); -use constant OPTION_MANIFEST_SAVE_THRESHOLD => 'manifest-save-threshold'; - push @EXPORT, qw(OPTION_MANIFEST_SAVE_THRESHOLD); -use constant OPTION_RESUME => 'resume'; - push @EXPORT, qw(OPTION_RESUME); -use constant OPTION_START_FAST => 'start-fast'; - push @EXPORT, qw(OPTION_START_FAST); -use constant OPTION_STOP_AUTO => 'stop-auto'; - push @EXPORT, qw(OPTION_STOP_AUTO); - -# EXPIRE Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_RETENTION_ARCHIVE => 'retention-archive'; - push @EXPORT, qw(OPTION_RETENTION_ARCHIVE); -use constant OPTION_RETENTION_ARCHIVE_TYPE => 'retention-archive-type'; - push @EXPORT, qw(OPTION_RETENTION_ARCHIVE_TYPE); -use constant OPTION_RETENTION_DIFF => 'retention-' . BACKUP_TYPE_DIFF; - push @EXPORT, qw(OPTION_RETENTION_DIFF); -use constant OPTION_RETENTION_FULL => 'retention-' . BACKUP_TYPE_FULL; - push @EXPORT, qw(OPTION_RETENTION_FULL); - -# RESTORE Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DB_INCLUDE => 'db-include'; - push @EXPORT, qw(OPTION_DB_INCLUDE); -use constant OPTION_LINK_ALL => 'link-all'; - push @EXPORT, qw(OPTION_LINK_ALL); -use constant OPTION_LINK_MAP => 'link-map'; - push @EXPORT, qw(OPTION_LINK_MAP); -use constant OPTION_TABLESPACE_MAP_ALL => 'tablespace-map-all'; - push @EXPORT, qw(OPTION_TABLESPACE_MAP_ALL); -use constant OPTION_TABLESPACE_MAP => 'tablespace-map'; - push @EXPORT, qw(OPTION_TABLESPACE_MAP); -use constant OPTION_RESTORE_RECOVERY_OPTION => 'recovery-option'; - push @EXPORT, qw(OPTION_RESTORE_RECOVERY_OPTION); - -# STANZA Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_PREFIX_DB => 'db'; - push @EXPORT, qw(OPTION_PREFIX_DB); - -use constant OPTION_DB_CMD => OPTION_PREFIX_DB . '-cmd'; - push @EXPORT, qw(OPTION_DB_CMD); -use constant OPTION_DB_CONFIG => OPTION_PREFIX_DB . '-config'; - push @EXPORT, qw(OPTION_DB_CONFIG); -use constant OPTION_DB_HOST => OPTION_PREFIX_DB . '-host'; - push @EXPORT, qw(OPTION_DB_HOST); -use constant OPTION_DB_PATH => OPTION_PREFIX_DB . '-path'; - push @EXPORT, qw(OPTION_DB_PATH); -use constant OPTION_DB_PORT => OPTION_PREFIX_DB . '-port'; - push @EXPORT, qw(OPTION_DB_PORT); -use constant OPTION_DB_SSH_PORT => OPTION_PREFIX_DB . '-ssh-port'; - push @EXPORT, qw(OPTION_DB_SSH_PORT); -use constant OPTION_DB_SOCKET_PATH => OPTION_PREFIX_DB . '-socket-path'; - push @EXPORT, qw(OPTION_DB_SOCKET_PATH); -use constant OPTION_DB_USER => OPTION_PREFIX_DB . '-user'; - push @EXPORT, qw(OPTION_DB_USER); - - -#################################################################################################################################### -# Option Defaults -#################################################################################################################################### - -# Command-line only -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DEFAULT_BACKUP_TYPE => BACKUP_TYPE_INCR; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_TYPE); -use constant OPTION_DEFAULT_INFO_OUTPUT => INFO_OUTPUT_TEXT; - push @EXPORT, qw(OPTION_DEFAULT_INFO_OUTPUT); -use constant OPTION_DEFAULT_RESTORE_DELTA => false; - push @EXPORT, qw(OPTION_DEFAULT_RESTORE_DELTA); -use constant OPTION_DEFAULT_RESTORE_FORCE => false; - push @EXPORT, qw(OPTION_DEFAULT_RESTORE_FORCE); -use constant OPTION_DEFAULT_RESTORE_SET => 'latest'; - push @EXPORT, qw(OPTION_DEFAULT_RESTORE_SET); -use constant OPTION_DEFAULT_RESTORE_TARGET_EXCLUSIVE => false; - push @EXPORT, qw(OPTION_DEFAULT_RESTORE_TARGET_EXCLUSIVE); -use constant OPTION_DEFAULT_RESTORE_TARGET_ACTION => RECOVERY_ACTION_PAUSE; - push @EXPORT, qw(OPTION_DEFAULT_RESTORE_TARGET_ACTION); -use constant OPTION_DEFAULT_RESTORE_TYPE => RECOVERY_TYPE_DEFAULT; - push @EXPORT, qw(OPTION_DEFAULT_RESTORE_TYPE); -use constant OPTION_DEFAULT_STANZA_CREATE_FORCE => false; - push @EXPORT, qw(OPTION_DEFAULT_STANZA_CREATE_FORCE); - -# Command-line only test -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DEFAULT_TEST => false; - push @EXPORT, qw(OPTION_DEFAULT_TEST); -use constant OPTION_DEFAULT_TEST_DELAY => 5; - push @EXPORT, qw(OPTION_DEFAULT_TEST_DELAY); - -# GENERAL Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DEFAULT_ARCHIVE_TIMEOUT => 60; - push @EXPORT, qw(OPTION_DEFAULT_ARCHIVE_TIMEOUT); -use constant OPTION_DEFAULT_ARCHIVE_TIMEOUT_MIN => WAIT_TIME_MINIMUM; - push @EXPORT, qw(OPTION_DEFAULT_ARCHIVE_TIMEOUT_MIN); -use constant OPTION_DEFAULT_ARCHIVE_TIMEOUT_MAX => 86400; - push @EXPORT, qw(OPTION_DEFAULT_ARCHIVE_TIMEOUT_MAX); - -use constant OPTION_DEFAULT_BUFFER_SIZE => COMMON_IO_BUFFER_MAX; - push @EXPORT, qw(OPTION_DEFAULT_BUFFER_SIZE); -use constant OPTION_DEFAULT_BUFFER_SIZE_MIN => 16384; - push @EXPORT, qw(OPTION_DEFAULT_BUFFER_SIZE_MIN); - -use constant OPTION_DEFAULT_COMPRESS => true; - push @EXPORT, qw(OPTION_DEFAULT_COMPRESS); - -use constant OPTION_DEFAULT_COMPRESS_LEVEL => 6; - push @EXPORT, qw(OPTION_DEFAULT_COMPRESS_LEVEL); -use constant OPTION_DEFAULT_COMPRESS_LEVEL_MIN => 0; - push @EXPORT, qw(OPTION_DEFAULT_COMPRESS_LEVEL_MIN); -use constant OPTION_DEFAULT_COMPRESS_LEVEL_MAX => 9; - push @EXPORT, qw(OPTION_DEFAULT_COMPRESS_LEVEL_MAX); - -use constant OPTION_DEFAULT_COMPRESS_LEVEL_NETWORK => 3; - push @EXPORT, qw(OPTION_DEFAULT_COMPRESS_LEVEL_NETWORK); -use constant OPTION_DEFAULT_COMPRESS_LEVEL_NETWORK_MIN => 0; - push @EXPORT, qw(OPTION_DEFAULT_COMPRESS_LEVEL_NETWORK_MIN); -use constant OPTION_DEFAULT_COMPRESS_LEVEL_NETWORK_MAX => 9; - push @EXPORT, qw(OPTION_DEFAULT_COMPRESS_LEVEL_NETWORK_MAX); - -use constant OPTION_DEFAULT_DB_TIMEOUT => 1800; - push @EXPORT, qw(OPTION_DEFAULT_DB_TIMEOUT); -use constant OPTION_DEFAULT_DB_TIMEOUT_MIN => WAIT_TIME_MINIMUM; - push @EXPORT, qw(OPTION_DEFAULT_DB_TIMEOUT_MIN); -use constant OPTION_DEFAULT_DB_TIMEOUT_MAX => 86400 * 7; - push @EXPORT, qw(OPTION_DEFAULT_DB_TIMEOUT_MAX); - -use constant OPTION_DEFAULT_REPO_SYNC => true; - -use constant OPTION_DEFAULT_PROTOCOL_TIMEOUT => OPTION_DEFAULT_DB_TIMEOUT + 30; - push @EXPORT, qw(OPTION_DEFAULT_PROTOCOL_TIMEOUT); -use constant OPTION_DEFAULT_PROTOCOL_TIMEOUT_MIN => OPTION_DEFAULT_DB_TIMEOUT_MIN; - push @EXPORT, qw(OPTION_DEFAULT_PROTOCOL_TIMEOUT_MIN); -use constant OPTION_DEFAULT_PROTOCOL_TIMEOUT_MAX => OPTION_DEFAULT_DB_TIMEOUT_MAX; - push @EXPORT, qw(OPTION_DEFAULT_PROTOCOL_TIMEOUT_MAX); - -use constant OPTION_DEFAULT_CMD_SSH => 'ssh'; - push @EXPORT, qw(OPTION_DEFAULT_CMD_SSH); -use constant OPTION_DEFAULT_CONFIG => '/etc/' . BACKREST_CONF; - push @EXPORT, qw(OPTION_DEFAULT_CONFIG); -use constant OPTION_DEFAULT_LOCK_PATH => '/tmp/' . BACKREST_EXE; - push @EXPORT, qw(OPTION_DEFAULT_LOCK_PATH); -use constant OPTION_DEFAULT_LOG_PATH => '/var/log/' . BACKREST_EXE; - push @EXPORT, qw(OPTION_DEFAULT_LOG_PATH); -use constant OPTION_DEFAULT_NEUTRAL_UMASK => true; - push @EXPORT, qw(OPTION_DEFAULT_NEUTRAL_UMASK); -use constant OPTION_DEFAULT_REPO_LINK => true; - push @EXPORT, qw(OPTION_DEFAULT_REPO_LINK); -use constant OPTION_DEFAULT_REPO_PATH => '/var/lib/' . BACKREST_EXE; - push @EXPORT, qw(OPTION_DEFAULT_REPO_PATH); -use constant OPTION_DEFAULT_REPO_S3_VERIFY_SSL => true; - push @EXPORT, qw(OPTION_DEFAULT_REPO_S3_VERIFY_SSL); -use constant OPTION_DEFAULT_REPO_TYPE => REPO_TYPE_POSIX; - push @EXPORT, qw(OPTION_DEFAULT_REPO_TYPE); -use constant OPTION_DEFAULT_SPOOL_PATH => '/var/spool/' . BACKREST_EXE; - push @EXPORT, qw(OPTION_DEFAULT_SPOOL_PATH); -use constant OPTION_DEFAULT_PROCESS_MAX => 1; - push @EXPORT, qw(OPTION_DEFAULT_PROCESS_MAX); -use constant OPTION_DEFAULT_PROCESS_MAX_MIN => 1; - push @EXPORT, qw(OPTION_DEFAULT_PROCESS_MAX_MIN); -use constant OPTION_DEFAULT_PROCESS_MAX_MAX => 96; - push @EXPORT, qw(OPTION_DEFAULT_PROCESS_MAX_MAX); - -# LOG Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DEFAULT_LOG_LEVEL_CONSOLE => lc(WARN); - push @EXPORT, qw(OPTION_DEFAULT_LOG_LEVEL_CONSOLE); -use constant OPTION_DEFAULT_LOG_LEVEL_FILE => lc(INFO); - push @EXPORT, qw(OPTION_DEFAULT_LOG_LEVEL_FILE); -use constant OPTION_DEFAULT_LOG_LEVEL_STDERR => lc(WARN); - push @EXPORT, qw(OPTION_DEFAULT_LOG_LEVEL_STDERR); -use constant OPTION_DEFAULT_LOG_TIMESTAMP => true; - push @EXPORT, qw(OPTION_DEFAULT_LOG_TIMESTAMP); - -# ARCHIVE SECTION -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DEFAULT_ARCHIVE_ASYNC => false; - push @EXPORT, qw(OPTION_DEFAULT_ARCHIVE_ASYNC); - -# BACKUP Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DEFAULT_BACKUP_ARCHIVE_CHECK => true; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_ARCHIVE_CHECK); -use constant OPTION_DEFAULT_BACKUP_ARCHIVE_COPY => false; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_ARCHIVE_COPY); -use constant OPTION_DEFAULT_BACKUP_FORCE => false; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_FORCE); -use constant OPTION_DEFAULT_BACKUP_HARDLINK => false; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_HARDLINK); -use constant OPTION_DEFAULT_BACKUP_ONLINE => true; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_ONLINE); -use constant OPTION_DEFAULT_BACKUP_MANIFEST_SAVE_THRESHOLD => 1073741824; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_MANIFEST_SAVE_THRESHOLD); -use constant OPTION_DEFAULT_BACKUP_RESUME => true; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_RESUME); -use constant OPTION_DEFAULT_BACKUP_STANDBY => false; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_STANDBY); -use constant OPTION_DEFAULT_BACKUP_STOP_AUTO => false; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_STOP_AUTO); -use constant OPTION_DEFAULT_BACKUP_START_FAST => false; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_START_FAST); -use constant OPTION_DEFAULT_BACKUP_USER => 'backrest'; - push @EXPORT, qw(OPTION_DEFAULT_BACKUP_USER); - -# START/STOP Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DEFAULT_STOP_FORCE => false; - push @EXPORT, qw(OPTION_DEFAULT_STOP_FORCE); - -# EXPIRE Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DEFAULT_RETENTION_ARCHIVE_TYPE => BACKUP_TYPE_FULL; - push @EXPORT, qw(OPTION_DEFAULT_RETENTION_ARCHIVE_TYPE); -use constant OPTION_DEFAULT_RETENTION_MIN => 1; - push @EXPORT, qw(OPTION_DEFAULT_RETENTION_MIN); -use constant OPTION_DEFAULT_RETENTION_MAX => 999999999; - push @EXPORT, qw(OPTION_DEFAULT_RETENTION_MAX); - -# RESTORE Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DEFAULT_LINK_ALL => false; - push @EXPORT, qw(OPTION_DEFAULT_LINK_ALL); - -# STANZA Section -#----------------------------------------------------------------------------------------------------------------------------------- -use constant OPTION_DEFAULT_DB_PORT => 5432; - push @EXPORT, qw(OPTION_DEFAULT_DB_PORT); -use constant OPTION_DEFAULT_DB_USER => 'postgres'; - push @EXPORT, qw(OPTION_DEFAULT_DB_USER); - -#################################################################################################################################### -# Option Rule Hash -# -# Contains the rules for options: which commands the option can/cannot be specified, for which commands it is required, default -# settings, types, ranges, whether the option is negatable, whether it has dependencies, etc. The initial section is the global -# section meaning the rules defined there apply to all commands listed for the option. -# -# OPTION_RULE_COMMAND: List of commands the option can or cannot be specified. -# true - the option is valid and can be specified -# &OPTION_RULE_COMMAND => -# { -# &CMD_CHECK => true, -# false - used in conjuntion with OPTION_RULE_DEFAULT so the user cannot override this option. If the option is provided for the -# command by the user, it will be ignored and the default will be used. -# NOTE: If the option (A) has a dependency on another option (B) then the CMD_ must also be specified in the other option (B), -# else it will still error on the option (A). -# -# OPTION_RULE_REQUIRED: -# In global section: -# true - if the option does not have a default, then setting OPTION_RULE_REQUIRED in the global section means all commands -# listed in OPTION_RULE_COMMAND require the user to set it. -# false - no commands listed require it as an option but it can be set. This can be overridden for individual commands by -# setting OPTION_RULE_REQUIRED in the OPTION_RULE_COMMAND section. -# In OPTION_RULE_COMMAND section: -# true - the option must be set somehow for the command, either by default (OPTION_RULE_DEFAULT) or by the user. -# &CMD_CHECK => -# { -# &OPTION_RULE_REQUIRED => true -# }, -# false - mainly used for overriding the OPTION_RULE_REQUIRED in the global section. -# -# OPTION_RULE_DEFAULT: -# Sets a default for the option for all commands if listed in the global section, or for specific commands if listed in the -# OPTION_RULE_COMMAND section. -# -# OPTION_RULE_NEGATE: -# The option can be negated with "no" e.g. --no-compress. -# -# OPTION_RULE_DEPEND: -# Specify the dependencies this option has on another option. All commands listed for this option must also be listed in the -# dependent option(s). -# OPTION_RULE_DEPEND_LIST further defines the allowable settings for the depended option. -# -# OPTION_RULE_ALLOW_LIST: -# Lists the allowable settings for the option. -#################################################################################################################################### -my %oOptionRule = -( - # Command-line only - #------------------------------------------------------------------------------------------------------------------------------- - &OPTION_CONFIG => - { - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_CONFIG, - &OPTION_RULE_NEGATE => true, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true - } - }, - - &OPTION_DELTA => - { - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_RESTORE_DELTA, - } - } - }, - - &OPTION_FORCE => - { - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_FORCE, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_ONLINE, - &OPTION_RULE_DEPEND_VALUE => false - } - }, - - &CMD_RESTORE => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_RESTORE_FORCE, - }, - - &CMD_STANZA_CREATE => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_STANZA_CREATE_FORCE, - }, - - &CMD_STOP => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_STOP_FORCE - } - } - }, - - &OPTION_ONLINE => - { - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_NEGATE => true, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_ONLINE, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - } - }, - - &OPTION_SET => - { - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_RESTORE_SET, - } - } - }, - - &OPTION_STANZA => - { - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => - { - &OPTION_RULE_REQUIRED => true - }, - &CMD_ARCHIVE_PUSH => - { - &OPTION_RULE_REQUIRED => true - }, - &CMD_BACKUP => - { - &OPTION_RULE_REQUIRED => true - }, - &CMD_CHECK => - { - &OPTION_RULE_REQUIRED => true - }, - &CMD_EXPIRE => - { - &OPTION_RULE_REQUIRED => true - }, - &CMD_INFO => - { - &OPTION_RULE_REQUIRED => false - }, - &CMD_LOCAL => - { - &OPTION_RULE_REQUIRED => true - }, - &CMD_REMOTE => - { - &OPTION_RULE_REQUIRED => false - }, - &CMD_RESTORE => - { - &OPTION_RULE_REQUIRED => true - }, - &CMD_STANZA_CREATE => - { - &OPTION_RULE_REQUIRED => true - }, - &CMD_STANZA_UPGRADE => - { - &OPTION_RULE_REQUIRED => true - }, - &CMD_START => - { - &OPTION_RULE_REQUIRED => false - }, - &CMD_STOP => - { - &OPTION_RULE_REQUIRED => false - } - } - }, - - &OPTION_TARGET => - { - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => - { - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_TYPE, - &OPTION_RULE_DEPEND_LIST => - { - &RECOVERY_TYPE_NAME => true, - &RECOVERY_TYPE_TIME => true, - &RECOVERY_TYPE_XID => true - } - } - } - } - }, - - &OPTION_TARGET_EXCLUSIVE => - { - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_RESTORE_TARGET_EXCLUSIVE, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_TYPE, - &OPTION_RULE_DEPEND_LIST => - { - &RECOVERY_TYPE_TIME => true, - &RECOVERY_TYPE_XID => true - } - } - } - } - }, - - &OPTION_TARGET_ACTION => - { - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_RESTORE_TARGET_ACTION, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_TYPE, - &OPTION_RULE_DEPEND_LIST => - { - &RECOVERY_TYPE_NAME => true, - &RECOVERY_TYPE_TIME => true, - &RECOVERY_TYPE_XID => true - } - } - } - } - }, - - &OPTION_TARGET_TIMELINE => - { - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => - { - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_TYPE, - &OPTION_RULE_DEPEND_LIST => - { - &RECOVERY_TYPE_DEFAULT => true, - &RECOVERY_TYPE_NAME => true, - &RECOVERY_TYPE_TIME => true, - &RECOVERY_TYPE_XID => true - } - } - } - } - }, - - &OPTION_TYPE => - { - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_TYPE, - &OPTION_RULE_ALLOW_LIST => - { - &BACKUP_TYPE_FULL => true, - &BACKUP_TYPE_DIFF => true, - &BACKUP_TYPE_INCR => true, - } - }, - - &CMD_LOCAL => - { - &OPTION_RULE_ALLOW_LIST => - { - &DB => true, - &BACKUP => true, - }, - }, - - &CMD_REMOTE => - { - &OPTION_RULE_ALLOW_LIST => - { - &DB => true, - &BACKUP => true, - }, - }, - - &CMD_RESTORE => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_RESTORE_TYPE, - &OPTION_RULE_ALLOW_LIST => - { - &RECOVERY_TYPE_NAME => true, - &RECOVERY_TYPE_TIME => true, - &RECOVERY_TYPE_XID => true, - &RECOVERY_TYPE_PRESERVE => true, - &RECOVERY_TYPE_NONE => true, - &RECOVERY_TYPE_IMMEDIATE => true, - &RECOVERY_TYPE_DEFAULT => true - } - } - } - }, - - &OPTION_OUTPUT => - { - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_COMMAND => - { - &CMD_INFO => - { - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_INFO_OUTPUT, - &OPTION_RULE_ALLOW_LIST => - { - &INFO_OUTPUT_TEXT => true, - &INFO_OUTPUT_JSON => true - } - } - } - }, - - # Command-line only local/remote - #------------------------------------------------------------------------------------------------------------------------------- - &OPTION_COMMAND => - { - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_COMMAND => - { - &CMD_LOCAL => true, - &CMD_REMOTE => true, - } - }, - - &OPTION_HOST_ID => - { - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_COMMAND => - { - &CMD_LOCAL => true, - }, - }, - - &OPTION_PROCESS => - { - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_COMMAND => - { - &CMD_LOCAL => - { - &OPTION_RULE_REQUIRED => true, - }, - &CMD_REMOTE => - { - &OPTION_RULE_REQUIRED => false, - }, - }, - }, - - # Command-line only test - #------------------------------------------------------------------------------------------------------------------------------- - &OPTION_TEST => - { - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_TEST, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true - } - }, - - &OPTION_TEST_DELAY => - { - &OPTION_RULE_TYPE => OPTION_TYPE_FLOAT, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_TEST_DELAY, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_TEST, - &OPTION_RULE_DEPEND_VALUE => true - }, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true - } - }, - - &OPTION_TEST_POINT => - { - &OPTION_RULE_TYPE => OPTION_TYPE_HASH, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_TEST, - &OPTION_RULE_DEPEND_VALUE => true - }, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true - } - }, - - # GENERAL Section - #------------------------------------------------------------------------------------------------------------------------------- - &OPTION_ARCHIVE_TIMEOUT => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_FLOAT, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_ARCHIVE_TIMEOUT, - &OPTION_RULE_ALLOW_RANGE => [OPTION_DEFAULT_ARCHIVE_TIMEOUT_MIN, OPTION_DEFAULT_ARCHIVE_TIMEOUT_MAX], - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - }, - }, - - &OPTION_BUFFER_SIZE => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BUFFER_SIZE, - &OPTION_RULE_ALLOW_LIST => - { - &OPTION_DEFAULT_BUFFER_SIZE_MIN => true, - &OPTION_DEFAULT_BUFFER_SIZE_MIN * 2 => true, - &OPTION_DEFAULT_BUFFER_SIZE_MIN * 4 => true, - &OPTION_DEFAULT_BUFFER_SIZE_MIN * 8 => true, - &OPTION_DEFAULT_BUFFER_SIZE_MIN * 16 => true, - &OPTION_DEFAULT_BUFFER_SIZE_MIN * 32 => true, - &OPTION_DEFAULT_BUFFER_SIZE_MIN * 64 => true, - &OPTION_DEFAULT_BUFFER_SIZE_MIN * 128 => true, - &OPTION_DEFAULT_BUFFER_SIZE_MIN * 256 => true, - &OPTION_DEFAULT_BUFFER_SIZE_MIN * 512 => true, - &OPTION_DEFAULT_BUFFER_SIZE_MIN * 1024 => true, - }, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => false, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - } - }, - - &OPTION_DB_TIMEOUT => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_FLOAT, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_DB_TIMEOUT, - &OPTION_RULE_ALLOW_RANGE => [OPTION_DEFAULT_DB_TIMEOUT_MIN, OPTION_DEFAULT_DB_TIMEOUT_MAX], - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => false, - &CMD_ARCHIVE_PUSH => false, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => false, - &CMD_INFO => false, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => false, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - } - }, - - &OPTION_COMPRESS => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_COMPRESS, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_EXPIRE => false, - &CMD_RESTORE => true, - } - }, - - &OPTION_COMPRESS_LEVEL => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_COMPRESS_LEVEL, - &OPTION_RULE_ALLOW_RANGE => [OPTION_DEFAULT_COMPRESS_LEVEL_MIN, OPTION_DEFAULT_COMPRESS_LEVEL_MAX], - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => false, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - } - }, - - &OPTION_COMPRESS_LEVEL_NETWORK => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_COMPRESS_LEVEL_NETWORK, - &OPTION_RULE_ALLOW_RANGE => [OPTION_DEFAULT_COMPRESS_LEVEL_NETWORK_MIN, OPTION_DEFAULT_COMPRESS_LEVEL_NETWORK_MAX], - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => false, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - } - }, - - &OPTION_NEUTRAL_UMASK => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_NEUTRAL_UMASK, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_INFO => false, - &CMD_EXPIRE => false, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => false, - &CMD_STOP => false - } - }, - - &OPTION_CMD_SSH => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_CMD_SSH, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - &CMD_EXPIRE => true, - }, - }, - - &OPTION_LOCK_PATH => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_LOCK_PATH, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_EXPIRE => true, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - }, - }, - - &OPTION_LOG_PATH => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_LOG_PATH, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - }, - }, - - &OPTION_PROTOCOL_TIMEOUT => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_FLOAT, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_PROTOCOL_TIMEOUT, - &OPTION_RULE_ALLOW_RANGE => [OPTION_DEFAULT_PROTOCOL_TIMEOUT_MIN, OPTION_DEFAULT_PROTOCOL_TIMEOUT_MAX], - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => false, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - } - }, - - &OPTION_REPO_PATH => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_REPO_PATH, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - }, - }, - - &OPTION_REPO_S3_BUCKET => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_REPO_TYPE, - &OPTION_RULE_DEPEND_VALUE => REPO_TYPE_S3, - }, - &OPTION_RULE_COMMAND => OPTION_REPO_TYPE, - }, - - &OPTION_REPO_S3_CA_FILE => &OPTION_REPO_S3_HOST, - &OPTION_REPO_S3_CA_PATH => &OPTION_REPO_S3_HOST, - - &OPTION_REPO_S3_KEY => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_SECURE => true, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_REPO_TYPE, - &OPTION_RULE_DEPEND_VALUE => REPO_TYPE_S3, - }, - &OPTION_RULE_COMMAND => OPTION_REPO_TYPE, - }, - - &OPTION_REPO_S3_KEY_SECRET => OPTION_REPO_S3_KEY, - - &OPTION_REPO_S3_ENDPOINT => OPTION_REPO_S3_BUCKET, - - &OPTION_REPO_S3_HOST => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_DEPEND => OPTION_REPO_S3_BUCKET, - &OPTION_RULE_COMMAND => OPTION_REPO_TYPE, - }, - - &OPTION_REPO_S3_REGION => OPTION_REPO_S3_BUCKET, - - &OPTION_REPO_S3_VERIFY_SSL => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_REPO_S3_VERIFY_SSL, - &OPTION_RULE_COMMAND => OPTION_REPO_TYPE, - &OPTION_RULE_DEPEND => OPTION_REPO_S3_BUCKET, - }, - - &OPTION_REPO_TYPE => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_REPO_TYPE, - &OPTION_RULE_ALLOW_LIST => - { - &REPO_TYPE_CIFS => true, - &REPO_TYPE_POSIX => true, - &REPO_TYPE_S3 => true, - }, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - }, - }, - - &OPTION_SPOOL_PATH => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_SPOOL_PATH, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_PUSH => true - }, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_ARCHIVE_ASYNC, - &OPTION_RULE_DEPEND_VALUE => true - }, - }, - - &OPTION_PROCESS_MAX => - { - &OPTION_RULE_ALT_NAME => 'thread-max', - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_PROCESS_MAX, - &OPTION_RULE_ALLOW_RANGE => [OPTION_DEFAULT_PROCESS_MAX_MIN, OPTION_DEFAULT_PROCESS_MAX_MAX], - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_RESTORE => true - } - }, - - # LOG Section - #------------------------------------------------------------------------------------------------------------------------------- - &OPTION_LOG_LEVEL_CONSOLE => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_LOG_LEVEL_CONSOLE, - &OPTION_RULE_ALLOW_LIST => - { - lc(OFF) => true, - lc(ERROR) => true, - lc(WARN) => true, - lc(INFO) => true, - lc(DETAIL) => true, - lc(DEBUG) => true, - lc(TRACE) => true - }, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_INFO => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true - } - }, - - &OPTION_LOG_LEVEL_FILE => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_LOG_LEVEL_FILE, - &OPTION_RULE_ALLOW_LIST => - { - lc(OFF) => true, - lc(ERROR) => true, - lc(WARN) => true, - lc(INFO) => true, - lc(DEBUG) => true, - lc(DETAIL) => true, - lc(TRACE) => true - }, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_INFO => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true - } - }, - - &OPTION_LOG_LEVEL_STDERR => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_LOG_LEVEL_STDERR, - &OPTION_RULE_ALLOW_LIST => - { - lc(OFF) => true, - lc(ERROR) => true, - lc(WARN) => true, - lc(INFO) => true, - lc(DETAIL) => true, - lc(DEBUG) => true, - lc(TRACE) => true - }, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_INFO => true, - &CMD_RESTORE => true, - &CMD_START => true, - &CMD_STOP => true - } - }, - - &OPTION_LOG_TIMESTAMP => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_LOG_TIMESTAMP, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_INFO => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_START => true, - &CMD_STOP => true - } - }, - - # ARCHIVE Section - #------------------------------------------------------------------------------------------------------------------------------- - &OPTION_ARCHIVE_ASYNC => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_ARCHIVE_ASYNC, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_PUSH => true - } - }, - - # Deprecated and to be removed - &OPTION_ARCHIVE_MAX_MB => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_PUSH => true - } - }, - - &OPTION_ARCHIVE_QUEUE_MAX => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_PUSH => true, - }, - }, - - # BACKUP Section - #------------------------------------------------------------------------------------------------------------------------------- - &OPTION_BACKUP_ARCHIVE_CHECK => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_ARCHIVE_CHECK, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_ONLINE, - &OPTION_RULE_DEPEND_VALUE => true, - }, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_CHECK => true, - }, - }, - - &OPTION_BACKUP_ARCHIVE_COPY => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_ARCHIVE_COPY, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => - { - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_BACKUP_ARCHIVE_CHECK, - &OPTION_RULE_DEPEND_VALUE => true - } - } - } - }, - - &OPTION_BACKUP_CMD => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => BACKREST_BIN, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_CHECK => true, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - }, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_BACKUP_HOST - }, - }, - - &OPTION_BACKUP_CONFIG => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_CONFIG, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_CHECK => true, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - }, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_BACKUP_HOST - }, - }, - - &OPTION_BACKUP_HOST => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_CHECK => true, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - }, - }, - - &OPTION_BACKUP_SSH_PORT => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => OPTION_BACKUP_HOST, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_BACKUP_HOST - } - }, - - &OPTION_BACKUP_STANDBY => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_STANDBY, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - }, - }, - - &OPTION_BACKUP_USER => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_USER, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => true, - &CMD_ARCHIVE_PUSH => true, - &CMD_CHECK => true, - &CMD_INFO => true, - &CMD_LOCAL => true, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_START => true, - &CMD_STOP => true, - }, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_BACKUP_HOST - } - }, - - &OPTION_CHECKSUM_PAGE => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true - } - }, - - &OPTION_HARDLINK => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_HARDLINK, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true - } - }, - - &OPTION_MANIFEST_SAVE_THRESHOLD => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_MANIFEST_SAVE_THRESHOLD, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true - } - }, - - &OPTION_RESUME => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_RESUME, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true - } - }, - - &OPTION_START_FAST => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_START_FAST, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true - } - }, - - &OPTION_STOP_AUTO => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_BACKUP_STOP_AUTO, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true - } - }, - - # EXPIRE Section - #------------------------------------------------------------------------------------------------------------------------------- - &OPTION_RETENTION_ARCHIVE => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_ALLOW_RANGE => [OPTION_DEFAULT_RETENTION_MIN, OPTION_DEFAULT_RETENTION_MAX], - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_EXPIRE => true - } - }, - - &OPTION_RETENTION_ARCHIVE_TYPE => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_RETENTION_ARCHIVE_TYPE, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_EXPIRE => true - }, - &OPTION_RULE_ALLOW_LIST => - { - &BACKUP_TYPE_FULL => 1, - &BACKUP_TYPE_DIFF => 1, - &BACKUP_TYPE_INCR => 1 - } - }, - - &OPTION_RETENTION_DIFF => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_ALLOW_RANGE => [OPTION_DEFAULT_RETENTION_MIN, OPTION_DEFAULT_RETENTION_MAX], - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_EXPIRE => true - } - }, - - &OPTION_RETENTION_FULL => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_ALLOW_RANGE => [OPTION_DEFAULT_RETENTION_MIN, OPTION_DEFAULT_RETENTION_MAX], - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_EXPIRE => true - } - }, - - # RESTORE Section - #------------------------------------------------------------------------------------------------------------------------------- - &OPTION_DB_INCLUDE => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_HASH, - &OPTION_RULE_HASH_VALUE => false, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => true - }, - }, - - &OPTION_LINK_ALL => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_BOOLEAN, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_LINK_ALL, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => true - } - }, - - &OPTION_LINK_MAP => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_HASH, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => true - }, - }, - - &OPTION_TABLESPACE_MAP_ALL => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => true - } - }, - - &OPTION_TABLESPACE_MAP => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_HASH, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => true - }, - }, - - &OPTION_RESTORE_RECOVERY_OPTION => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_HASH, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_RESTORE => true - }, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_TYPE, - &OPTION_RULE_DEPEND_LIST => - { - &RECOVERY_TYPE_DEFAULT => true, - &RECOVERY_TYPE_NAME => true, - &RECOVERY_TYPE_TIME => true, - &RECOVERY_TYPE_XID => true - } - } - }, - - # STANZA Section - #------------------------------------------------------------------------------------------------------------------------------- - &OPTION_DB_CMD => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_PREFIX => OPTION_PREFIX_DB, - &OPTION_RULE_DEFAULT => BACKREST_BIN, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_LOCAL => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - }, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_DB_HOST - }, - }, - - &OPTION_DB_CONFIG => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_GLOBAL, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_PREFIX => OPTION_PREFIX_DB, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_CONFIG, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_LOCAL => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - }, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_DB_HOST - }, - }, - - &OPTION_DB_HOST => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_STANZA, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_PREFIX => OPTION_PREFIX_DB, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_PUSH => true, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_EXPIRE => true, - &CMD_LOCAL => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - &CMD_START => true, - &CMD_STOP => true, - } - }, - - &OPTION_DB_PATH => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_STANZA, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_PREFIX => OPTION_PREFIX_DB, - &OPTION_RULE_REQUIRED => true, - &OPTION_RULE_HINT => "does this stanza exist?", - &OPTION_RULE_COMMAND => - { - &CMD_ARCHIVE_GET => - { - &OPTION_RULE_REQUIRED => false - }, - &CMD_ARCHIVE_PUSH => - { - &OPTION_RULE_REQUIRED => false - }, - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_LOCAL => - { - &OPTION_RULE_REQUIRED => false - }, - &CMD_REMOTE => - { - &OPTION_RULE_REQUIRED => false - }, - &CMD_RESTORE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - }, - }, - - &OPTION_DB_PORT => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_STANZA, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_PREFIX => OPTION_PREFIX_DB, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_DB_PORT, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_REMOTE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - } - }, - - &OPTION_DB_SOCKET_PATH => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_STANZA, - &OPTION_RULE_PREFIX => OPTION_PREFIX_DB, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_LOCAL => true, - &CMD_REMOTE => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - } - }, - - &OPTION_DB_SSH_PORT => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_STANZA, - &OPTION_RULE_PREFIX => OPTION_PREFIX_DB, - &OPTION_RULE_TYPE => OPTION_TYPE_INTEGER, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_COMMAND => OPTION_DB_HOST, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_DB_HOST - }, - }, - - &OPTION_DB_USER => - { - &OPTION_RULE_SECTION => CONFIG_SECTION_STANZA, - &OPTION_RULE_PREFIX => OPTION_PREFIX_DB, - &OPTION_RULE_TYPE => OPTION_TYPE_STRING, - &OPTION_RULE_DEFAULT => OPTION_DEFAULT_DB_USER, - &OPTION_RULE_COMMAND => - { - &CMD_BACKUP => true, - &CMD_CHECK => true, - &CMD_LOCAL => true, - &CMD_STANZA_CREATE => true, - &CMD_STANZA_UPGRADE => true, - }, - &OPTION_RULE_REQUIRED => false, - &OPTION_RULE_DEPEND => - { - &OPTION_RULE_DEPEND_OPTION => OPTION_DB_HOST - }, - }, -); - -#################################################################################################################################### -# Process rule defaults -#################################################################################################################################### -foreach my $strKey (sort(keys(%oOptionRule))) -{ - # If the rule is a scalar then copy the entire rule from the referenced option - if (!ref($oOptionRule{$strKey})) - { - $oOptionRule{$strKey} = dclone($oOptionRule{$oOptionRule{$strKey}}); - } - - # Default type is string - if (!defined($oOptionRule{$strKey}{&OPTION_RULE_TYPE})) - { - $oOptionRule{$strKey}{&OPTION_RULE_TYPE} = OPTION_TYPE_STRING; - } - - # If the command section is a scalar then copy the section from the referenced option - if (defined($oOptionRule{$strKey}{&OPTION_RULE_COMMAND}) && !ref($oOptionRule{$strKey}{&OPTION_RULE_COMMAND})) - { - $oOptionRule{$strKey}{&OPTION_RULE_COMMAND} = - dclone($oOptionRule{$oOptionRule{$strKey}{&OPTION_RULE_COMMAND}}{&OPTION_RULE_COMMAND}); - } - - # If the required section is a scalar then copy the section from the referenced option - if (defined($oOptionRule{$strKey}{&OPTION_RULE_DEPEND}) && !ref($oOptionRule{$strKey}{&OPTION_RULE_DEPEND})) - { - $oOptionRule{$strKey}{&OPTION_RULE_DEPEND} = - dclone($oOptionRule{$oOptionRule{$strKey}{&OPTION_RULE_DEPEND}}{&OPTION_RULE_DEPEND}); - } -} +use constant CFGDEF_SECTION_GLOBAL => 'global'; + push @EXPORT, qw(CFGDEF_SECTION_GLOBAL); +use constant CFGDEF_SECTION_STANZA => 'stanza'; + push @EXPORT, qw(CFGDEF_SECTION_STANZA); #################################################################################################################################### # Module variables #################################################################################################################################### my %oOption; # Option hash my $strCommand; # Command (backup, archive-get, ...) +my $strCommandHelp; # The command that help is being generate for my $bInitLog = false; # Has logging been initialized yet? #################################################################################################################################### -# configLogging -# -# Configure logging based on options. +# configLogging - configure logging based on options #################################################################################################################################### sub configLogging { @@ -2139,10 +64,10 @@ sub configLogging if ($bInitLog || (defined($bLogInitForce) && $bLogInitForce)) { logLevelSet( - optionValid(OPTION_LOG_LEVEL_FILE) ? optionGet(OPTION_LOG_LEVEL_FILE) : OFF, - optionValid(OPTION_LOG_LEVEL_CONSOLE) ? optionGet(OPTION_LOG_LEVEL_CONSOLE) : OFF, - optionValid(OPTION_LOG_LEVEL_STDERR) ? optionGet(OPTION_LOG_LEVEL_STDERR) : OFF, - optionValid(OPTION_LOG_TIMESTAMP) ? optionGet(OPTION_LOG_TIMESTAMP) : undef); + cfgOptionValid(CFGOPT_LOG_LEVEL_FILE) ? cfgOption(CFGOPT_LOG_LEVEL_FILE) : OFF, + cfgOptionValid(CFGOPT_LOG_LEVEL_CONSOLE) ? cfgOption(CFGOPT_LOG_LEVEL_CONSOLE) : OFF, + cfgOptionValid(CFGOPT_LOG_LEVEL_STDERR) ? cfgOption(CFGOPT_LOG_LEVEL_STDERR) : OFF, + cfgOptionValid(CFGOPT_LOG_TIMESTAMP) ? cfgOption(CFGOPT_LOG_TIMESTAMP) : undef); $bInitLog = true; } @@ -2151,9 +76,9 @@ sub configLogging push @EXPORT, qw(configLogging); #################################################################################################################################### -# configLoad +# configLoad - load configuration # -# Load configuration. Additional conditions that cannot be codified by the OptionRule hash are also tested here. +# Additional conditions that cannot be codified by the OptionRule hash are also tested here. #################################################################################################################################### sub configLoad { @@ -2162,80 +87,44 @@ sub configLoad # Clear option in case it was loaded before %oOption = (); - # Build options for all possible db configurations - foreach my $strKey (sort(keys(%oOptionRule))) - { - if (defined($oOptionRule{$strKey}{&OPTION_RULE_PREFIX}) && $oOptionRule{$strKey}{&OPTION_RULE_PREFIX} eq OPTION_PREFIX_DB) - { - my $strPrefix = $oOptionRule{$strKey}{&OPTION_RULE_PREFIX}; - - # For now only allow one replica - for (my $iIndex = 2; $iIndex <= 2; $iIndex++) - { - my $strKeyNew = "${strPrefix}${iIndex}" . substr($strKey, length($strPrefix)); - - $oOptionRule{$strKeyNew} = dclone($oOptionRule{$strKey}); - $oOptionRule{$strKeyNew}{&OPTION_RULE_REQUIRED} = false; - - if (defined($oOptionRule{$strKeyNew}{&OPTION_RULE_DEPEND}) && - defined($oOptionRule{$strKeyNew}{&OPTION_RULE_DEPEND}{&OPTION_RULE_DEPEND_OPTION})) - { - $oOptionRule{$strKeyNew}{&OPTION_RULE_DEPEND}{&OPTION_RULE_DEPEND_OPTION} = - "${strPrefix}${iIndex}" . - substr($oOptionRule{$strKeyNew}{&OPTION_RULE_DEPEND}{&OPTION_RULE_DEPEND_OPTION}, length($strPrefix)); - } - } - - # Create an alternate name for the base db option - $oOptionRule{$strKey}{&OPTION_RULE_ALT_NAME} = "${strPrefix}1" . substr($strKey, length($strPrefix)); - } - } - # Build hash with all valid command-line options - my %oOptionAllow; + my @stryOptionAllow; - foreach my $strKey (keys(%oOptionRule)) + for (my $iOptionId = 0; $iOptionId < cfgOptionTotal(); $iOptionId++) { - foreach my $bAltName ((false, true)) + my $strKey = cfgOptionName($iOptionId); + + foreach my $bAltName (false, true) { my $strOptionName = $strKey; if ($bAltName) { - if (!defined($oOptionRule{$strKey}{&OPTION_RULE_ALT_NAME})) + if (!defined(cfgRuleOptionNameAlt($iOptionId))) { next; } - $strOptionName = $oOptionRule{$strKey}{&OPTION_RULE_ALT_NAME}; + $strOptionName = cfgRuleOptionNameAlt($iOptionId); } my $strOption = $strOptionName; - if (!defined($oOptionRule{$strKey}{&OPTION_RULE_TYPE})) - { - confess &log(ASSERT, "Option ${strKey} does not have a defined type", ERROR_ASSERT); - } - elsif ($oOptionRule{$strKey}{&OPTION_RULE_TYPE} eq OPTION_TYPE_HASH) + if (cfgRuleOptionType($iOptionId) eq CFGOPTDEF_TYPE_HASH) { $strOption .= '=s@'; } - elsif ($oOptionRule{$strKey}{&OPTION_RULE_TYPE} ne OPTION_TYPE_BOOLEAN) + elsif (cfgRuleOptionType($iOptionId) ne CFGOPTDEF_TYPE_BOOLEAN) { $strOption .= '=s'; } - $oOptionAllow{$strOption} = $strOption; + push(@stryOptionAllow, $strOption); # Check if the option can be negated - if ((defined($oOptionRule{$strKey}{&OPTION_RULE_NEGATE}) && - $oOptionRule{$strKey}{&OPTION_RULE_NEGATE}) || - ($oOptionRule{$strKey}{&OPTION_RULE_TYPE} eq OPTION_TYPE_BOOLEAN && - defined($oOptionRule{$strKey}{&OPTION_RULE_SECTION}))) + if (cfgRuleOptionNegate($iOptionId)) { - $strOption = 'no-' . $strOptionName; - $oOptionAllow{$strOption} = $strOption; - $oOptionRule{$strKey}{&OPTION_RULE_NEGATE} = true; + push(@stryOptionAllow, 'no-' . $strOptionName); } } } @@ -2246,24 +135,25 @@ sub configLoad # If nothing was passed on the command line then display help if (@ARGV == 0) { - commandSet(CMD_HELP); + cfgCommandSet(CFGCMD_HELP); } # Else process command line options else { # Parse command line options - if (!GetOptions(\%oOptionTest, %oOptionAllow)) + if (!GetOptions(\%oOptionTest, @stryOptionAllow)) { - commandSet(CMD_HELP); + $strCommand = cfgCommandName(CFGCMD_HELP); return false; } # Validate and store options my $bHelp = false; - if (defined($ARGV[0]) && $ARGV[0] eq CMD_HELP && defined($ARGV[1])) + if (defined($ARGV[0]) && $ARGV[0] eq cfgCommandName(CFGCMD_HELP) && defined($ARGV[1])) { $bHelp = true; + $strCommandHelp = $ARGV[1]; $ARGV[0] = $ARGV[1]; } @@ -2271,7 +161,7 @@ sub configLoad if ($bHelp) { - commandSet(CMD_HELP); + cfgCommandSet(CFGCMD_HELP); } } @@ -2286,44 +176,60 @@ sub configLoad # Log the command begin commandBegin(); - # Return and display version and help in main - if (commandTest(CMD_HELP) || commandTest(CMD_VERSION)) - { - return true; - } - # Neutralize the umask to make the repository file/path modes more consistent - if (optionTest(OPTION_NEUTRAL_UMASK) && optionGet(OPTION_NEUTRAL_UMASK)) + if (cfgOptionValid(CFGOPT_NEUTRAL_UMASK) && cfgOption(CFGOPT_NEUTRAL_UMASK)) { umask(0000); } + # Set db-cmd and backup-cmd to defaults if they are not set. The command depends on the currently running exe so can't be + # calculated correctly in the C Library -- perhaps in the future this value will be passed in or set some other way + if (cfgOptionValid(CFGOPT_BACKUP_CMD) && cfgOptionTest(CFGOPT_BACKUP_HOST) && !cfgOptionTest(CFGOPT_BACKUP_CMD)) + { + cfgOptionSet(CFGOPT_BACKUP_CMD, BACKREST_BIN); + $oOption{cfgOptionName(CFGOPT_BACKUP_CMD)}{source} = CFGDEF_SOURCE_DEFAULT; + } + + if (cfgOptionValid(CFGOPT_DB_CMD)) + { + for (my $iOptionIdx = 1; $iOptionIdx <= cfgOptionIndexTotal(CFGOPT_DB_HOST); $iOptionIdx++) + { + if (cfgOptionTest(cfgOptionIndex(CFGOPT_DB_HOST, $iOptionIdx)) && + !cfgOptionTest(cfgOptionIndex(CFGOPT_DB_CMD, $iOptionIdx))) + { + cfgOptionSet(cfgOptionIndex(CFGOPT_DB_CMD, $iOptionIdx), BACKREST_BIN); + $oOption{cfgOptionIndex(CFGOPT_DB_CMD, $iOptionIdx)}{source} = CFGDEF_SOURCE_DEFAULT; + } + } + } + # Protocol timeout should be greater than db timeout - if (optionTest(OPTION_DB_TIMEOUT) && optionTest(OPTION_PROTOCOL_TIMEOUT) && - optionGet(OPTION_PROTOCOL_TIMEOUT) <= optionGet(OPTION_DB_TIMEOUT)) + if (cfgOptionTest(CFGOPT_DB_TIMEOUT) && cfgOptionTest(CFGOPT_PROTOCOL_TIMEOUT) && + cfgOption(CFGOPT_PROTOCOL_TIMEOUT) <= cfgOption(CFGOPT_DB_TIMEOUT)) { # If protocol-timeout is default then increase it to be greater than db-timeout - if (optionSource(OPTION_PROTOCOL_TIMEOUT) eq SOURCE_DEFAULT) + if (cfgOptionSource(CFGOPT_PROTOCOL_TIMEOUT) eq CFGDEF_SOURCE_DEFAULT) { - optionSet(OPTION_PROTOCOL_TIMEOUT, optionGet(OPTION_DB_TIMEOUT) + 30); + cfgOptionSet(CFGOPT_PROTOCOL_TIMEOUT, cfgOption(CFGOPT_DB_TIMEOUT) + 30); } else { confess &log(ERROR, - "'" . optionGet(OPTION_PROTOCOL_TIMEOUT) . "' is not valid for '" . OPTION_PROTOCOL_TIMEOUT . "' option\n" . - "HINT: 'protocol-timeout' option should be greater than 'db-timeout' option.", + "'" . cfgOption(CFGOPT_PROTOCOL_TIMEOUT) . "' is not valid for '" . + cfgOptionName(CFGOPT_PROTOCOL_TIMEOUT) . "' option\n" . + "HINT: 'protocol-timeout' option should be greater than 'db-timeout' option.", ERROR_OPTION_INVALID_VALUE); } } # Make sure that backup and db are not both remote - if (optionTest(OPTION_DB_HOST) && optionTest(OPTION_BACKUP_HOST)) + if (cfgOptionTest(CFGOPT_DB_HOST) && cfgOptionTest(CFGOPT_BACKUP_HOST)) { confess &log(ERROR, 'db and backup cannot both be configured as remote', ERROR_CONFIG); } # Warn when retention-full is not set - if (optionValid(OPTION_RETENTION_FULL) && !optionTest(OPTION_RETENTION_FULL)) + if (cfgOptionValid(CFGOPT_RETENTION_FULL) && !cfgOptionTest(CFGOPT_RETENTION_FULL)) { &log(WARN, "option retention-full is not set, the repository may run out of space\n" . @@ -2331,14 +237,14 @@ sub configLoad } # If archive retention is valid for the command, then set archive settings - if (optionValid(OPTION_RETENTION_ARCHIVE)) + if (cfgOptionValid(CFGOPT_RETENTION_ARCHIVE)) { - my $strArchiveRetentionType = optionGet(OPTION_RETENTION_ARCHIVE_TYPE, false); - my $iArchiveRetention = optionGet(OPTION_RETENTION_ARCHIVE, false); - my $iFullRetention = optionGet(OPTION_RETENTION_FULL, false); - my $iDifferentialRetention = optionGet(OPTION_RETENTION_DIFF, false); + my $strArchiveRetentionType = cfgOption(CFGOPT_RETENTION_ARCHIVE_TYPE, false); + my $iArchiveRetention = cfgOption(CFGOPT_RETENTION_ARCHIVE, false); + my $iFullRetention = cfgOption(CFGOPT_RETENTION_FULL, false); + my $iDifferentialRetention = cfgOption(CFGOPT_RETENTION_DIFF, false); - my $strMsgArchiveOff = "WAL segments will not be expired: option '" . &OPTION_RETENTION_ARCHIVE_TYPE . + my $strMsgArchiveOff = "WAL segments will not be expired: option '" . cfgOptionName(CFGOPT_RETENTION_ARCHIVE_TYPE) . "=${strArchiveRetentionType}' but "; # If the archive retention is not explicitly set then determine what it should be set to so the user does not have to. @@ -2346,30 +252,30 @@ sub configLoad { # If retention-archive-type is default, then if retention-full is set, set the retention-archive to this value, # else ignore archiving - if ($strArchiveRetentionType eq BACKUP_TYPE_FULL) + if ($strArchiveRetentionType eq CFGOPTVAL_BACKUP_TYPE_FULL) { if (defined($iFullRetention)) { - optionSet(OPTION_RETENTION_ARCHIVE, $iFullRetention); + cfgOptionSet(CFGOPT_RETENTION_ARCHIVE, $iFullRetention); } } - elsif ($strArchiveRetentionType eq BACKUP_TYPE_DIFF) + elsif ($strArchiveRetentionType eq CFGOPTVAL_BACKUP_TYPE_DIFF) { # if retention-diff is set then user must have set it if (defined($iDifferentialRetention)) { - optionSet(OPTION_RETENTION_ARCHIVE, $iDifferentialRetention); + cfgOptionSet(CFGOPT_RETENTION_ARCHIVE, $iDifferentialRetention); } else { &log(WARN, - $strMsgArchiveOff . "neither option '" . &OPTION_RETENTION_ARCHIVE . - "' nor option '" . &OPTION_RETENTION_DIFF . "' is set"); + $strMsgArchiveOff . "neither option '" . cfgOptionName(CFGOPT_RETENTION_ARCHIVE) . + "' nor option '" . cfgOptionName(CFGOPT_RETENTION_DIFF) . "' is set"); } } - elsif ($strArchiveRetentionType eq BACKUP_TYPE_INCR) + elsif ($strArchiveRetentionType eq CFGOPTVAL_BACKUP_TYPE_INCR) { - &log(WARN, $strMsgArchiveOff . "option '" . &OPTION_RETENTION_ARCHIVE . "' is not set"); + &log(WARN, $strMsgArchiveOff . "option '" . cfgOptionName(CFGOPT_RETENTION_ARCHIVE) . "' is not set"); } } else @@ -2377,21 +283,23 @@ sub configLoad # If retention-archive is set then check retention-archive-type and issue a warning if the corresponding setting is # UNDEF since UNDEF means backups will not be expired but they should be in the practice of setting this # value even though expiring the archive itself is OK and will be performed. - if ($strArchiveRetentionType eq BACKUP_TYPE_DIFF && !defined($iDifferentialRetention)) + if ($strArchiveRetentionType eq CFGOPTVAL_BACKUP_TYPE_DIFF && !defined($iDifferentialRetention)) { &log(WARN, - "option '" . &OPTION_RETENTION_DIFF . "' is not set for '" . &OPTION_RETENTION_ARCHIVE_TYPE . "=" . - &BACKUP_TYPE_DIFF . "' \n" . + "option '" . cfgOptionName(CFGOPT_RETENTION_DIFF) . "' is not set for '" . + cfgOptionName(CFGOPT_RETENTION_ARCHIVE_TYPE) . "=" . &CFGOPTVAL_BACKUP_TYPE_DIFF . "' \n" . "HINT: to retain differential backups indefinitely (without warning), set option '" . - &OPTION_RETENTION_DIFF . "' to the maximum."); + cfgOptionName(CFGOPT_RETENTION_DIFF) . "' to the maximum."); } } } # Warn if ARCHIVE_MAX_MB is present - if (optionValid(OPTION_ARCHIVE_MAX_MB) && optionTest(OPTION_ARCHIVE_MAX_MB)) + if (cfgOptionValid(CFGOPT_ARCHIVE_MAX_MB) && cfgOptionTest(CFGOPT_ARCHIVE_MAX_MB)) { - &log(WARN, "'" . OPTION_ARCHIVE_MAX_MB . "' is no longer not longer valid, use '" . OPTION_ARCHIVE_QUEUE_MAX . "' instead"); + &log(WARN, + "'" . cfgOptionName(CFGOPT_ARCHIVE_MAX_MB) . "' is no longer not longer valid, use '" . + cfgOptionName(CFGOPT_ARCHIVE_QUEUE_MAX) . "' instead"); } return true; @@ -2409,27 +317,28 @@ sub optionValueGet my $strOption = shift; my $hOption = shift; - my $strValue = $$hOption{$strOption}; + my $strValue = $hOption->{$strOption}; # Some options have an alternate name so check for that as well - if (defined($oOptionRule{$strOption}{&OPTION_RULE_ALT_NAME})) - { - my $strAltValue = $$hOption{$oOptionRule{$strOption}{&OPTION_RULE_ALT_NAME}}; + my $iOptionId = cfgOptionId($strOption); - if (defined($strAltValue)) + if (defined(cfgRuleOptionNameAlt($iOptionId))) + { + my $strOptionAlt = cfgRuleOptionNameAlt($iOptionId); + my $strValueAlt = $hOption->{$strOptionAlt}; + + if (defined($strValueAlt)) { if (!defined($strValue)) { - $strValue = $strAltValue; + $strValue = $strValueAlt; - delete($hOption->{$oOptionRule{$strOption}{&OPTION_RULE_ALT_NAME}}); + delete($hOption->{$strOptionAlt}); $hOption->{$strOption} = $strValue; } else { - confess &log( - ERROR, "'${strOption}' and '" . $oOptionRule{$strOption}{&OPTION_RULE_ALT_NAME} . - ' cannot both be defined', ERROR_OPTION_INVALID_VALUE); + confess &log(ERROR, "'${strOption}' and '${strOptionAlt}' cannot both be defined", ERROR_OPTION_INVALID_VALUE); } } } @@ -2455,7 +364,9 @@ sub optionValidate confess &log(ERROR, "command must be specified", ERROR_COMMAND_REQUIRED); } - if (!defined($oCommandHash{$strCommand})) + my $iCommandId = cfgCommandId($strCommand); + + if ($iCommandId eq "-1") { confess &log(ERROR, "invalid command ${strCommand}", ERROR_COMMAND_INVALID); } @@ -2475,42 +386,32 @@ sub optionValidate # Assume that all dependencies will be resolved in this loop $bDependUnresolved = false; - foreach my $strOption (sort(keys(%oOptionRule))) + for (my $iOptionId = 0; $iOptionId < cfgOptionTotal(); $iOptionId++) { + my $strOption = cfgOptionName($iOptionId); + # Skip the option if it has been resolved in a prior loop if (defined($oOptionResolved{$strOption})) { next; } - # The command rules must be explicitly set - if (!defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND})) - { - confess &log(ASSERT, OPTION_RULE_COMMAND . " rules must be set for '${strOption}' option"); - } - # Determine if an option is valid for a command - if (!defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand})) + $oOption{$strOption}{valid} = cfgRuleOptionValid($iCommandId, $iOptionId); + + if (!$oOption{$strOption}{valid}) { - $oOption{$strOption}{valid} = false; $oOptionResolved{$strOption} = true; next; } - $oOption{$strOption}{valid} = true; - - if (defined($oOptionRule{$strOption}{&OPTION_RULE_SECURE}) && $oOptionRule{$strOption}{&OPTION_RULE_SECURE}) - { - $oOption{$strOption}{&OPTION_RULE_SECURE} = true; - } - # Store the option value my $strValue = optionValueGet($strOption, $oOptionTest); # Check to see if an option can be negated. Make sure that it is not set and negated at the same time. my $bNegate = false; - if (defined($oOptionRule{$strOption}{&OPTION_RULE_NEGATE}) && $oOptionRule{$strOption}{&OPTION_RULE_NEGATE}) + if (cfgRuleOptionNegate($iOptionId)) { $bNegate = defined($$oOptionTest{'no-' . $strOption}); @@ -2519,27 +420,23 @@ sub optionValidate confess &log(ERROR, "option '${strOption}' cannot be both set and negated", ERROR_OPTION_NEGATE); } - if ($bNegate && $oOptionRule{$strOption}{&OPTION_RULE_TYPE} eq OPTION_TYPE_BOOLEAN) + if ($bNegate && cfgRuleOptionType($iOptionId) eq CFGOPTDEF_TYPE_BOOLEAN) { $strValue = false; } } - # If the command has rules store them for later evaluation - my $oCommandRule = optionCommandRule($strOption, $strCommand); - # Check dependency for the command then for the option my $bDependResolved = true; - my $oDepend = defined($oCommandRule) ? $$oCommandRule{&OPTION_RULE_DEPEND} : - $oOptionRule{$strOption}{&OPTION_RULE_DEPEND}; my $strDependOption; my $strDependValue; my $strDependType; - if (defined($oDepend)) + if (cfgRuleOptionDepend($iCommandId, $iOptionId)) { # Check if the depend option has a value - $strDependOption = $$oDepend{&OPTION_RULE_DEPEND_OPTION}; + my $iDependOptionId = cfgRuleOptionDependOption($iCommandId, $iOptionId); + $strDependOption = cfgOptionName($iDependOptionId); $strDependValue = $oOption{$strDependOption}{value}; # Make sure the depend option has been resolved, otherwise skip this option for now @@ -2556,16 +453,16 @@ sub optionValidate } # If a depend value exists, make sure the option value matches - if ($bDependResolved && defined($$oDepend{&OPTION_RULE_DEPEND_VALUE}) && - $$oDepend{&OPTION_RULE_DEPEND_VALUE} ne $strDependValue) + if ($bDependResolved && cfgRuleOptionDependValueTotal($iCommandId, $iOptionId) == 1 && + cfgRuleOptionDependValue($iCommandId, $iOptionId, 0) ne $strDependValue) { $bDependResolved = false; $strDependType = 'value'; } # If a depend list exists, make sure the value is in the list - if ($bDependResolved && defined($$oDepend{&OPTION_RULE_DEPEND_LIST}) && - !defined($$oDepend{&OPTION_RULE_DEPEND_LIST}{$strDependValue})) + if ($bDependResolved && cfgRuleOptionDependValueTotal($iCommandId, $iOptionId) > 1 && + !cfgRuleOptionDependValueValid($iCommandId, $iOptionId, $strDependValue)) { $bDependResolved = false; $strDependType = 'list'; @@ -2573,23 +470,24 @@ sub optionValidate } # If the option value is undefined and not negated, see if it can be loaded from the config file - if (!defined($strValue) && !$bNegate && $strOption ne OPTION_CONFIG && - $oOptionRule{$strOption}{&OPTION_RULE_SECTION} && $bDependResolved) + if (!defined($strValue) && !$bNegate && $strOption ne cfgOptionName(CFGOPT_CONFIG) && + defined(cfgRuleOptionSection($iOptionId)) && $bDependResolved) { # If the config option has not been resolved yet then continue processing - if (!defined($oOptionResolved{&OPTION_CONFIG}) || !defined($oOptionResolved{&OPTION_STANZA})) + if (!defined($oOptionResolved{cfgOptionName(CFGOPT_CONFIG)}) || + !defined($oOptionResolved{cfgOptionName(CFGOPT_STANZA)})) { $bDependUnresolved = true; next; } # If the config option is defined try to get the option from the config file - if ($bConfigExists && defined($oOption{&OPTION_CONFIG}{value})) + if ($bConfigExists && defined($oOption{cfgOptionName(CFGOPT_CONFIG)}{value})) { # Attempt to load the config file if it has not been loaded if (!defined($oConfig)) { - my $strConfigFile = $oOption{&OPTION_CONFIG}{value}; + my $strConfigFile = $oOption{cfgOptionName(CFGOPT_CONFIG)}{value}; $bConfigExists = -e $strConfigFile; if ($bConfigExists) @@ -2608,40 +506,34 @@ sub optionValidate } # Get the section that the value should be in - my $strSection = $oOptionRule{$strOption}{&OPTION_RULE_SECTION}; + my $strSection = cfgRuleOptionSection($iOptionId); - # Always check for the option in the sanza section first - if (optionTest(OPTION_STANZA)) + # Always check for the option in the stanza section first + if (cfgOptionTest(CFGOPT_STANZA)) { - $strValue = optionValueGet($strOption, $$oConfig{optionGet(OPTION_STANZA)}); + $strValue = optionValueGet($strOption, $$oConfig{cfgOption(CFGOPT_STANZA)}); } - # Only continue searching when strSection != CONFIG_SECTION_STANZA. Some options (e.g. db-path) can only be + # Only continue searching when strSection != CFGDEF_SECTION_STANZA. Some options (e.g. db-path) can only be # configured in the stanza section. - if (!defined($strValue) && $strSection ne CONFIG_SECTION_STANZA) + if (!defined($strValue) && $strSection ne CFGDEF_SECTION_STANZA) { - # Check command sections for a value. This allows options (e.g. compress-level) to be set on a per-command - # basis. - if (defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand}) && - $oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand} != false) + # Check the stanza command section + if (cfgOptionTest(CFGOPT_STANZA)) { - # Check the stanza command section - if (optionTest(OPTION_STANZA)) - { - $strValue = optionValueGet($strOption, $$oConfig{optionGet(OPTION_STANZA) . ":${strCommand}"}); - } + $strValue = optionValueGet($strOption, $$oConfig{cfgOption(CFGOPT_STANZA) . ":${strCommand}"}); + } - # Check the global command section - if (!defined($strValue)) - { - $strValue = optionValueGet($strOption, $$oConfig{&CONFIG_SECTION_GLOBAL . ":${strCommand}"}); - } + # Check the global command section + if (!defined($strValue)) + { + $strValue = optionValueGet($strOption, $$oConfig{&CFGDEF_SECTION_GLOBAL . ":${strCommand}"}); } # Finally check the global section if (!defined($strValue)) { - $strValue = optionValueGet($strOption, $$oConfig{&CONFIG_SECTION_GLOBAL}); + $strValue = optionValueGet($strOption, $$oConfig{&CFGDEF_SECTION_GLOBAL}); } } @@ -2654,7 +546,7 @@ sub optionValidate $strValue = undef; } # Convert Y or N to boolean - elsif ($oOptionRule{$strOption}{&OPTION_RULE_TYPE} eq OPTION_TYPE_BOOLEAN) + elsif (cfgRuleOptionType($iOptionId) eq CFGOPTDEF_TYPE_BOOLEAN) { if ($strValue eq 'y') { @@ -2671,7 +563,7 @@ sub optionValidate } } # Convert a list of key/value pairs to a hash - elsif ($oOptionRule{$strOption}{&OPTION_RULE_TYPE} eq OPTION_TYPE_HASH) + elsif (cfgRuleOptionType($iOptionId) eq CFGOPTDEF_TYPE_HASH) { my @oValue = (); @@ -2713,14 +605,15 @@ sub optionValidate ERROR, "option '${strOption}' cannot be specified multiple times", ERROR_OPTION_MULTIPLE_VALUE); } - $oOption{$strOption}{source} = SOURCE_CONFIG; + $oOption{$strOption}{source} = CFGDEF_SOURCE_CONFIG; } } } - if (defined($oDepend) && !$bDependResolved && defined($strValue)) + if (cfgRuleOptionDepend($iCommandId, $iOptionId) && !$bDependResolved && defined($strValue)) { my $strError = "option '${strOption}' not valid without option "; + my $iDependOptionId = cfgOptionId($strDependOption); if ($strDependType eq 'source') { @@ -2730,13 +623,14 @@ sub optionValidate # If a depend value exists, make sure the option value matches if ($strDependType eq 'value') { - if ($oOptionRule{$strDependOption}{&OPTION_RULE_TYPE} eq OPTION_TYPE_BOOLEAN) + if (cfgRuleOptionType($iDependOptionId) eq CFGOPTDEF_TYPE_BOOLEAN) { - $strError .= "'" . ($$oDepend{&OPTION_RULE_DEPEND_VALUE} ? '' : 'no-') . "${strDependOption}'"; + $strError .= + "'" . (cfgRuleOptionDependValue($iCommandId, $iOptionId, 0) ? '' : 'no-') . "${strDependOption}'"; } else { - $strError .= "'${strDependOption}' = '$$oDepend{&OPTION_RULE_DEPEND_VALUE}'"; + $strError .= "'${strDependOption}' = '" . cfgRuleOptionDependValue($iCommandId, $iOptionId, 0) . "'"; } confess &log(ERROR, $strError, ERROR_OPTION_INVALID); @@ -2749,9 +643,9 @@ sub optionValidate { my @oyValue; - foreach my $strValue (sort(keys(%{$$oDepend{&OPTION_RULE_DEPEND_LIST}}))) + for (my $iValueId = 0; $iValueId < cfgRuleOptionDependValueTotal($iCommandId, $iOptionId); $iValueId++) { - push(@oyValue, "'${strValue}'"); + push(@oyValue, "'" . cfgRuleOptionDependValue($iCommandId, $iOptionId, $iValueId) . "'"); } $strError .= @oyValue == 1 ? " = $oyValue[0]" : " in (" . join(", ", @oyValue) . ")"; @@ -2763,10 +657,10 @@ sub optionValidate if (defined($strValue)) { # Check that floats and integers are valid - if ($oOptionRule{$strOption}{&OPTION_RULE_TYPE} eq OPTION_TYPE_INTEGER || - $oOptionRule{$strOption}{&OPTION_RULE_TYPE} eq OPTION_TYPE_FLOAT) + if (cfgRuleOptionType($iOptionId) eq CFGOPTDEF_TYPE_INTEGER || + cfgRuleOptionType($iOptionId) eq CFGOPTDEF_TYPE_FLOAT) { - # Test that the string is a valid float or integer by adding 1 to it. It's pretty hokey but it works and it + # Test that the string is a valid float or integer by adding 1 to it. It's pretty hokey but it works and it # beats requiring Scalar::Util::Numeric to do it properly. my $bError = false; @@ -2781,7 +675,7 @@ sub optionValidate }; # Check that integers are really integers - if (!$bError && $oOptionRule{$strOption}{&OPTION_RULE_TYPE} eq OPTION_TYPE_INTEGER && + if (!$bError && cfgRuleOptionType($iOptionId) eq CFGOPTDEF_TYPE_INTEGER && (int($strValue) . 'S') ne ($strValue . 'S')) { $bError = true; @@ -2793,25 +687,22 @@ sub optionValidate } # Process an allow list for the command then for the option - my $oAllow = defined($oCommandRule) ? $$oCommandRule{&OPTION_RULE_ALLOW_LIST} : - $oOptionRule{$strOption}{&OPTION_RULE_ALLOW_LIST}; - - if (defined($oAllow) && !defined($$oAllow{$strValue})) + if (cfgRuleOptionAllowList($iCommandId, $iOptionId) && + !cfgRuleOptionAllowListValueValid($iCommandId, $iOptionId, $strValue)) { confess &log(ERROR, "'${strValue}' is not valid for '${strOption}' option", ERROR_OPTION_INVALID_VALUE); } # Process an allow range for the command then for the option - $oAllow = defined($oCommandRule) ? $$oCommandRule{&OPTION_RULE_ALLOW_RANGE} : - $oOptionRule{$strOption}{&OPTION_RULE_ALLOW_RANGE}; - - if (defined($oAllow) && ($strValue < $$oAllow[0] || $strValue > $$oAllow[1])) + if (cfgRuleOptionAllowRange($iCommandId, $iOptionId) && + ($strValue < cfgRuleOptionAllowRangeMin($iCommandId, $iOptionId) || + $strValue > cfgRuleOptionAllowRangeMax($iCommandId, $iOptionId))) { confess &log(ERROR, "'${strValue}' is not valid for '${strOption}' option", ERROR_OPTION_INVALID_RANGE); } # Set option value - if ($oOptionRule{$strOption}{&OPTION_RULE_TYPE} eq OPTION_TYPE_HASH && ref($strValue) eq 'ARRAY') + if (cfgRuleOptionType($iOptionId) eq CFGOPTDEF_TYPE_HASH && ref($strValue) eq 'ARRAY') { foreach my $strItem (@{$strValue}) { @@ -2819,8 +710,7 @@ sub optionValidate my $strValue; # If the keys are expected to have values - if (!defined($oOptionRule{$strOption}{&OPTION_RULE_HASH_VALUE}) || - $oOptionRule{$strOption}{&OPTION_RULE_HASH_VALUE}) + if (cfgRuleOptionValueHash($iOptionId)) { # Check for = and make sure there is a least one character on each side my $iEqualPos = index($strItem, '='); @@ -2860,19 +750,17 @@ sub optionValidate # If not config sourced then it must be a param if (!defined($oOption{$strOption}{source})) { - $oOption{$strOption}{source} = SOURCE_PARAM; + $oOption{$strOption}{source} = CFGDEF_SOURCE_PARAM; } } # Else try to set a default - elsif ($bDependResolved && - (!defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}) || - defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand}))) + elsif ($bDependResolved) { # Source is default for this option - $oOption{$strOption}{source} = SOURCE_DEFAULT; + $oOption{$strOption}{source} = CFGDEF_SOURCE_DEFAULT; # Check for default in command then option - my $strDefault = optionDefault($strOption, $strCommand); + my $strDefault = cfgRuleOptionDefault($iCommandId, $iOptionId); # If default is defined if (defined($strDefault)) @@ -2881,12 +769,13 @@ sub optionValidate $oOption{$strOption}{value} = $strDefault if !$bNegate; } # Else check required - elsif (optionRequired($strOption, $strCommand) && !$bHelp) + elsif (cfgRuleOptionRequired($iCommandId, $iOptionId) && !$bHelp) { - confess &log(ERROR, "${strCommand} command requires option: ${strOption}" . - (defined($oOptionRule{$strOption}{&OPTION_RULE_HINT}) ? - "\nHINT: " . $oOptionRule{$strOption}{&OPTION_RULE_HINT} : ''), - ERROR_OPTION_REQUIRED); + confess &log(ERROR, + "${strCommand} command requires option: ${strOption}" . + (defined(cfgRuleOptionHint($iCommandId, $iOptionId)) ? + "\nHINT: " . cfgRuleOptionHint($iCommandId, $iOptionId) : ''), + ERROR_OPTION_REQUIRED); } } @@ -2924,7 +813,7 @@ sub configFileValidate my $bFileValid = true; - if (!commandTest(CMD_REMOTE) && !commandTest(CMD_LOCAL)) + if (!cfgCommandTest(CFGCMD_REMOTE) && !cfgCommandTest(CFGCMD_LOCAL)) { foreach my $strSectionKey (keys(%$oConfig)) { @@ -2932,6 +821,7 @@ sub configFileValidate foreach my $strOption (keys(%{$$oConfig{$strSectionKey}})) { + my $strOptionDisplay = $strOption; my $strValue = $$oConfig{$strSectionKey}{$strOption}; # Is the option listed as an alternate name for another option? If so, replace it with the recognized option. @@ -2943,9 +833,9 @@ sub configFileValidate } # Is the option a valid pgbackrest option? - if (!(exists($oOptionRule{$strOption}) || defined($strOptionAltName))) + if (!(cfgOptionId($strOption) ne '-1' || defined($strOptionAltName))) { - &log(WARN, optionGet(OPTION_CONFIG) . " file contains invalid option '${strOption}'"); + &log(WARN, cfgOption(CFGOPT_CONFIG) . " file contains invalid option '${strOptionDisplay}'"); $bFileValid = false; } else @@ -2953,20 +843,21 @@ sub configFileValidate # Is the option valid for the command section in which it is located? if (defined($strCommand) && $strCommand ne '') { - if (!defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand})) + if (!cfgRuleOptionValid(cfgCommandId($strCommand), cfgOptionId($strOption))) { - &log(WARN, optionGet(OPTION_CONFIG) . " valid option '${strOption}' is not valid for command " . + &log(WARN, cfgOption(CFGOPT_CONFIG) . " valid option '${strOptionDisplay}' is not valid for command " . "'${strCommand}'"); $bFileValid = false; } } # Is the valid option a stanza-only option and not located in a global section? - if ($oOptionRule{$strOption}{&OPTION_RULE_SECTION} eq CONFIG_SECTION_STANZA && - $strSection eq CONFIG_SECTION_GLOBAL) + if (cfgRuleOptionSection(cfgOptionId($strOption)) eq CFGDEF_SECTION_STANZA && + $strSection eq CFGDEF_SECTION_GLOBAL) { - &log(WARN, optionGet(OPTION_CONFIG) . " valid option '${strOption}' is a stanza section option and is not " . - "valid in section ${strSection}\n" . + &log(WARN, + cfgOption(CFGOPT_CONFIG) . " valid option '${strOptionDisplay}' is a stanza section option and is" . + " not valid in section ${strSection}\n" . "HINT: global options can be specified in global or stanza sections but not visa-versa"); $bFileValid = false; } @@ -2978,8 +869,6 @@ sub configFileValidate return $bFileValid; } -push @EXPORT, qw(configFileValidate); - #################################################################################################################################### # optionAltName # @@ -2992,10 +881,11 @@ sub optionAltName my $strOptionAltName = undef; # Check if the options exists as an alternate name (e.g. db-host has altname db1-host) - foreach my $strKey (keys(%oOptionRule)) + for (my $iOptionId = 0; $iOptionId < cfgOptionTotal(); $iOptionId++) { - if (defined($oOptionRule{$strKey}{&OPTION_RULE_ALT_NAME}) && - $oOptionRule{$strKey}{&OPTION_RULE_ALT_NAME} eq $strOption) + my $strKey = cfgOptionName($iOptionId); + + if (defined(cfgRuleOptionNameAlt($iOptionId)) && cfgRuleOptionNameAlt($iOptionId) eq $strOption) { $strOptionAltName = $strKey; } @@ -3004,221 +894,102 @@ sub optionAltName return $strOptionAltName; } -push @EXPORT, qw(optionAltName); - #################################################################################################################################### -# optionCommandRule -# -# Returns the option rules based on the command. +# cfgOptionIndex - return name for options that can be indexed (e.g. db1-host, db2-host). #################################################################################################################################### -sub optionCommandRule +sub cfgOptionIndex { - my $strOption = shift; - my $strCommand = shift; - - if (defined($strCommand)) - { - return defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}) && - defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand}) && - ref($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand}) eq 'HASH' ? - $oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strCommand} : undef; - } - - return; -} - -#################################################################################################################################### -# optionRequired -# -# Is the option required for this command? -#################################################################################################################################### -sub optionRequired -{ - my $strOption = shift; - my $strCommand = shift; - - # Get the command rule - my $oCommandRule = optionCommandRule($strOption, $strCommand); - - # Check for required in command then option - my $bRequired = defined($oCommandRule) ? $$oCommandRule{&OPTION_RULE_REQUIRED} : - $oOptionRule{$strOption}{&OPTION_RULE_REQUIRED}; - - # Return required - return !defined($bRequired) || $bRequired; -} - -push @EXPORT, qw(optionRequired); - -#################################################################################################################################### -# optionType -# -# Get the option type. -#################################################################################################################################### -sub optionType -{ - my $strOption = shift; - - return $oOptionRule{$strOption}{&OPTION_RULE_TYPE}; -} - -push @EXPORT, qw(optionType); - -#################################################################################################################################### -# optionTypeTest -# -# Test the option type. -#################################################################################################################################### -sub optionTypeTest -{ - my $strOption = shift; - my $strType = shift; - - return optionType($strOption) eq $strType; -} - -push @EXPORT, qw(optionTypeTest); - -#################################################################################################################################### -# optionIndex -# -# Return name for options that can be indexed (e.g. db1-host, db2-host). -#################################################################################################################################### -sub optionIndex -{ - my $strOption = shift; + my $iOptionId = shift; my $iIndex = shift; my $bForce = shift; # If the option doesn't have a prefix it can't be indexed $iIndex = defined($iIndex) ? $iIndex : 1; - my $strPrefix = $oOptionRule{$strOption}{&OPTION_RULE_PREFIX}; + my $strPrefix = cfgRuleOptionPrefix($iOptionId); - if (!defined($strPrefix) && $iIndex > 1) + if (!defined($strPrefix)) { - confess &log(ASSERT, "'${strOption}' option does not allow indexing"); + if ($iIndex > 1) + { + confess &log(ASSERT, "'" . cfgOptionName($iOptionId) . "' option does not allow indexing"); + } + + return $iOptionId; } - # Index 1 is the same name as the option unless forced to include the index - if ($iIndex == 1 && (!defined($bForce) || !$bForce)) - { - return $strOption; - } - - return "${strPrefix}${iIndex}" . substr($strOption, length($strPrefix)); + return cfgOptionId("${strPrefix}${iIndex}" . substr(cfgOptionName($iOptionId), index(cfgOptionName($iOptionId), '-'))); } -push @EXPORT, qw(optionIndex); +push @EXPORT, qw(cfgOptionIndex); #################################################################################################################################### -# optionDefault -# -# Does the option have a default for this command? +# cfgOptionSource - how was the option set? #################################################################################################################################### -sub optionDefault +sub cfgOptionSource { - my $strOption = shift; - my $strCommand = shift; + my $iOptionId = shift; - # Get the command rule - my $oCommandRule = optionCommandRule($strOption, $strCommand); + cfgOptionValid($iOptionId, true); - # Check for default in command - my $strDefault = defined($oCommandRule) ? $$oCommandRule{&OPTION_RULE_DEFAULT} : undef; - - # If defined return, else try to grab the global default - return defined($strDefault) ? $strDefault : $oOptionRule{$strOption}{&OPTION_RULE_DEFAULT}; + return $oOption{cfgOptionName($iOptionId)}{source}; } -push @EXPORT, qw(optionDefault); +push @EXPORT, qw(cfgOptionSource); #################################################################################################################################### -# optionRange -# -# Gets the allowed setting range for the option if it exists. +# cfgOptionValid - is the option valid for the current command? #################################################################################################################################### -sub optionRange +sub cfgOptionValid { - my $strOption = shift; - my $strCommand = shift; - - # Get the command rule - my $oCommandRule = optionCommandRule($strOption, $strCommand); - - # Check for default in command - if (defined($oCommandRule) && defined($$oCommandRule{&OPTION_RULE_ALLOW_RANGE})) - { - return $$oCommandRule{&OPTION_RULE_ALLOW_RANGE}[0], $$oCommandRule{&OPTION_RULE_ALLOW_RANGE}[1]; - } - - # If defined return, else try to grab the global default - return $oOptionRule{$strOption}{&OPTION_RULE_ALLOW_RANGE}[0], $oOptionRule{$strOption}{&OPTION_RULE_ALLOW_RANGE}[1]; -} - -push @EXPORT, qw(optionRange); - -#################################################################################################################################### -# optionSource -# -# How was the option set? -#################################################################################################################################### -sub optionSource -{ - my $strOption = shift; - - optionValid($strOption, true); - - return $oOption{$strOption}{source}; -} - -push @EXPORT, qw(optionSource); - -#################################################################################################################################### -# optionValid -# -# Is the option valid for the current command? -#################################################################################################################################### -sub optionValid -{ - my $strOption = shift; + my $iOptionId = shift; my $bError = shift; - if (defined($oOption{$strOption}) && defined($oOption{$strOption}{valid}) && $oOption{$strOption}{valid}) + # If defined then this is the command help is being generated for so all valid checks should be against that command + my $iCommandId; + + if (defined($strCommandHelp)) + { + $iCommandId = cfgCommandId($strCommandHelp); + } + # Else try to use the normal command + elsif (defined($strCommand)) + { + $iCommandId = cfgCommandId($strCommand); + } + + if (defined($iCommandId) && cfgRuleOptionValid($iCommandId, $iOptionId)) { return true; } if (defined($bError) && $bError) { + my $strOption = cfgOptionName($iOptionId); + if (!defined($oOption{$strOption})) { confess &log(ASSERT, "option '${strOption}' does not exist"); } - if (!defined($oOption{$strOption}{valid})) - { - confess &log(ASSERT, "option '${strOption}' does not have 'valid' flag set"); - } - - confess &log(ASSERT, "option '${strOption}' not valid for command '" . commandGet() . "'"); + confess &log(ASSERT, "option '${strOption}' not valid for command '" . cfgCommandName(cfgCommandGet()) . "'"); } return false; } -push @EXPORT, qw(optionValid); +push @EXPORT, qw(cfgOptionValid); #################################################################################################################################### -# optionGet -# -# Get option value. +# cfgOption - get option value #################################################################################################################################### -sub optionGet +sub cfgOption { - my $strOption = shift; + my $iOptionId = shift; my $bRequired = shift; - optionValid($strOption, true); + cfgOptionValid($iOptionId, true); + + my $strOption = cfgOptionName($iOptionId); if (!defined($oOption{$strOption}{value}) && (!defined($bRequired) || $bRequired)) { @@ -3228,92 +999,88 @@ sub optionGet return $oOption{$strOption}{value}; } -push @EXPORT, qw(optionGet); +push @EXPORT, qw(cfgOption); #################################################################################################################################### -# optionSet -# -# Set option value and source if the option is valid for the command. +# cfgOptionDefault - get option default value #################################################################################################################################### -sub optionSet +sub cfgOptionDefault { - my $strOption = shift; + my $iOptionId = shift; + + cfgOptionValid($iOptionId, true); + + return cfgRuleOptionDefault(cfgCommandId($strCommand), $iOptionId); +} + +push @EXPORT, qw(cfgOptionDefault); + +#################################################################################################################################### +# cfgOptionSet - set option value and source +#################################################################################################################################### +sub cfgOptionSet +{ + my $iOptionId = shift; my $oValue = shift; my $bForce = shift; - if (!optionValid($strOption, !defined($bForce) || !$bForce)) + my $strOption = cfgOptionName($iOptionId); + + if (!cfgOptionValid($iOptionId, !defined($bForce) || !$bForce)) { $oOption{$strOption}{valid} = true; } - $oOption{$strOption}{source} = SOURCE_PARAM; + $oOption{$strOption}{source} = CFGDEF_SOURCE_PARAM; $oOption{$strOption}{value} = $oValue; } -push @EXPORT, qw(optionSet); +push @EXPORT, qw(cfgOptionSet); #################################################################################################################################### -# optionTest -# -# Test a option value. +# cfgOptionTest - test if an option exists or has a specific value #################################################################################################################################### -sub optionTest +sub cfgOptionTest { - my $strOption = shift; + my $iOptionId = shift; my $strValue = shift; - if (!optionValid($strOption)) + if (!cfgOptionValid($iOptionId)) { return false; } if (defined($strValue)) { - return optionGet($strOption) eq $strValue ? true : false; + return cfgOption($iOptionId) eq $strValue ? true : false; } - return defined($oOption{$strOption}{value}) ? true : false; + return defined($oOption{cfgOptionName($iOptionId)}{value}) ? true : false; } -push @EXPORT, qw(optionTest); +push @EXPORT, qw(cfgOptionTest); #################################################################################################################################### -# optionRuleGet -# -# Get the option rules. +# cfgCommandGet - get the current command #################################################################################################################################### -sub optionRuleGet +sub cfgCommandGet { - return dclone(\%oOptionRule); + return cfgCommandId($strCommand); } -push @EXPORT, qw(optionRuleGet); +push @EXPORT, qw(cfgCommandGet); #################################################################################################################################### -# commandGet -# -# Get the current command. +# cfgCommandTest - test that the current command is equal to the provided value #################################################################################################################################### -sub commandGet +sub cfgCommandTest { - return $strCommand; + my $iCommandIdTest = shift; + + return cfgCommandName($iCommandIdTest) eq $strCommand; } -push @EXPORT, qw(commandGet); - -#################################################################################################################################### -# commandTest -# -# Test the current command. -#################################################################################################################################### -sub commandTest -{ - my $strCommandTest = shift; - - return $strCommandTest eq $strCommand; -} - -push @EXPORT, qw(commandTest); +push @EXPORT, qw(cfgCommandTest); #################################################################################################################################### # commandBegin @@ -3323,12 +1090,10 @@ push @EXPORT, qw(commandTest); sub commandBegin { &log( - $strCommand eq CMD_INFO ? DEBUG : INFO, - "${strCommand} command begin " . BACKREST_VERSION . ':' . commandWrite($strCommand, true, '', false)); + $strCommand eq cfgCommandName(CFGCMD_INFO) ? DEBUG : INFO, + "${strCommand} command begin " . BACKREST_VERSION . ':' . cfgCommandWrite(cfgCommandId($strCommand), true, '', false)); } -push @EXPORT, qw(commandBegin); - #################################################################################################################################### # commandEnd # @@ -3342,7 +1107,7 @@ sub commandEnd if (defined($strCommand)) { &log( - $strCommand eq CMD_INFO ? DEBUG : INFO, + $strCommand eq cfgCommandName(CFGCMD_INFO) ? DEBUG : INFO, "${strCommand} command end: " . (defined($iExitCode) && $iExitCode != 0 ? ($iExitCode == ERROR_TERM ? "terminated on signal " . (defined($strSignal) ? "[SIG${strSignal}]" : 'from child process') : @@ -3354,32 +1119,29 @@ sub commandEnd push @EXPORT, qw(commandEnd); #################################################################################################################################### -# commandSet -# -# Set current command (usually for triggering follow-on commands). +# cfgCommandSet - set current command (usually for triggering follow-on commands) #################################################################################################################################### -sub commandSet +sub cfgCommandSet { - my $strValue = shift; + my $iCommandId = shift; commandEnd(); - $strCommand = $strValue; + $strCommand = cfgCommandName($iCommandId); commandBegin(); } -push @EXPORT, qw(commandSet); +push @EXPORT, qw(cfgCommandSet); #################################################################################################################################### -# commandWrite +# cfgCommandWrite - using the options for the current command, write the command string for another command # -# Using the options that were passed to the current command, write the command string for another command. For example, this -# can be used to write the archive-get command for recovery.conf during a restore. +# For example, this can be used to write the archive-get command for recovery.conf during a restore. #################################################################################################################################### -sub commandWrite +sub cfgCommandWrite { - my $strNewCommand = shift; + my $iNewCommandId = shift; my $bIncludeConfig = shift; my $strExeString = shift; my $bIncludeCommand = shift; @@ -3391,24 +1153,34 @@ sub commandWrite $bIncludeCommand = defined($bIncludeCommand) ? $bIncludeCommand : true; # Iterate the options to figure out which ones are not default and need to be written out to the new command string - foreach my $strOption (sort(keys(%oOptionRule))) + for (my $iOptionId = 0; $iOptionId < cfgOptionTotal(); $iOptionId++) { - # Skip option if it is secure and should not be output in logs or the command line - next if ($oOption{$strOption}{&OPTION_RULE_SECURE}); + my $strOption = cfgOptionName($iOptionId); - # Process any option overrides first - if (defined($$oOptionOverride{$strOption})) + # Skip option if it is secure and should not be output in logs or the command line + next if (cfgRuleOptionSecure($iOptionId)); + + # Process any option id overrides first + if (defined($oOptionOverride->{$iOptionId})) { - if (defined($$oOptionOverride{$strOption}{value})) + if (defined($oOptionOverride->{$iOptionId}{value})) { - $strExeString .= commandWriteOptionFormat($strOption, false, {value => $$oOptionOverride{$strOption}{value}}); + $strExeString .= cfgCommandWriteOptionFormat($strOption, false, {value => $oOptionOverride->{$iOptionId}{value}}); + } + } + # And process overrides passed by string - this is used by Perl compitiblity functions + elsif (defined($oOptionOverride->{$strOption})) + { + if (defined($oOptionOverride->{$strOption}{value})) + { + $strExeString .= cfgCommandWriteOptionFormat($strOption, false, {value => $oOptionOverride->{$strOption}{value}}); } } # else look for non-default options in the current configuration - elsif ((!defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}) || - defined($oOptionRule{$strOption}{&OPTION_RULE_COMMAND}{$strNewCommand})) && + elsif (cfgRuleOptionValid($iNewCommandId, $iOptionId) && defined($oOption{$strOption}{value}) && - ($bIncludeConfig ? $oOption{$strOption}{source} ne SOURCE_DEFAULT : $oOption{$strOption}{source} eq SOURCE_PARAM)) + ($bIncludeConfig ? + $oOption{$strOption}{source} ne CFGDEF_SOURCE_DEFAULT : $oOption{$strOption}{source} eq CFGDEF_SOURCE_PARAM)) { my $oValue; my $bMulti = false; @@ -3425,22 +1197,22 @@ sub commandWrite $oValue = {value => $oOption{$strOption}{value}}; } - $strExeString .= commandWriteOptionFormat($strOption, $bMulti, $oValue); + $strExeString .= cfgCommandWriteOptionFormat($strOption, $bMulti, $oValue); } } if ($bIncludeCommand) { - $strExeString .= " ${strNewCommand}"; + $strExeString .= ' ' . cfgCommandName($iNewCommandId); } return $strExeString; } -push @EXPORT, qw(commandWrite); +push @EXPORT, qw(cfgCommandWrite); -# Helper function for commandWrite() to correctly format options for command-line usage -sub commandWriteOptionFormat +# Helper function for cfgCommandWrite() to correctly format options for command-line usage +sub cfgCommandWriteOptionFormat { my $strOption = shift; my $bMulti = shift; @@ -3456,7 +1228,7 @@ sub commandWriteOptionFormat my $strValue = ($bMulti ? "${strKey}=" : '') . $$oValue{$strKey}; # Handle the no- prefix for boolean values - if ($oOptionRule{$strOption}{&OPTION_RULE_TYPE} eq OPTION_TYPE_BOOLEAN) + if (cfgRuleOptionType(cfgOptionId($strOption)) eq CFGOPTDEF_TYPE_BOOLEAN) { $strParam = '--' . ($strValue ? '' : 'no-') . $strOption; } @@ -3472,16 +1244,4 @@ sub commandWriteOptionFormat return $strOptionFormat; } -#################################################################################################################################### -# commandHashGet -# -# Get the hash that contains all valid commands. -#################################################################################################################################### -sub commandHashGet -{ - return dclone(\%oCommandHash); -} - -push @EXPORT, qw(commandHashGet); - 1; diff --git a/lib/pgBackRest/Config/ConfigHelp.pm b/lib/pgBackRest/Config/ConfigHelp.pm index 326bf8c1a..14967eff3 100644 --- a/lib/pgBackRest/Config/ConfigHelp.pm +++ b/lib/pgBackRest/Config/ConfigHelp.pm @@ -76,8 +76,6 @@ sub configHelp pgBackRest::Config::ConfigHelpData->import(); # Get config data - my $oCommandHash = commandHashGet(); - my $oOptionRule = optionRuleGet(); my $oConfigHelpData = configHelpDataGet(); # Build version @@ -104,7 +102,7 @@ sub configHelp { $strCommand = lc($strCommand); - if (defined($$oCommandHash{$strCommand})) + if (defined($oConfigHelpData->{&CONFIG_HELP_COMMAND}{$strCommand})) { $strTitle = "'${strCommand}' command"; @@ -191,7 +189,7 @@ sub configHelp $iOptionLength = length($strOption); } - my ($oOption, $strSection) = configHelpOptionFind($oConfigHelpData, $oOptionRule, $strCommand, $strOption); + my ($oOption, $strSection) = configHelpOptionFind($oConfigHelpData, $strCommand, $strOption); $$oSection{$strSection}{$strOption} = $oOption; } @@ -250,7 +248,7 @@ sub configHelp # Else option help else { - my ($oOption) = configHelpOptionFind($oConfigHelpData, $oOptionRule, $strCommand, $strOption); + my ($oOption) = configHelpOptionFind($oConfigHelpData, $strCommand, $strOption); # Set current and default values my $strDefault = ''; @@ -344,12 +342,26 @@ sub configHelpFormatText sub configHelpOptionFind { my $oConfigHelpData = shift; - my $oOptionRule = shift; my $strCommand = shift; my $strOption = shift; my $strSection = CONFIG_HELP_COMMAND; my $oOption = $$oConfigHelpData{&CONFIG_HELP_COMMAND}{$strCommand}{&CONFIG_HELP_OPTION}{$strOption}; + my $iCommandId = cfgCommandId($strCommand); + my $iOptionId = cfgOptionId($strOption); + + # If not found then this is an indexed value + if ($iOptionId eq -1) + { + my $strPrefix = substr($strOption, 0, index($strOption, '-')); + $iOptionId = cfgOptionId("${strPrefix}1" . substr($strOption, index($strOption, '-'))); + + # If still not found then error + if ($iOptionId eq -1) + { + confess &log(ASSERT, "option '${strOption}' not found in help"); + } + } if (ref(\$oOption) eq 'SCALAR') { @@ -370,7 +382,7 @@ sub configHelpOptionFind } if (($strSection ne CONFIG_SECTION_GENERAL && $strSection ne CONFIG_SECTION_LOG && - $strSection ne CONFIG_SECTION_REPOSITORY && $strSection ne CONFIG_SECTION_STANZA && + $strSection ne CONFIG_SECTION_REPOSITORY && $strSection ne CFGDEF_SECTION_STANZA && $strSection ne CONFIG_SECTION_EXPIRE) || $strSection eq $strCommand) { @@ -378,27 +390,31 @@ sub configHelpOptionFind } } - if (defined(optionDefault($strOption, $strCommand))) + # Check if the current set value is default (some defaults are set at runtime and are not in the rules) + if (defined(cfgOption($iOptionId, false, false)) && cfgOptionSource($iOptionId, false) eq CONFIG_HELP_SOURCE_DEFAULT) { - if ($$oOptionRule{$strOption}{&OPTION_RULE_TYPE} eq &OPTION_TYPE_BOOLEAN) - { - $$oOption{&CONFIG_HELP_DEFAULT} = optionDefault($strOption, $strCommand) ? 'y' : 'n'; - } - else - { - $$oOption{&CONFIG_HELP_DEFAULT} = optionDefault($strOption, $strCommand); - } + $oOption->{&CONFIG_HELP_DEFAULT} = cfgOption($iOptionId, true, false); } - if (optionTest($strOption) && optionSource($strOption) ne CONFIG_HELP_SOURCE_DEFAULT) + # If no default is set see if there is a default in the rules + if (!defined($oOption->{&CONFIG_HELP_DEFAULT}) && defined(cfgRuleOptionDefault($iCommandId, $iOptionId))) { - if ($$oOptionRule{$strOption}{&OPTION_RULE_TYPE} eq &OPTION_TYPE_BOOLEAN) + $oOption->{&CONFIG_HELP_DEFAULT} = cfgRuleOptionDefault($iCommandId, $iOptionId); + } + + # Format the default properly if it is a boolean + if (defined($oOption->{&CONFIG_HELP_DEFAULT}) && cfgRuleOptionType($iOptionId) eq CFGOPTDEF_TYPE_BOOLEAN) + { + $oOption->{&CONFIG_HELP_DEFAULT} = $oOption->{&CONFIG_HELP_DEFAULT} ? 'y' : 'n'; + } + + if (defined(cfgOption($iOptionId, false, false)) && cfgOptionSource($iOptionId, false) ne CONFIG_HELP_SOURCE_DEFAULT) + { + $oOption->{&CONFIG_HELP_CURRENT} = cfgOption($iOptionId, true, false); + + if (cfgRuleOptionType($iOptionId) eq CFGOPTDEF_TYPE_BOOLEAN) { - $$oOption{&CONFIG_HELP_CURRENT} = optionGet($strOption) ? 'y' : 'n'; - } - else - { - $$oOption{&CONFIG_HELP_CURRENT} = optionGet($strOption); + $$oOption{&CONFIG_HELP_CURRENT} = $oOption->{&CONFIG_HELP_CURRENT} ? 'y' : 'n'; } } diff --git a/lib/pgBackRest/Config/ConfigHelpData.pm b/lib/pgBackRest/Config/ConfigHelpData.pm index f4a9b962f..311dc7660 100644 --- a/lib/pgBackRest/Config/ConfigHelpData.pm +++ b/lib/pgBackRest/Config/ConfigHelpData.pm @@ -936,6 +936,7 @@ my $oConfigHelpData = 'compress-level-network' => 'section', 'config' => 'default', 'db-path' => 'section', + 'db-timeout' => 'section', 'lock-path' => 'section', 'log-level-console' => 'section', 'log-level-file' => 'section', @@ -988,6 +989,7 @@ my $oConfigHelpData = 'db-host' => 'section', 'db-path' => 'section', 'db-ssh-port' => 'section', + 'db-timeout' => 'section', 'lock-path' => 'section', 'log-level-console' => 'section', 'log-level-file' => 'section', @@ -1216,6 +1218,7 @@ my $oConfigHelpData = option => { + 'buffer-size' => 'section', 'cmd-ssh' => 'section', 'config' => 'default', 'db-cmd' => 'section', @@ -1228,6 +1231,7 @@ my $oConfigHelpData = 'log-level-stderr' => 'section', 'log-path' => 'section', 'log-timestamp' => 'section', + 'neutral-umask' => 'section', 'repo-path' => 'section', 'repo-s3-bucket' => 'section', 'repo-s3-ca-file' => 'section', @@ -1578,6 +1582,7 @@ my $oConfigHelpData = 'backup-host' => 'section', 'backup-ssh-port' => 'section', 'backup-standby' => 'section', + 'backup-user' => 'section', 'buffer-size' => 'section', 'cmd-ssh' => 'section', 'compress-level' => 'section', @@ -1596,6 +1601,7 @@ my $oConfigHelpData = 'log-level-console' => 'section', 'log-level-file' => 'section', 'log-path' => 'section', + 'log-timestamp' => 'section', 'neutral-umask' => 'section', # ONLINE Option Help @@ -1654,6 +1660,7 @@ my $oConfigHelpData = 'log-level-stderr' => 'section', 'log-path' => 'section', 'log-timestamp' => 'section', + 'neutral-umask' => 'section', 'repo-path' => 'section', 'repo-s3-bucket' => 'section', 'repo-s3-ca-file' => 'section', @@ -1715,6 +1722,7 @@ my $oConfigHelpData = 'log-level-stderr' => 'section', 'log-path' => 'section', 'log-timestamp' => 'section', + 'neutral-umask' => 'section', 'repo-path' => 'section', 'repo-s3-bucket' => 'section', 'repo-s3-ca-file' => 'section', diff --git a/lib/pgBackRest/Config/Data.pm b/lib/pgBackRest/Config/Data.pm new file mode 100644 index 000000000..163ae753b --- /dev/null +++ b/lib/pgBackRest/Config/Data.pm @@ -0,0 +1,1929 @@ +#################################################################################################################################### +# Configuration Rule Data +# +# Contains the rules for options: which commands the option can/cannot be specified, for which commands it is required, default +# settings, types, ranges, whether the option is negatable, whether it has dependencies, etc. The initial section is the global +# section meaning the rules defined there apply to all commands listed for the option. +# +# CFGBLDDEF_RULE_COMMAND: +# List of commands the option can be used with this option. An empty hash signifies that the command does no deviate from the +# option defaults. Otherwise, overrides can be specified. +# +# NOTE: If the option (A) has a dependency on another option (B) then the CFGCMD_ must also be specified in the other option +# (B), else it will still error on the option (A). +# +# CFGBLDDEF_RULE_REQUIRED: +# In global section: +# true - if the option does not have a default, then setting CFGBLDDEF_RULE_REQUIRED in the global section means all commands +# listed in CFGBLDDEF_RULE_COMMAND require the user to set it. +# false - no commands listed require it as an option but it can be set. This can be overridden for individual commands by +# setting CFGBLDDEF_RULE_REQUIRED in the CFGBLDDEF_RULE_COMMAND section. +# In CFGBLDDEF_RULE_COMMAND section: +# true - the option must be set somehow for the command, either by default (CFGBLDDEF_RULE_DEFAULT) or by the user. +# &CFGCMD_CHECK => +# { +# &CFGBLDDEF_RULE_REQUIRED => true +# }, +# false - mainly used for overriding the CFGBLDDEF_RULE_REQUIRED in the global section. +# +# CFGBLDDEF_RULE_DEFAULT: +# Sets a default for the option for all commands if listed in the global section, or for specific commands if listed in the +# CFGBLDDEF_RULE_COMMAND section. +# +# CFGBLDDEF_RULE_NEGATE: +# The option can be negated with "no" e.g. --no-compress. This applies tp options that are only valid on the command line (i.e. +# no config section defined). All config options are automatically negatable. +# +# CFGBLDDEF_RULE_DEPEND: +# Specify the dependencies this option has on another option. All commands listed for this option must also be listed in the +# dependent option(s). +# CFGBLDDEF_RULE_DEPEND_LIST further defines the allowable settings for the depended option. +# +# CFGBLDDEF_RULE_ALLOW_LIST: +# Lists the allowable settings for the option. +#################################################################################################################################### +package pgBackRest::Config::Data; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Cwd qw(abs_path); +use Exporter qw(import); + our @EXPORT = qw(); +use File::Basename qw(dirname basename); +use Getopt::Long qw(GetOptions); +use Storable qw(dclone); + +use pgBackRest::Common::Exception; +use pgBackRest::Common::Ini; +use pgBackRest::Common::Io::Base; +use pgBackRest::Common::Log; +use pgBackRest::Common::Wait; +use pgBackRest::Version; + +#################################################################################################################################### +# Command constants - commands that are allowed in pgBackRest +#################################################################################################################################### +use constant CFGCMD_ARCHIVE_GET => 'archive-get'; + push @EXPORT, qw(CFGCMD_ARCHIVE_GET); +use constant CFGCMD_ARCHIVE_PUSH => 'archive-push'; + push @EXPORT, qw(CFGCMD_ARCHIVE_PUSH); +use constant CFGCMD_BACKUP => 'backup'; + push @EXPORT, qw(CFGCMD_BACKUP); +use constant CFGCMD_CHECK => 'check'; + push @EXPORT, qw(CFGCMD_CHECK); +use constant CFGCMD_EXPIRE => 'expire'; + push @EXPORT, qw(CFGCMD_EXPIRE); +use constant CFGCMD_HELP => 'help'; + push @EXPORT, qw(CFGCMD_HELP); +use constant CFGCMD_INFO => 'info'; + push @EXPORT, qw(CFGCMD_INFO); +use constant CFGCMD_LOCAL => 'local'; + push @EXPORT, qw(CFGCMD_LOCAL); +use constant CFGCMD_REMOTE => 'remote'; + push @EXPORT, qw(CFGCMD_REMOTE); +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_UPGRADE => 'stanza-upgrade'; + push @EXPORT, qw(CFGCMD_STANZA_UPGRADE); +use constant CFGCMD_START => 'start'; + push @EXPORT, qw(CFGCMD_START); +use constant CFGCMD_STOP => 'stop'; + push @EXPORT, qw(CFGCMD_STOP); +use constant CFGCMD_VERSION => 'version'; + push @EXPORT, qw(CFGCMD_VERSION); + +#################################################################################################################################### +# Option constants - options that are allowed for commands +#################################################################################################################################### + +# Command-line only options +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPT_CONFIG => 'config'; + push @EXPORT, qw(CFGOPT_CONFIG); +use constant CFGOPT_DELTA => 'delta'; + push @EXPORT, qw(CFGOPT_DELTA); +use constant CFGOPT_FORCE => 'force'; + push @EXPORT, qw(CFGOPT_FORCE); +use constant CFGOPT_ONLINE => 'online'; + push @EXPORT, qw(CFGOPT_ONLINE); +use constant CFGOPT_SET => 'set'; + push @EXPORT, qw(CFGOPT_SET); +use constant CFGOPT_STANZA => 'stanza'; + push @EXPORT, qw(CFGOPT_STANZA); +use constant CFGOPT_TARGET => 'target'; + push @EXPORT, qw(CFGOPT_TARGET); +use constant CFGOPT_TARGET_EXCLUSIVE => 'target-exclusive'; + push @EXPORT, qw(CFGOPT_TARGET_EXCLUSIVE); +use constant CFGOPT_TARGET_ACTION => 'target-action'; + push @EXPORT, qw(CFGOPT_TARGET_ACTION); +use constant CFGOPT_TARGET_TIMELINE => 'target-timeline'; + push @EXPORT, qw(CFGOPT_TARGET_TIMELINE); +use constant CFGOPT_TYPE => 'type'; + push @EXPORT, qw(CFGOPT_TYPE); +use constant CFGOPT_OUTPUT => 'output'; + push @EXPORT, qw(CFGOPT_OUTPUT); + +# Command-line only local/remote optiosn +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPT_COMMAND => 'command'; + push @EXPORT, qw(CFGOPT_COMMAND); +use constant CFGOPT_PROCESS => 'process'; + push @EXPORT, qw(CFGOPT_PROCESS); +use constant CFGOPT_HOST_ID => 'host-id'; + push @EXPORT, qw(CFGOPT_HOST_ID); + +# Command-line only test options +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPT_TEST => 'test'; + push @EXPORT, qw(CFGOPT_TEST); +use constant CFGOPT_TEST_DELAY => 'test-delay'; + push @EXPORT, qw(CFGOPT_TEST_DELAY); +use constant CFGOPT_TEST_POINT => 'test-point'; + push @EXPORT, qw(CFGOPT_TEST_POINT); + +# General options +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPT_ARCHIVE_TIMEOUT => 'archive-timeout'; + push @EXPORT, qw(CFGOPT_ARCHIVE_TIMEOUT); +use constant CFGOPT_BUFFER_SIZE => 'buffer-size'; + push @EXPORT, qw(CFGOPT_BUFFER_SIZE); +use constant CFGOPT_DB_TIMEOUT => 'db-timeout'; + push @EXPORT, qw(CFGOPT_DB_TIMEOUT); +use constant CFGOPT_COMPRESS => 'compress'; + push @EXPORT, qw(CFGOPT_COMPRESS); +use constant CFGOPT_COMPRESS_LEVEL => 'compress-level'; + push @EXPORT, qw(CFGOPT_COMPRESS_LEVEL); +use constant CFGOPT_COMPRESS_LEVEL_NETWORK => 'compress-level-network'; + push @EXPORT, qw(CFGOPT_COMPRESS_LEVEL_NETWORK); +use constant CFGOPT_NEUTRAL_UMASK => 'neutral-umask'; + push @EXPORT, qw(CFGOPT_NEUTRAL_UMASK); +use constant CFGOPT_PROTOCOL_TIMEOUT => 'protocol-timeout'; + push @EXPORT, qw(CFGOPT_PROTOCOL_TIMEOUT); +use constant CFGOPT_PROCESS_MAX => 'process-max'; + push @EXPORT, qw(CFGOPT_PROCESS_MAX); + +# Commands +use constant CFGOPT_CMD_SSH => 'cmd-ssh'; + push @EXPORT, qw(CFGOPT_CMD_SSH); + +# Paths +use constant CFGOPT_LOCK_PATH => 'lock-path'; + push @EXPORT, qw(CFGOPT_LOCK_PATH); +use constant CFGOPT_LOG_PATH => 'log-path'; + push @EXPORT, qw(CFGOPT_LOG_PATH); +use constant CFGOPT_SPOOL_PATH => 'spool-path'; + push @EXPORT, qw(CFGOPT_SPOOL_PATH); + +# Repository +use constant CFGOPT_REPO_PATH => 'repo-path'; + push @EXPORT, qw(CFGOPT_REPO_PATH); +use constant CFGOPT_REPO_TYPE => 'repo-type'; + push @EXPORT, qw(CFGOPT_REPO_TYPE); + +# Repository S3 +use constant CFGOPT_REPO_S3_KEY => 'repo-s3-key'; + push @EXPORT, qw(CFGOPT_REPO_S3_KEY); +use constant CFGOPT_REPO_S3_KEY_SECRET => 'repo-s3-key-secret'; + push @EXPORT, qw(CFGOPT_REPO_S3_KEY_SECRET); +use constant CFGOPT_REPO_S3_BUCKET => 'repo-s3-bucket'; + push @EXPORT, qw(CFGOPT_REPO_S3_BUCKET); +use constant CFGOPT_REPO_S3_CA_FILE => 'repo-s3-ca-file'; + push @EXPORT, qw(CFGOPT_REPO_S3_CA_FILE); +use constant CFGOPT_REPO_S3_CA_PATH => 'repo-s3-ca-path'; + push @EXPORT, qw(CFGOPT_REPO_S3_CA_PATH); +use constant CFGOPT_REPO_S3_ENDPOINT => 'repo-s3-endpoint'; + push @EXPORT, qw(CFGOPT_REPO_S3_ENDPOINT); +use constant CFGOPT_REPO_S3_HOST => 'repo-s3-host'; + push @EXPORT, qw(CFGOPT_REPO_S3_HOST); +use constant CFGOPT_REPO_S3_REGION => 'repo-s3-region'; + push @EXPORT, qw(CFGOPT_REPO_S3_REGION); +use constant CFGOPT_REPO_S3_VERIFY_SSL => 'repo-s3-verify-ssl'; + push @EXPORT, qw(CFGOPT_REPO_S3_VERIFY_SSL); + +# Logging +use constant CFGOPT_LOG_LEVEL_CONSOLE => 'log-level-console'; + push @EXPORT, qw(CFGOPT_LOG_LEVEL_CONSOLE); +use constant CFGOPT_LOG_LEVEL_FILE => 'log-level-file'; + push @EXPORT, qw(CFGOPT_LOG_LEVEL_FILE); +use constant CFGOPT_LOG_LEVEL_STDERR => 'log-level-stderr'; + push @EXPORT, qw(CFGOPT_LOG_LEVEL_STDERR); +use constant CFGOPT_LOG_TIMESTAMP => 'log-timestamp'; + push @EXPORT, qw(CFGOPT_LOG_TIMESTAMP); + +# Archive options +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPT_ARCHIVE_ASYNC => 'archive-async'; + push @EXPORT, qw(CFGOPT_ARCHIVE_ASYNC); +# Deprecated and to be removed +use constant CFGOPT_ARCHIVE_MAX_MB => 'archive-max-mb'; + push @EXPORT, qw(CFGOPT_ARCHIVE_MAX_MB); +use constant CFGOPT_ARCHIVE_QUEUE_MAX => 'archive-queue-max'; + push @EXPORT, qw(CFGOPT_ARCHIVE_QUEUE_MAX); + +# Backup options +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPT_ARCHIVE_CHECK => 'archive-check'; + push @EXPORT, qw(CFGOPT_ARCHIVE_CHECK); +use constant CFGOPT_ARCHIVE_COPY => 'archive-copy'; + push @EXPORT, qw(CFGOPT_ARCHIVE_COPY); +use constant CFGOPT_BACKUP_CMD => 'backup-cmd'; + push @EXPORT, qw(CFGOPT_BACKUP_CMD); +use constant CFGOPT_BACKUP_CONFIG => 'backup-config'; + push @EXPORT, qw(CFGOPT_BACKUP_CONFIG); +use constant CFGOPT_BACKUP_HOST => 'backup-host'; + push @EXPORT, qw(CFGOPT_BACKUP_HOST); +use constant CFGOPT_BACKUP_SSH_PORT => 'backup-ssh-port'; + push @EXPORT, qw(CFGOPT_BACKUP_SSH_PORT); +use constant CFGOPT_BACKUP_STANDBY => 'backup-standby'; + push @EXPORT, qw(CFGOPT_BACKUP_STANDBY); +use constant CFGOPT_BACKUP_USER => 'backup-user'; + push @EXPORT, qw(CFGOPT_BACKUP_USER); +use constant CFGOPT_CHECKSUM_PAGE => 'checksum-page'; + push @EXPORT, qw(CFGOPT_CHECKSUM_PAGE); +use constant CFGOPT_HARDLINK => 'hardlink'; + push @EXPORT, qw(CFGOPT_HARDLINK); +use constant CFGOPT_MANIFEST_SAVE_THRESHOLD => 'manifest-save-threshold'; + push @EXPORT, qw(CFGOPT_MANIFEST_SAVE_THRESHOLD); +use constant CFGOPT_RESUME => 'resume'; + push @EXPORT, qw(CFGOPT_RESUME); +use constant CFGOPT_START_FAST => 'start-fast'; + push @EXPORT, qw(CFGOPT_START_FAST); +use constant CFGOPT_STOP_AUTO => 'stop-auto'; + push @EXPORT, qw(CFGOPT_STOP_AUTO); + +# Expire options +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPT_RETENTION_ARCHIVE => 'retention-archive'; + push @EXPORT, qw(CFGOPT_RETENTION_ARCHIVE); +use constant CFGOPT_RETENTION_ARCHIVE_TYPE => 'retention-archive-type'; + push @EXPORT, qw(CFGOPT_RETENTION_ARCHIVE_TYPE); +use constant CFGOPT_RETENTION_DIFF => 'retention-diff'; + push @EXPORT, qw(CFGOPT_RETENTION_DIFF); +use constant CFGOPT_RETENTION_FULL => 'retention-full'; + push @EXPORT, qw(CFGOPT_RETENTION_FULL); + +# Restore options +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPT_DB_INCLUDE => 'db-include'; + push @EXPORT, qw(CFGOPT_DB_INCLUDE); +use constant CFGOPT_LINK_ALL => 'link-all'; + push @EXPORT, qw(CFGOPT_LINK_ALL); +use constant CFGOPT_LINK_MAP => 'link-map'; + push @EXPORT, qw(CFGOPT_LINK_MAP); +use constant CFGOPT_TABLESPACE_MAP_ALL => 'tablespace-map-all'; + push @EXPORT, qw(CFGOPT_TABLESPACE_MAP_ALL); +use constant CFGOPT_TABLESPACE_MAP => 'tablespace-map'; + push @EXPORT, qw(CFGOPT_TABLESPACE_MAP); +use constant CFGOPT_RECOVERY_OPTION => 'recovery-option'; + push @EXPORT, qw(CFGOPT_RECOVERY_OPTION); + +# Stanza options +#----------------------------------------------------------------------------------------------------------------------------------- +# Determines how many databases can be configured +use constant CFGDEF_INDEX_DB => 2; + +# Prefix that must be used by all db options that allow multiple configurations +use constant CFGDEF_PREFIX_DB => 'db'; + +use constant CFGOPT_DB_CMD => CFGDEF_PREFIX_DB . '-cmd'; + push @EXPORT, qw(CFGOPT_DB_CMD); +use constant CFGOPT_DB_CONFIG => CFGDEF_PREFIX_DB . '-config'; + push @EXPORT, qw(CFGOPT_DB_CONFIG); +use constant CFGOPT_DB_HOST => CFGDEF_PREFIX_DB . '-host'; + push @EXPORT, qw(CFGOPT_DB_HOST); +use constant CFGOPT_DB_PATH => CFGDEF_PREFIX_DB . '-path'; + push @EXPORT, qw(CFGOPT_DB_PATH); +use constant CFGOPT_DB_PORT => CFGDEF_PREFIX_DB . '-port'; + push @EXPORT, qw(CFGOPT_DB_PORT); +use constant CFGOPT_DB_SSH_PORT => CFGDEF_PREFIX_DB . '-ssh-port'; + push @EXPORT, qw(CFGOPT_DB_SSH_PORT); +use constant CFGOPT_DB_SOCKET_PATH => CFGDEF_PREFIX_DB . '-socket-path'; + push @EXPORT, qw(CFGOPT_DB_SOCKET_PATH); +use constant CFGOPT_DB_USER => CFGDEF_PREFIX_DB . '-user'; + push @EXPORT, qw(CFGOPT_DB_USER); + +#################################################################################################################################### +# Option values - for options that have a specific list of allowed values +#################################################################################################################################### + +# Local/remote types +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPTVAL_LOCAL_TYPE_DB => 'db'; + push @EXPORT, qw(CFGOPTVAL_LOCAL_TYPE_DB); +use constant CFGOPTVAL_LOCAL_TYPE_BACKUP => 'backup'; + push @EXPORT, qw(CFGOPTVAL_LOCAL_TYPE_BACKUP); +use constant CFGOPTVAL_REMOTE_TYPE_DB => CFGOPTVAL_LOCAL_TYPE_DB; + push @EXPORT, qw(CFGOPTVAL_REMOTE_TYPE_DB); +use constant CFGOPTVAL_REMOTE_TYPE_BACKUP => CFGOPTVAL_LOCAL_TYPE_BACKUP; + push @EXPORT, qw(CFGOPTVAL_REMOTE_TYPE_BACKUP); + +# Backup type +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPTVAL_BACKUP_TYPE_FULL => 'full'; + push @EXPORT, qw(CFGOPTVAL_BACKUP_TYPE_FULL); +use constant CFGOPTVAL_BACKUP_TYPE_DIFF => 'diff'; + push @EXPORT, qw(CFGOPTVAL_BACKUP_TYPE_DIFF); +use constant CFGOPTVAL_BACKUP_TYPE_INCR => 'incr'; + push @EXPORT, qw(CFGOPTVAL_BACKUP_TYPE_INCR); + +# Repo type +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPTVAL_REPO_TYPE_CIFS => 'cifs'; + push @EXPORT, qw(CFGOPTVAL_REPO_TYPE_CIFS); +use constant CFGOPTVAL_REPO_TYPE_POSIX => 'posix'; + push @EXPORT, qw(CFGOPTVAL_REPO_TYPE_POSIX); +use constant CFGOPTVAL_REPO_TYPE_S3 => 's3'; + push @EXPORT, qw(CFGOPTVAL_REPO_TYPE_S3); + +# Info output +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPTVAL_INFO_OUTPUT_TEXT => 'text'; + push @EXPORT, qw(CFGOPTVAL_INFO_OUTPUT_TEXT); +use constant CFGOPTVAL_INFO_OUTPUT_JSON => 'json'; + push @EXPORT, qw(CFGOPTVAL_INFO_OUTPUT_JSON); + +# Restore type +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPTVAL_RESTORE_TYPE_NAME => 'name'; + push @EXPORT, qw(CFGOPTVAL_RESTORE_TYPE_NAME); +use constant CFGOPTVAL_RESTORE_TYPE_TIME => 'time'; + push @EXPORT, qw(CFGOPTVAL_RESTORE_TYPE_TIME); +use constant CFGOPTVAL_RESTORE_TYPE_XID => 'xid'; + push @EXPORT, qw(CFGOPTVAL_RESTORE_TYPE_XID); +use constant CFGOPTVAL_RESTORE_TYPE_PRESERVE => 'preserve'; + push @EXPORT, qw(CFGOPTVAL_RESTORE_TYPE_PRESERVE); +use constant CFGOPTVAL_RESTORE_TYPE_NONE => 'none'; + push @EXPORT, qw(CFGOPTVAL_RESTORE_TYPE_NONE); +use constant CFGOPTVAL_RESTORE_TYPE_IMMEDIATE => 'immediate'; + push @EXPORT, qw(CFGOPTVAL_RESTORE_TYPE_IMMEDIATE); +use constant CFGOPTVAL_RESTORE_TYPE_DEFAULT => 'default'; + push @EXPORT, qw(CFGOPTVAL_RESTORE_TYPE_DEFAULT); + +# Restore target action +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPTVAL_RESTORE_TARGET_ACTION_PAUSE => 'pause'; + push @EXPORT, qw(CFGOPTVAL_RESTORE_TARGET_ACTION_PAUSE); +use constant CFGOPTVAL_RESTORE_TARGET_ACTION_PROMOTE => 'promote'; + push @EXPORT, qw(CFGOPTVAL_RESTORE_TARGET_ACTION_PROMOTE); +use constant CFGOPTVAL_RESTORE_TARGET_ACTION_SHUTDOWN => 'shutdown'; + push @EXPORT, qw(CFGOPTVAL_RESTORE_TARGET_ACTION_SHUTDOWN); + +#################################################################################################################################### +# Option defaults - only defined here when the default is used in more than one place +#################################################################################################################################### +use constant CFGDEF_DEFAULT_BUFFER_SIZE_MIN => 16384; + +use constant CFGDEF_DEFAULT_COMPRESS_LEVEL_MIN => 0; +use constant CFGDEF_DEFAULT_COMPRESS_LEVEL_MAX => 9; + +use constant CFGDEF_DEFAULT_CONFIG => '/etc/' . BACKREST_CONF; + +use constant CFGDEF_DEFAULT_DB_TIMEOUT => 1800; +use constant CFGDEF_DEFAULT_DB_TIMEOUT_MIN => WAIT_TIME_MINIMUM; +use constant CFGDEF_DEFAULT_DB_TIMEOUT_MAX => 86400 * 7; + +use constant CFGDEF_DEFAULT_RETENTION_MIN => 1; +use constant CFGDEF_DEFAULT_RETENTION_MAX => 999999999; + +#################################################################################################################################### +# Option definition constants - rules, types, sections, etc. +#################################################################################################################################### + +# Option rules +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGBLDDEF_RULE_ALT_NAME => 'alt-name'; + push @EXPORT, qw(CFGBLDDEF_RULE_ALT_NAME); +use constant CFGBLDDEF_RULE_ALLOW_LIST => 'allow-list'; + push @EXPORT, qw(CFGBLDDEF_RULE_ALLOW_LIST); +use constant CFGBLDDEF_RULE_ALLOW_RANGE => 'allow-range'; + push @EXPORT, qw(CFGBLDDEF_RULE_ALLOW_RANGE); +use constant CFGBLDDEF_RULE_DEFAULT => 'default'; + push @EXPORT, qw(CFGBLDDEF_RULE_DEFAULT); +use constant CFGBLDDEF_RULE_DEPEND => 'depend'; + push @EXPORT, qw(CFGBLDDEF_RULE_DEPEND); +use constant CFGBLDDEF_RULE_DEPEND_OPTION => 'depend-option'; + push @EXPORT, qw(CFGBLDDEF_RULE_DEPEND_OPTION); +use constant CFGBLDDEF_RULE_DEPEND_LIST => 'depend-list'; + push @EXPORT, qw(CFGBLDDEF_RULE_DEPEND_LIST); +use constant CFGBLDDEF_RULE_HASH_VALUE => 'hash-value'; + push @EXPORT, qw(CFGBLDDEF_RULE_HASH_VALUE); +use constant CFGBLDDEF_RULE_HINT => 'hint'; + push @EXPORT, qw(CFGBLDDEF_RULE_HINT); +use constant CFGBLDDEF_RULE_INDEX => 'index'; + push @EXPORT, qw(CFGBLDDEF_RULE_INDEX); +use constant CFGBLDDEF_RULE_NEGATE => 'negate'; + push @EXPORT, qw(CFGBLDDEF_RULE_NEGATE); +use constant CFGBLDDEF_RULE_PREFIX => 'prefix'; + push @EXPORT, qw(CFGBLDDEF_RULE_PREFIX); +use constant CFGBLDDEF_RULE_COMMAND => 'command'; + push @EXPORT, qw(CFGBLDDEF_RULE_COMMAND); +use constant CFGBLDDEF_RULE_REQUIRED => 'required'; + push @EXPORT, qw(CFGBLDDEF_RULE_REQUIRED); +use constant CFGBLDDEF_RULE_SECTION => 'section'; + push @EXPORT, qw(CFGBLDDEF_RULE_SECTION); +use constant CFGBLDDEF_RULE_SECURE => 'secure'; + push @EXPORT, qw(CFGBLDDEF_RULE_SECURE); +use constant CFGBLDDEF_RULE_TYPE => 'type'; + push @EXPORT, qw(CFGBLDDEF_RULE_TYPE); + +# Option rules +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGOPTDEF_TYPE_BOOLEAN => 'boolean'; + push @EXPORT, qw(CFGOPTDEF_TYPE_BOOLEAN); +use constant CFGOPTDEF_TYPE_FLOAT => 'float'; + push @EXPORT, qw(CFGOPTDEF_TYPE_FLOAT); +use constant CFGOPTDEF_TYPE_HASH => 'hash'; + push @EXPORT, qw(CFGOPTDEF_TYPE_HASH); +use constant CFGOPTDEF_TYPE_INTEGER => 'integer'; + push @EXPORT, qw(CFGOPTDEF_TYPE_INTEGER); +use constant CFGOPTDEF_TYPE_STRING => 'string'; + push @EXPORT, qw(CFGOPTDEF_TYPE_STRING); + +# Option config sections +#----------------------------------------------------------------------------------------------------------------------------------- +use constant CFGDEF_SECTION_GLOBAL => 'global'; + push @EXPORT, qw(CFGDEF_SECTION_GLOBAL); +use constant CFGDEF_SECTION_STANZA => 'stanza'; + push @EXPORT, qw(CFGDEF_SECTION_STANZA); + +#################################################################################################################################### +# Option rules +#################################################################################################################################### +my %hOptionRule = +( + # Command-line only options + #------------------------------------------------------------------------------------------------------------------------------- + &CFGOPT_CONFIG => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => CFGDEF_DEFAULT_CONFIG, + &CFGBLDDEF_RULE_NEGATE => true, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + } + }, + + &CFGOPT_DELTA => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => + { + &CFGBLDDEF_RULE_DEFAULT => false, + } + } + }, + + &CFGOPT_FORCE => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => + { + &CFGBLDDEF_RULE_DEFAULT => false, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_ONLINE, + &CFGBLDDEF_RULE_DEPEND_LIST => [false], + }, + }, + + &CFGCMD_RESTORE => + { + &CFGBLDDEF_RULE_DEFAULT => false, + }, + + &CFGCMD_STANZA_CREATE => + { + &CFGBLDDEF_RULE_DEFAULT => false, + }, + + &CFGCMD_STOP => + { + &CFGBLDDEF_RULE_DEFAULT => false + } + } + }, + + &CFGOPT_ONLINE => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_NEGATE => true, + &CFGBLDDEF_RULE_DEFAULT => true, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + } + }, + + &CFGOPT_SET => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => + { + &CFGBLDDEF_RULE_DEFAULT => 'latest', + } + } + }, + + &CFGOPT_STANZA => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_INFO => + { + &CFGBLDDEF_RULE_REQUIRED => false + }, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => + { + &CFGBLDDEF_RULE_REQUIRED => false + }, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => + { + &CFGBLDDEF_RULE_REQUIRED => false + }, + &CFGCMD_STOP => + { + &CFGBLDDEF_RULE_REQUIRED => false + } + } + }, + + &CFGOPT_TARGET => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => + { + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_TYPE, + &CFGBLDDEF_RULE_DEPEND_LIST => + [ + &CFGOPTVAL_RESTORE_TYPE_NAME, + &CFGOPTVAL_RESTORE_TYPE_TIME, + &CFGOPTVAL_RESTORE_TYPE_XID, + ], + }, + }, + }, + }, + + &CFGOPT_TARGET_EXCLUSIVE => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => + { + &CFGBLDDEF_RULE_DEFAULT => false, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_TYPE, + &CFGBLDDEF_RULE_DEPEND_LIST => + [ + &CFGOPTVAL_RESTORE_TYPE_TIME, + &CFGOPTVAL_RESTORE_TYPE_XID, + ], + }, + }, + }, + }, + + &CFGOPT_TARGET_ACTION => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => + { + &CFGBLDDEF_RULE_DEFAULT => CFGOPTVAL_RESTORE_TARGET_ACTION_PAUSE, + + &CFGBLDDEF_RULE_ALLOW_LIST => + [ + &CFGOPTVAL_RESTORE_TARGET_ACTION_PAUSE, + &CFGOPTVAL_RESTORE_TARGET_ACTION_PROMOTE, + &CFGOPTVAL_RESTORE_TARGET_ACTION_SHUTDOWN, + ], + + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_TYPE, + &CFGBLDDEF_RULE_DEPEND_LIST => + [ + &CFGOPTVAL_RESTORE_TYPE_NAME, + &CFGOPTVAL_RESTORE_TYPE_TIME, + &CFGOPTVAL_RESTORE_TYPE_XID, + ], + }, + }, + }, + }, + + &CFGOPT_TARGET_TIMELINE => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => + { + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_TYPE, + &CFGBLDDEF_RULE_DEPEND_LIST => + [ + &CFGOPTVAL_RESTORE_TYPE_DEFAULT, + &CFGOPTVAL_RESTORE_TYPE_NAME, + &CFGOPTVAL_RESTORE_TYPE_TIME, + &CFGOPTVAL_RESTORE_TYPE_XID, + ], + }, + }, + }, + }, + + &CFGOPT_TYPE => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => + { + &CFGBLDDEF_RULE_DEFAULT => CFGOPTVAL_BACKUP_TYPE_INCR, + &CFGBLDDEF_RULE_ALLOW_LIST => + [ + &CFGOPTVAL_BACKUP_TYPE_FULL, + &CFGOPTVAL_BACKUP_TYPE_DIFF, + &CFGOPTVAL_BACKUP_TYPE_INCR, + ] + }, + + &CFGCMD_LOCAL => + { + &CFGBLDDEF_RULE_ALLOW_LIST => + [ + &CFGOPTVAL_LOCAL_TYPE_DB, + &CFGOPTVAL_LOCAL_TYPE_BACKUP, + ], + }, + + &CFGCMD_REMOTE => + { + &CFGBLDDEF_RULE_ALLOW_LIST => + [ + &CFGOPTVAL_REMOTE_TYPE_DB, + &CFGOPTVAL_REMOTE_TYPE_BACKUP, + ], + }, + + &CFGCMD_RESTORE => + { + &CFGBLDDEF_RULE_DEFAULT => CFGOPTVAL_RESTORE_TYPE_DEFAULT, + &CFGBLDDEF_RULE_ALLOW_LIST => + [ + &CFGOPTVAL_RESTORE_TYPE_NAME, + &CFGOPTVAL_RESTORE_TYPE_TIME, + &CFGOPTVAL_RESTORE_TYPE_XID, + &CFGOPTVAL_RESTORE_TYPE_PRESERVE, + &CFGOPTVAL_RESTORE_TYPE_NONE, + &CFGOPTVAL_RESTORE_TYPE_IMMEDIATE, + &CFGOPTVAL_RESTORE_TYPE_DEFAULT, + ] + } + } + }, + + &CFGOPT_OUTPUT => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_INFO => + { + &CFGBLDDEF_RULE_DEFAULT => CFGOPTVAL_INFO_OUTPUT_TEXT, + &CFGBLDDEF_RULE_ALLOW_LIST => + [ + &CFGOPTVAL_INFO_OUTPUT_TEXT, + &CFGOPTVAL_INFO_OUTPUT_JSON, + ] + } + } + }, + + # Command-line only local/remote options + #------------------------------------------------------------------------------------------------------------------------------- + &CFGOPT_COMMAND => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + } + }, + + &CFGOPT_HOST_ID => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_LOCAL => {}, + }, + }, + + &CFGOPT_PROCESS => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_LOCAL => + { + &CFGBLDDEF_RULE_REQUIRED => true, + }, + &CFGCMD_REMOTE => + { + &CFGBLDDEF_RULE_REQUIRED => false, + }, + }, + }, + + # Command-line only test options + #------------------------------------------------------------------------------------------------------------------------------- + &CFGOPT_TEST => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + } + }, + + &CFGOPT_TEST_DELAY => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_FLOAT, + &CFGBLDDEF_RULE_DEFAULT => 5, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_TEST, + &CFGBLDDEF_RULE_DEPEND_LIST => [true], + }, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_TEST, + }, + + &CFGOPT_TEST_POINT => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_HASH, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_DEPEND => CFGOPT_TEST_DELAY, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_TEST, + }, + + # General options + #------------------------------------------------------------------------------------------------------------------------------- + &CFGOPT_ARCHIVE_TIMEOUT => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_FLOAT, + &CFGBLDDEF_RULE_DEFAULT => 60, + &CFGBLDDEF_RULE_ALLOW_RANGE => [WAIT_TIME_MINIMUM, 86400], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + }, + }, + + &CFGOPT_BUFFER_SIZE => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_DEFAULT => COMMON_IO_BUFFER_MAX, + &CFGBLDDEF_RULE_ALLOW_LIST => + [ + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN, + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 2, + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 4, + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 8, + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 16, + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 32, + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 64, + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 128, + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 256, + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 512, + &CFGDEF_DEFAULT_BUFFER_SIZE_MIN * 1024, + ], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + } + }, + + &CFGOPT_DB_TIMEOUT => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_FLOAT, + &CFGBLDDEF_RULE_DEFAULT => CFGDEF_DEFAULT_DB_TIMEOUT, + &CFGBLDDEF_RULE_ALLOW_RANGE => [CFGDEF_DEFAULT_DB_TIMEOUT_MIN, CFGDEF_DEFAULT_DB_TIMEOUT_MAX], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + } + }, + + &CFGOPT_COMPRESS => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => true, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_RESTORE => {}, + } + }, + + &CFGOPT_COMPRESS_LEVEL => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_DEFAULT => 6, + &CFGBLDDEF_RULE_ALLOW_RANGE => [CFGDEF_DEFAULT_COMPRESS_LEVEL_MIN, CFGDEF_DEFAULT_COMPRESS_LEVEL_MAX], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + } + }, + + &CFGOPT_COMPRESS_LEVEL_NETWORK => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_DEFAULT => 3, + &CFGBLDDEF_RULE_ALLOW_RANGE => [CFGDEF_DEFAULT_COMPRESS_LEVEL_MIN, CFGDEF_DEFAULT_COMPRESS_LEVEL_MAX], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + } + }, + + &CFGOPT_NEUTRAL_UMASK => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => true, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + } + }, + + &CFGOPT_CMD_SSH => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => 'ssh', + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + }, + }, + + &CFGOPT_LOCK_PATH => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => '/tmp/' . BACKREST_EXE, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + }, + }, + + &CFGOPT_LOG_PATH => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => '/var/log/' . BACKREST_EXE, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + }, + }, + + &CFGOPT_PROTOCOL_TIMEOUT => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_FLOAT, + &CFGBLDDEF_RULE_DEFAULT => CFGDEF_DEFAULT_DB_TIMEOUT + 30, + &CFGBLDDEF_RULE_ALLOW_RANGE => [CFGDEF_DEFAULT_DB_TIMEOUT_MIN, CFGDEF_DEFAULT_DB_TIMEOUT_MAX], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + } + }, + + &CFGOPT_REPO_PATH => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => '/var/lib/' . BACKREST_EXE, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + }, + }, + + &CFGOPT_REPO_S3_BUCKET => + { + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_REPO_TYPE, + &CFGBLDDEF_RULE_DEPEND_LIST => [CFGOPTVAL_REPO_TYPE_S3], + }, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_REPO_TYPE, + }, + + &CFGOPT_REPO_S3_CA_FILE => &CFGOPT_REPO_S3_HOST, + &CFGOPT_REPO_S3_CA_PATH => &CFGOPT_REPO_S3_HOST, + + &CFGOPT_REPO_S3_KEY => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_SECURE => true, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_REPO_TYPE, + &CFGBLDDEF_RULE_DEPEND_LIST => [CFGOPTVAL_REPO_TYPE_S3], + }, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_REPO_TYPE, + }, + + &CFGOPT_REPO_S3_KEY_SECRET => CFGOPT_REPO_S3_KEY, + + &CFGOPT_REPO_S3_ENDPOINT => CFGOPT_REPO_S3_BUCKET, + + &CFGOPT_REPO_S3_HOST => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_DEPEND => CFGOPT_REPO_S3_BUCKET, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_REPO_TYPE, + }, + + &CFGOPT_REPO_S3_REGION => CFGOPT_REPO_S3_BUCKET, + + &CFGOPT_REPO_S3_VERIFY_SSL => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => true, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_REPO_TYPE, + &CFGBLDDEF_RULE_DEPEND => CFGOPT_REPO_S3_BUCKET, + }, + + &CFGOPT_REPO_TYPE => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => CFGOPTVAL_REPO_TYPE_POSIX, + &CFGBLDDEF_RULE_ALLOW_LIST => + [ + &CFGOPTVAL_REPO_TYPE_CIFS, + &CFGOPTVAL_REPO_TYPE_POSIX, + &CFGOPTVAL_REPO_TYPE_S3, + ], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + }, + }, + + &CFGOPT_SPOOL_PATH => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => '/var/spool/' . BACKREST_EXE, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_PUSH => {}, + }, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_ARCHIVE_ASYNC, + &CFGBLDDEF_RULE_DEPEND_LIST => [true], + }, + }, + + &CFGOPT_PROCESS_MAX => + { + &CFGBLDDEF_RULE_ALT_NAME => 'thread-max', + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_DEFAULT => 1, + &CFGBLDDEF_RULE_ALLOW_RANGE => [1, 96], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_RESTORE => {}, + } + }, + + # Logging options + #------------------------------------------------------------------------------------------------------------------------------- + &CFGOPT_LOG_LEVEL_CONSOLE => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => lc(WARN), + &CFGBLDDEF_RULE_ALLOW_LIST => + [ + lc(OFF), + lc(ERROR), + lc(WARN), + lc(INFO), + lc(DETAIL), + lc(DEBUG), + lc(TRACE), + ], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_INFO => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + } + }, + + &CFGOPT_LOG_LEVEL_FILE => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => lc(INFO), + &CFGBLDDEF_RULE_ALLOW_LIST => CFGOPT_LOG_LEVEL_CONSOLE, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_LOG_LEVEL_CONSOLE, + }, + + &CFGOPT_LOG_LEVEL_STDERR => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => lc(WARN), + &CFGBLDDEF_RULE_ALLOW_LIST => CFGOPT_LOG_LEVEL_CONSOLE, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + } + }, + + &CFGOPT_LOG_TIMESTAMP => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => true, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_LOG_LEVEL_CONSOLE, + }, + + # Archive options + #------------------------------------------------------------------------------------------------------------------------------- + &CFGOPT_ARCHIVE_ASYNC => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_PUSH => {}, + } + }, + + # Deprecated and to be removed + &CFGOPT_ARCHIVE_MAX_MB => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_PUSH => {}, + } + }, + + &CFGOPT_ARCHIVE_QUEUE_MAX => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_PUSH => {}, + }, + }, + + # Backup options + #------------------------------------------------------------------------------------------------------------------------------- + &CFGOPT_ARCHIVE_CHECK => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => true, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_ONLINE, + &CFGBLDDEF_RULE_DEPEND_LIST => [true], + }, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + }, + }, + + &CFGOPT_ARCHIVE_COPY => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => + { + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_ARCHIVE_CHECK, + &CFGBLDDEF_RULE_DEPEND_LIST => [true], + } + } + } + }, + + &CFGOPT_BACKUP_CMD => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_BACKUP_HOST, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_BACKUP_HOST + }, + }, + + &CFGOPT_BACKUP_CONFIG => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => CFGDEF_DEFAULT_CONFIG, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_BACKUP_HOST, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_BACKUP_HOST + }, + }, + + &CFGOPT_BACKUP_HOST => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => {}, + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_INFO => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + }, + }, + + &CFGOPT_BACKUP_SSH_PORT => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_BACKUP_HOST, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_BACKUP_HOST + } + }, + + &CFGOPT_BACKUP_STANDBY => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + }, + }, + + &CFGOPT_BACKUP_USER => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => 'backrest', + &CFGBLDDEF_RULE_COMMAND => CFGOPT_BACKUP_HOST, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_BACKUP_HOST + } + }, + + &CFGOPT_CHECKSUM_PAGE => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + } + }, + + &CFGOPT_HARDLINK => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + } + }, + + &CFGOPT_MANIFEST_SAVE_THRESHOLD => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_DEFAULT => 1073741824, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + } + }, + + &CFGOPT_RESUME => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => true, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + } + }, + + &CFGOPT_START_FAST => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + } + }, + + &CFGOPT_STOP_AUTO => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + } + }, + + # Expire options + #------------------------------------------------------------------------------------------------------------------------------- + &CFGOPT_RETENTION_ARCHIVE => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_ALLOW_RANGE => [CFGDEF_DEFAULT_RETENTION_MIN, CFGDEF_DEFAULT_RETENTION_MAX], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_EXPIRE => {}, + } + }, + + &CFGOPT_RETENTION_ARCHIVE_TYPE => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => CFGOPTVAL_BACKUP_TYPE_FULL, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_EXPIRE => {}, + }, + &CFGBLDDEF_RULE_ALLOW_LIST => + [ + &CFGOPTVAL_BACKUP_TYPE_FULL, + &CFGOPTVAL_BACKUP_TYPE_DIFF, + &CFGOPTVAL_BACKUP_TYPE_INCR, + ] + }, + + &CFGOPT_RETENTION_DIFF => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_ALLOW_RANGE => [CFGDEF_DEFAULT_RETENTION_MIN, CFGDEF_DEFAULT_RETENTION_MAX], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_EXPIRE => {}, + } + }, + + &CFGOPT_RETENTION_FULL => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_ALLOW_RANGE => [CFGDEF_DEFAULT_RETENTION_MIN, CFGDEF_DEFAULT_RETENTION_MAX], + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_EXPIRE => {}, + } + }, + + # Restore options + #------------------------------------------------------------------------------------------------------------------------------- + &CFGOPT_DB_INCLUDE => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_HASH, + &CFGBLDDEF_RULE_HASH_VALUE => false, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => {}, + }, + }, + + &CFGOPT_LINK_ALL => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_BOOLEAN, + &CFGBLDDEF_RULE_DEFAULT => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => {}, + } + }, + + &CFGOPT_LINK_MAP => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_HASH, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => {}, + }, + }, + + &CFGOPT_TABLESPACE_MAP_ALL => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => {}, + } + }, + + &CFGOPT_TABLESPACE_MAP => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_HASH, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => {}, + }, + }, + + &CFGOPT_RECOVERY_OPTION => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_HASH, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_RESTORE => {}, + }, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_TYPE, + &CFGBLDDEF_RULE_DEPEND_LIST => + [ + &CFGOPTVAL_RESTORE_TYPE_DEFAULT, + &CFGOPTVAL_RESTORE_TYPE_NAME, + &CFGOPTVAL_RESTORE_TYPE_TIME, + &CFGOPTVAL_RESTORE_TYPE_XID, + ], + }, + }, + + # Stanza options + #------------------------------------------------------------------------------------------------------------------------------- + &CFGOPT_DB_CMD => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_PREFIX => CFGDEF_PREFIX_DB, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + }, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_DB_HOST + }, + }, + + &CFGOPT_DB_CONFIG => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_GLOBAL, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_PREFIX => CFGDEF_PREFIX_DB, + &CFGBLDDEF_RULE_DEFAULT => CFGDEF_DEFAULT_CONFIG, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + }, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_DB_HOST + }, + }, + + &CFGOPT_DB_HOST => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_STANZA, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_PREFIX => CFGDEF_PREFIX_DB, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_PUSH => {}, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_EXPIRE => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + &CFGCMD_START => {}, + &CFGCMD_STOP => {}, + } + }, + + &CFGOPT_DB_PATH => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_STANZA, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_PREFIX => CFGDEF_PREFIX_DB, + &CFGBLDDEF_RULE_REQUIRED => true, + &CFGBLDDEF_RULE_HINT => "does this stanza exist?", + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_ARCHIVE_GET => + { + &CFGBLDDEF_RULE_REQUIRED => false + }, + &CFGCMD_ARCHIVE_PUSH => + { + &CFGBLDDEF_RULE_REQUIRED => false + }, + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_LOCAL => + { + &CFGBLDDEF_RULE_REQUIRED => false + }, + &CFGCMD_REMOTE => + { + &CFGBLDDEF_RULE_REQUIRED => false + }, + &CFGCMD_RESTORE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + }, + }, + + &CFGOPT_DB_PORT => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_STANZA, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_PREFIX => CFGDEF_PREFIX_DB, + &CFGBLDDEF_RULE_DEFAULT => 5432, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + } + }, + + &CFGOPT_DB_SSH_PORT => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_STANZA, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_INTEGER, + &CFGBLDDEF_RULE_PREFIX => CFGDEF_PREFIX_DB, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => CFGOPT_DB_HOST, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_DB_HOST + }, + }, + + &CFGOPT_DB_SOCKET_PATH => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_STANZA, + &CFGBLDDEF_RULE_PREFIX => CFGDEF_PREFIX_DB, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_REMOTE => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + } + }, + + &CFGOPT_DB_USER => + { + &CFGBLDDEF_RULE_SECTION => CFGDEF_SECTION_STANZA, + &CFGBLDDEF_RULE_PREFIX => CFGDEF_PREFIX_DB, + &CFGBLDDEF_RULE_TYPE => CFGOPTDEF_TYPE_STRING, + &CFGBLDDEF_RULE_DEFAULT => 'postgres', + &CFGBLDDEF_RULE_COMMAND => + { + &CFGCMD_BACKUP => {}, + &CFGCMD_CHECK => {}, + &CFGCMD_LOCAL => {}, + &CFGCMD_STANZA_CREATE => {}, + &CFGCMD_STANZA_UPGRADE => {}, + }, + &CFGBLDDEF_RULE_REQUIRED => false, + &CFGBLDDEF_RULE_DEPEND => + { + &CFGBLDDEF_RULE_DEPEND_OPTION => CFGOPT_DB_HOST + }, + }, +); + +#################################################################################################################################### +# Process rule defaults +#################################################################################################################################### +foreach my $strKey (sort(keys(%hOptionRule))) +{ + # If the rule is a scalar then copy the entire rule from the referenced option + if (!ref($hOptionRule{$strKey})) + { + $hOptionRule{$strKey} = dclone($hOptionRule{$hOptionRule{$strKey}}); + } + + # If the command section is a scalar then copy the section from the referenced option + if (defined($hOptionRule{$strKey}{&CFGBLDDEF_RULE_COMMAND}) && !ref($hOptionRule{$strKey}{&CFGBLDDEF_RULE_COMMAND})) + { + $hOptionRule{$strKey}{&CFGBLDDEF_RULE_COMMAND} = + dclone($hOptionRule{$hOptionRule{$strKey}{&CFGBLDDEF_RULE_COMMAND}}{&CFGBLDDEF_RULE_COMMAND}); + } + + # If the required section is a scalar then copy the section from the referenced option + if (defined($hOptionRule{$strKey}{&CFGBLDDEF_RULE_DEPEND}) && !ref($hOptionRule{$strKey}{&CFGBLDDEF_RULE_DEPEND})) + { + $hOptionRule{$strKey}{&CFGBLDDEF_RULE_DEPEND} = + dclone($hOptionRule{$hOptionRule{$strKey}{&CFGBLDDEF_RULE_DEPEND}}{&CFGBLDDEF_RULE_DEPEND}); + } + + # If the allow list is a scalar then copy the list from the referenced option + if (defined($hOptionRule{$strKey}{&CFGBLDDEF_RULE_ALLOW_LIST}) && !ref($hOptionRule{$strKey}{&CFGBLDDEF_RULE_ALLOW_LIST})) + { + $hOptionRule{$strKey}{&CFGBLDDEF_RULE_ALLOW_LIST} = + dclone($hOptionRule{$hOptionRule{$strKey}{&CFGBLDDEF_RULE_ALLOW_LIST}}{&CFGBLDDEF_RULE_ALLOW_LIST}); + } + + # Default type is string + if (!defined($hOptionRule{$strKey}{&CFGBLDDEF_RULE_TYPE})) + { + &log(ASSERT, "type is required for option '${strKey}'"); + } + + # Hash types by default have hash values (rather than just a boolean list) + if (!defined($hOptionRule{$strKey}{&CFGBLDDEF_RULE_HASH_VALUE})) + { + $hOptionRule{$strKey}{&CFGBLDDEF_RULE_HASH_VALUE} = + $hOptionRule{$strKey}{&CFGBLDDEF_RULE_TYPE} eq CFGOPTDEF_TYPE_HASH ? true : false; + } + + # All boolean config options can be negated. Boolean command-line options must be marked for negation individually. + if ($hOptionRule{$strKey}{&CFGBLDDEF_RULE_TYPE} eq CFGOPTDEF_TYPE_BOOLEAN && + defined($hOptionRule{$strKey}{&CFGBLDDEF_RULE_SECTION})) + { + $hOptionRule{$strKey}{&CFGBLDDEF_RULE_NEGATE} = true; + } + + # Default for negation is false + if (!defined($hOptionRule{$strKey}{&CFGBLDDEF_RULE_NEGATE})) + { + $hOptionRule{$strKey}{&CFGBLDDEF_RULE_NEGATE} = false; + } + + # By default options are not secure + if (!defined($hOptionRule{$strKey}{&CFGBLDDEF_RULE_SECURE})) + { + $hOptionRule{$strKey}{&CFGBLDDEF_RULE_SECURE} = false; + } + + # Set all indices to 1 by default - this defines how many copies of any option there can be + if (!defined($hOptionRule{$strKey}{&CFGBLDDEF_RULE_INDEX})) + { + $hOptionRule{$strKey}{&CFGBLDDEF_RULE_INDEX} = 1; + } +} + +#################################################################################################################################### +# Generate indexed rules +#################################################################################################################################### +my $rhOptionRuleIndex = dclone(\%hOptionRule); + +foreach my $strKey (sort(keys(%{$rhOptionRuleIndex}))) +{ + # Build options for all possible db configurations + if (defined($rhOptionRuleIndex->{$strKey}{&CFGBLDDEF_RULE_PREFIX}) && + $rhOptionRuleIndex->{$strKey}{&CFGBLDDEF_RULE_PREFIX} eq CFGDEF_PREFIX_DB) + { + my $strPrefix = $rhOptionRuleIndex->{$strKey}{&CFGBLDDEF_RULE_PREFIX}; + $rhOptionRuleIndex->{$strKey}{&CFGBLDDEF_RULE_INDEX} = CFGDEF_INDEX_DB; + + for (my $iIndex = 1; $iIndex <= CFGDEF_INDEX_DB; $iIndex++) + { + my $strKeyNew = "${strPrefix}${iIndex}" . substr($strKey, length($strPrefix)); + + $rhOptionRuleIndex->{$strKeyNew} = dclone($rhOptionRuleIndex->{$strKey}); + + # Create the alternate name for option index 1 + if ($iIndex == 1) + { + $rhOptionRuleIndex->{$strKeyNew}{&CFGBLDDEF_RULE_ALT_NAME} = $strKey; + } + else + { + $rhOptionRuleIndex->{$strKeyNew}{&CFGBLDDEF_RULE_REQUIRED} = false; + } + + if (defined($rhOptionRuleIndex->{$strKeyNew}{&CFGBLDDEF_RULE_DEPEND}) && + defined($rhOptionRuleIndex->{$strKeyNew}{&CFGBLDDEF_RULE_DEPEND}{&CFGBLDDEF_RULE_DEPEND_OPTION})) + { + $rhOptionRuleIndex->{$strKeyNew}{&CFGBLDDEF_RULE_DEPEND}{&CFGBLDDEF_RULE_DEPEND_OPTION} = + "${strPrefix}${iIndex}" . + substr( + $rhOptionRuleIndex->{$strKeyNew}{&CFGBLDDEF_RULE_DEPEND}{&CFGBLDDEF_RULE_DEPEND_OPTION}, + length($strPrefix)); + } + } + + delete($rhOptionRuleIndex->{$strKey}); + } +} + +#################################################################################################################################### +# cfgdefRule - get option rules without indexed options +#################################################################################################################################### +sub cfgdefRule +{ + return dclone(\%hOptionRule); +} + +push @EXPORT, qw(cfgdefRule); + +#################################################################################################################################### +# cfgdefRuleIndex - get option rules +#################################################################################################################################### +sub cfgdefRuleIndex +{ + return dclone($rhOptionRuleIndex); +} + +push @EXPORT, qw(cfgdefRuleIndex); + +1; diff --git a/lib/pgBackRest/Config/LoadFailback.pm b/lib/pgBackRest/Config/LoadFailback.pm new file mode 100644 index 000000000..2b99cec7c --- /dev/null +++ b/lib/pgBackRest/Config/LoadFailback.pm @@ -0,0 +1,37 @@ +#################################################################################################################################### +# Load C or Perl Config Code +#################################################################################################################################### +package pgBackRest::Config::LoadFailback; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Exporter qw(import); + our @EXPORT = qw(); + +use pgBackRest::Common::Log; +use pgBackRest::LibCLoad; + +#################################################################################################################################### +# Load the C library if present, else failback to the Perl code +#################################################################################################################################### +if (libC()) +{ + require pgBackRest::LibC; + pgBackRest::LibC->import(qw(:config :configRule)); + push(@EXPORT, @{$pgBackRest::LibC::EXPORT_TAGS{config}}); + push(@EXPORT, @{$pgBackRest::LibC::EXPORT_TAGS{configRule}}); +} +else +{ + require pgBackRest::Config::Data; + pgBackRest::Config::Data->import(); + push(@EXPORT, @pgBackRest::Config::Data::EXPORT); + + require pgBackRest::Config::Rule; + pgBackRest::Config::Rule->import(); + push(@EXPORT, @pgBackRest::Config::Rule::EXPORT); +} + +1; diff --git a/lib/pgBackRest/Config/Rule.pm b/lib/pgBackRest/Config/Rule.pm new file mode 100644 index 000000000..c25cef19a --- /dev/null +++ b/lib/pgBackRest/Config/Rule.pm @@ -0,0 +1,526 @@ +#################################################################################################################################### +# Configuration Rule Interface +#################################################################################################################################### +package pgBackRest::Config::Rule; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Exporter qw(import); + our @EXPORT = qw(); + +use pgBackRest::Common::Exception; +use pgBackRest::Common::Log; +use pgBackRest::Config::Data; + +#################################################################################################################################### +# Copy indexed rules locally +#################################################################################################################################### +my $rhOptionRuleIndex = cfgdefRuleIndex(); +my $iOptionTotal = scalar(keys(%{$rhOptionRuleIndex})); + +#################################################################################################################################### +# Create maps to convert option ids to names and vice versa +#################################################################################################################################### +my $rhOptionNameId; +my $rhOptionIdName; +my $rhOptionNameAlt; + +{ + my $iIndex = 0; + + foreach my $strOption (sort(keys(%{$rhOptionRuleIndex}))) + { + $rhOptionNameId->{$strOption} = $iIndex; + $rhOptionNameAlt->{$strOption} = $strOption; + $rhOptionIdName->{$iIndex} = $strOption; + + if (defined(cfgRuleOptionNameAlt($strOption))) + { + $rhOptionNameId->{cfgRuleOptionNameAlt($strOption)} = $iIndex; + $rhOptionNameAlt->{cfgRuleOptionNameAlt($strOption)} = $strOption; + } + + $iIndex++; + } +} + +#################################################################################################################################### +# cfgOptionRule - get a rule for the option from a command or default +#################################################################################################################################### +sub cfgOptionRule +{ + my $strCommand = shift; + my $strOption = shift; + my $strRule = shift; + + return + defined($rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_COMMAND}{$strCommand}{$strRule}) ? + $rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_COMMAND}{$strCommand}{$strRule} : + $rhOptionRuleIndex->{$strOption}{$strRule}; +} + +#################################################################################################################################### +# Functions that are noops in the Perl code since commands/options are always treated as strings +#################################################################################################################################### +sub cfgCommandId {return shift()} +sub cfgCommandName {return shift()} + +sub cfgOptionId +{ + my $strOptionName = shift; + + if (!defined($rhOptionNameId->{$strOptionName})) + { + return -1; + } + + return $rhOptionNameAlt->{$strOptionName}; +} + +sub cfgOptionName +{ + my $strOptionId = shift; + + if (defined($rhOptionIdName->{$strOptionId})) + { + return $rhOptionIdName->{$strOptionId}; + } + + return $rhOptionNameAlt->{$strOptionId}; +} + +push @EXPORT, qw(cfgCommandId cfgCommandName cfgOptionId cfgOptionName); + +#################################################################################################################################### +# cfgOptionTotal - total number of options +#################################################################################################################################### +sub cfgOptionTotal +{ + return $iOptionTotal; +} + +push @EXPORT, qw(cfgOptionTotal); + +#################################################################################################################################### +# cfgRuleOptionAllowList - does the option have a specific list of allowed values? +#################################################################################################################################### +sub cfgRuleOptionAllowList +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + my $bError = shift; + + my $rhAllowList = cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_ALLOW_LIST); + + if (!defined($rhAllowList) && defined($bError) && $bError) + { + confess &log(ASSERT, "allow list not set for ${strCommand}, ${strOption}"); + } + + # The allow list must have values + if (defined($rhAllowList) && @{$rhAllowList} == 0) + { + confess &log(ASSERT, "allow list must have values for ${strCommand}, ${strOption}"); + } + + return defined($rhAllowList) ? true : false; +} + +push @EXPORT, qw(cfgRuleOptionAllowList); + +#################################################################################################################################### +# cfgRuleOptionAllowListValue - get an allow list value +#################################################################################################################################### +sub cfgRuleOptionAllowListValue +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + my $iValueIdx = shift; + + # Index shouldn't be greater than the total number of values + if ($iValueIdx >= cfgRuleOptionAllowListValueTotal($strCommand, $strOption, $iValueIdx)) + { + confess &log(ASSERT, "invalid allow list value index ${iValueIdx} for ${strCommand}, ${strOption}"); + } + + # Return value + return cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_ALLOW_LIST)->[$iValueIdx]; +} + +push @EXPORT, qw(cfgRuleOptionAllowListValue); + +#################################################################################################################################### +# cfgRuleOptionAllowListValueTotal - how many values are allowed for the option? +#################################################################################################################################### +sub cfgRuleOptionAllowListValueTotal +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + + # Make sure the allow list exists + cfgRuleOptionAllowList($strCommand, $strOption, true); + + # Return total elements in the list + return scalar(@{cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_ALLOW_LIST)}); +} + +push @EXPORT, qw(cfgRuleOptionAllowListValueTotal); + +#################################################################################################################################### +# cfgRuleOptionAllowListValueValid - is the value valid for this option? +#################################################################################################################################### +sub cfgRuleOptionAllowListValueValid +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + my $strValue = shift; + + # Make sure the allow list exists + cfgRuleOptionAllowList($strCommand, $strOption, true); + + # Check if the value is valid + foreach my $strValueMatch (@{cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_ALLOW_LIST)}) + { + if ($strValue eq $strValueMatch) + { + return true; + } + } + + return false; +} + +push @EXPORT, qw(cfgRuleOptionAllowListValueValid); + +#################################################################################################################################### +# cfgRuleOptionAllowRange - does the option have min/max values? +#################################################################################################################################### +sub cfgRuleOptionAllowRange +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + my $bError = shift; + + my $rhAllowRange = cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_ALLOW_RANGE); + + if (!defined($rhAllowRange) && defined($bError) && $bError) + { + confess &log(ASSERT, "allow range not set for ${strCommand}, ${strOption}"); + } + + # The allow range must have two values + if (defined($rhAllowRange) && @{$rhAllowRange} != 2) + { + confess &log(ASSERT, "allow range must have two values for ${strCommand}, ${strOption}"); + } + + return defined($rhAllowRange) ? true : false; +} + +push @EXPORT, qw(cfgRuleOptionAllowRange); + +#################################################################################################################################### +# cfgRuleOptionAllowRangeMax - get max value in allowed range +#################################################################################################################################### +sub cfgRuleOptionAllowRangeMax +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + + # Make sure the allow range exists + cfgRuleOptionAllowRange($strCommand, $strOption); + + # Return value + return cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_ALLOW_RANGE)->[1]; +} + +push @EXPORT, qw(cfgRuleOptionAllowRangeMax); + +#################################################################################################################################### +# cfgRuleOptionAllowRangeMin - get min value in allowed range +#################################################################################################################################### +sub cfgRuleOptionAllowRangeMin +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + + # Make sure the allow range exists + cfgRuleOptionAllowRange($strCommand, $strOption); + + # Return value + return cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_ALLOW_RANGE)->[0]; +} + +push @EXPORT, qw(cfgRuleOptionAllowRangeMin); + +#################################################################################################################################### +# cfgRuleOptionDefault - option default, if any +#################################################################################################################################### +sub cfgRuleOptionDefault +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + + return cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_DEFAULT); +} + +push @EXPORT, qw(cfgRuleOptionDefault); + +#################################################################################################################################### +# cfgRuleOptionDepend - does the option depend on another option being set or having a certain value? +#################################################################################################################################### +sub cfgRuleOptionDepend +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + my $bError = shift; + + my $rhDepend = cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_DEPEND); + + if (!defined($rhDepend) && defined($bError) && $bError) + { + confess &log(ASSERT, "depend rule not set for ${strCommand}, ${strOption}"); + } + + return defined($rhDepend) ? true : false; +} + +push @EXPORT, qw(cfgRuleOptionDepend); + +#################################################################################################################################### +# cfgRuleOptionDependOption - name of the option that this option depends on +#################################################################################################################################### +sub cfgRuleOptionDependOption +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + + # Make sure the depend rule exists + cfgRuleOptionDepend($strCommand, $strOption, true); + + # Error if the depend option does not exist + my $rhDepend = cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_DEPEND); + + if (!defined($rhDepend->{&CFGBLDDEF_RULE_DEPEND_OPTION})) + { + confess &log(ASSERT, "depend rule option not set for ${strCommand}, ${strOption}"); + } + + return $rhDepend->{&CFGBLDDEF_RULE_DEPEND_OPTION}; +} + +push @EXPORT, qw(cfgRuleOptionDependOption); + +#################################################################################################################################### +# cfgRuleOptionDependValue - get a depend option value +#################################################################################################################################### +sub cfgRuleOptionDependValue +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + my $iValueIdx = shift; + + # Index shouldn't be greater than the total number of values + if ($iValueIdx >= cfgRuleOptionDependValueTotal($strCommand, $strOption, $iValueIdx)) + { + confess &log(ASSERT, "invalid depend value index ${iValueIdx} for ${strCommand}, ${strOption}"); + } + + # Return value + return cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_DEPEND)->{&CFGBLDDEF_RULE_DEPEND_LIST}->[$iValueIdx]; +} + +push @EXPORT, qw(cfgRuleOptionDependValue); + +#################################################################################################################################### +# cfgRuleOptionDependValueTotal - how many values are allowed for the depend option? +# +# 0 indicates that the value of the depend option doesn't matter, only that is is set. +#################################################################################################################################### +sub cfgRuleOptionDependValueTotal +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + + # Make sure the depend rule exists + cfgRuleOptionDepend($strCommand, $strOption, true); + + # It's OK for the list not to be defined + my $rhDepend = cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_DEPEND); + + if (!defined($rhDepend->{&CFGBLDDEF_RULE_DEPEND_LIST})) + { + return 0; + } + + # Return total elements in the list + return scalar(@{$rhDepend->{&CFGBLDDEF_RULE_DEPEND_LIST}}); +} + +push @EXPORT, qw(cfgRuleOptionDependValueTotal); + +#################################################################################################################################### +# cfgRuleOptionDependValueValid - is the depend valid valid? +#################################################################################################################################### +sub cfgRuleOptionDependValueValid +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + my $strValue = shift; + + # Make sure the depend rule exists + cfgRuleOptionDepend($strCommand, $strOption, true); + + # Check if the value is valid + foreach my $strValueMatch (@{cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_DEPEND)->{&CFGBLDDEF_RULE_DEPEND_LIST}}) + { + if ($strValue eq $strValueMatch) + { + return true; + } + } + + return false; +} + +push @EXPORT, qw(cfgRuleOptionDependValueValid); + +#################################################################################################################################### +# cfgRuleOptionHint - option hint, if any +#################################################################################################################################### +sub cfgRuleOptionHint +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + + return cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_HINT); +} + +push @EXPORT, qw(cfgRuleOptionHint); + +#################################################################################################################################### +# cfgOptionIndexTotal - max index for options that are indexed (e.g., db) +#################################################################################################################################### +sub cfgOptionIndexTotal +{ + my $strOption = cfgOptionName(shift); + + return $rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_INDEX}; +} + +push @EXPORT, qw(cfgOptionIndexTotal); + +#################################################################################################################################### +# cfgRuleOptionNameAlt - alternative or deprecated option name +#################################################################################################################################### +sub cfgRuleOptionNameAlt +{ + my $strOption = cfgOptionName(shift); + + return $rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_ALT_NAME}; +} + +push @EXPORT, qw(cfgRuleOptionNameAlt); + +#################################################################################################################################### +# cfgRuleOptionNegate - is the boolean option negatable? +#################################################################################################################################### +sub cfgRuleOptionNegate +{ + my $strOption = cfgOptionName(shift); + + return $rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_NEGATE}; +} + +push @EXPORT, qw(cfgRuleOptionNegate); + +#################################################################################################################################### +# cfgRuleOptionPrefix - fixed prefix for indexed options +#################################################################################################################################### +sub cfgRuleOptionPrefix +{ + my $strOption = cfgOptionName(shift); + + return $rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_PREFIX}; +} + +push @EXPORT, qw(cfgRuleOptionPrefix); + +#################################################################################################################################### +# cfgRuleOptionRequired - is the option required? +#################################################################################################################################### +sub cfgRuleOptionRequired +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + + my $rxRule = cfgOptionRule($strCommand, $strOption, CFGBLDDEF_RULE_REQUIRED); + return defined($rxRule) ? $rxRule : true; +} + +push @EXPORT, qw(cfgRuleOptionRequired); + +#################################################################################################################################### +# cfgRuleOptionSection - section to contain optio (global or stanza), all others are command-line only +#################################################################################################################################### +sub cfgRuleOptionSection +{ + my $strOption = cfgOptionName(shift); + + return $rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_SECTION}; +} + +push @EXPORT, qw(cfgRuleOptionSection); + +#################################################################################################################################### +# cfgRuleOptionSecure - can the option be passed on the command-line? +#################################################################################################################################### +sub cfgRuleOptionSecure +{ + my $strOption = cfgOptionName(shift); + + return $rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_SECURE}; +} + +push @EXPORT, qw(cfgRuleOptionSecure); + +#################################################################################################################################### +# cfgRuleOptionType - data type of the option (e.g. boolean, string) +#################################################################################################################################### +sub cfgRuleOptionType +{ + my $strOption = cfgOptionName(shift); + + return $rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_TYPE}; +} + +push @EXPORT, qw(cfgRuleOptionType); + +#################################################################################################################################### +# cfgRuleOptionValid - is the option valid for the command? +#################################################################################################################################### +sub cfgRuleOptionValid +{ + my $strCommand = shift; + my $strOption = cfgOptionName(shift); + + return defined($rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_COMMAND}{$strCommand}) ? true : false; +} + +push @EXPORT, qw(cfgRuleOptionValid); + +#################################################################################################################################### +# cfgRuleOptionValueHash - is the option a true hash or just a list of keys? +#################################################################################################################################### +sub cfgRuleOptionValueHash +{ + my $strOption = cfgOptionName(shift); + + return $rhOptionRuleIndex->{$strOption}{&CFGBLDDEF_RULE_HASH_VALUE}; +} + +push @EXPORT, qw(cfgRuleOptionValueHash); + +1; diff --git a/lib/pgBackRest/Db.pm b/lib/pgBackRest/Db.pm index d7fedf0fe..0bc999b26 100644 --- a/lib/pgBackRest/Db.pm +++ b/lib/pgBackRest/Db.pm @@ -85,11 +85,11 @@ sub new if (defined($self->{iRemoteIdx})) { - $self->{strDbPath} = optionGet(optionIndex(OPTION_DB_PATH, $self->{iRemoteIdx})); + $self->{strDbPath} = cfgOption(cfgOptionIndex(CFGOPT_DB_PATH, $self->{iRemoteIdx})); if (!isDbLocal({iRemoteIdx => $self->{iRemoteIdx}})) { - $self->{oProtocol} = protocolGet(DB, $self->{iRemoteIdx}); + $self->{oProtocol} = protocolGet(CFGOPTVAL_REMOTE_TYPE_DB, $self->{iRemoteIdx}); } } @@ -157,17 +157,17 @@ sub connect # Connect to the db my $strDbName = 'postgres'; my $strDbUser = getpwuid($<); - my $strDbSocketPath = optionGet(optionIndex(OPTION_DB_SOCKET_PATH, $self->{iRemoteIdx}), false); + my $strDbSocketPath = cfgOption(cfgOptionIndex(CFGOPT_DB_SOCKET_PATH, $self->{iRemoteIdx}), false); # Make sure the socket path is absolute if (defined($strDbSocketPath) && $strDbSocketPath !~ /^\//) { - confess &log(ERROR, "'${strDbSocketPath}' is not valid for '" . OPTION_DB_SOCKET_PATH . "' option:" . + confess &log(ERROR, "'${strDbSocketPath}' is not valid for '" . cfgOptionName(CFGOPT_DB_SOCKET_PATH) . "' option:" . " path must be absolute", ERROR_OPTION_INVALID_VALUE); } # Construct the URI - my $strDbUri = "dbi:Pg:dbname=${strDbName};port=" . optionGet(optionIndex(OPTION_DB_PORT, $self->{iRemoteIdx})) . + my $strDbUri = "dbi:Pg:dbname=${strDbName};port=" . cfgOption(cfgOptionIndex(CFGOPT_DB_PORT, $self->{iRemoteIdx})) . (defined($strDbSocketPath) ? ";host=${strDbSocketPath}" : ''); logDebugMisc @@ -203,7 +203,7 @@ sub connect { $self->{hDb}->do( "set application_name = '" . BACKREST_NAME . ' [' . - (optionValid(OPTION_COMMAND) ? optionGet(OPTION_COMMAND) : commandGet()) . "]'") + (cfgOptionValid(CFGOPT_COMMAND) ? cfgOption(CFGOPT_COMMAND) : cfgCommandName(cfgCommandGet())) . "]'") or confess &log(ERROR, $self->{hDb}->errstr, ERROR_DB_QUERY); } } @@ -264,7 +264,7 @@ sub executeSql or confess &log(ERROR, $DBI::errstr. ":\n${strSql}", ERROR_DB_QUERY); # Wait for the query to return - my $oWait = waitInit(optionGet(OPTION_DB_TIMEOUT)); + my $oWait = waitInit(cfgOption(CFGOPT_DB_TIMEOUT)); my $bTimeout = true; do @@ -599,7 +599,7 @@ sub backupStart # Only allow start-fast option for version >= 8.4 if ($self->{strDbVersion} < PG_VERSION_84 && $bStartFast) { - &log(WARN, OPTION_START_FAST . ' option is only available in PostgreSQL >= ' . PG_VERSION_84); + &log(WARN, cfgOptionName(CFGOPT_START_FAST) . ' option is only available in PostgreSQL >= ' . PG_VERSION_84); $bStartFast = false; } @@ -608,15 +608,15 @@ sub backupStart $self->executeSqlOne("select count(*) = 1 from pg_settings where name = 'data_checksums' and setting = 'on'"); # If checksum page option is not explictly set then set it to whatever the database says - if (!optionTest(OPTION_CHECKSUM_PAGE)) + if (!cfgOptionTest(CFGOPT_CHECKSUM_PAGE)) { - optionSet(OPTION_CHECKSUM_PAGE, $bChecksumPage); + cfgOptionSet(CFGOPT_CHECKSUM_PAGE, $bChecksumPage); } # Else if enabled make sure they are in the database as well, else throw a warning - elsif (optionGet(OPTION_CHECKSUM_PAGE) && !$bChecksumPage) + elsif (cfgOption(CFGOPT_CHECKSUM_PAGE) && !$bChecksumPage) { &log(WARN, 'unable to enable page checksums since they are not enabled in the database'); - optionSet(OPTION_CHECKSUM_PAGE, false); + cfgOptionSet(CFGOPT_CHECKSUM_PAGE, false); } # Acquire the backup advisory lock to make sure that backups are not running from multiple backup servers against the same @@ -629,7 +629,7 @@ sub backupStart # If stop-auto is enabled check for a running backup. This feature is not supported for PostgreSQL >= 9.6 since backups are # run in non-exclusive mode. - if (optionGet(OPTION_STOP_AUTO) && $self->{strDbVersion} < PG_VERSION_96) + if (cfgOption(CFGOPT_STOP_AUTO) && $self->{strDbVersion} < PG_VERSION_96) { # Running backups can only be detected in PostgreSQL >= 9.3 if ($self->{strDbVersion} >= PG_VERSION_93) @@ -646,7 +646,7 @@ sub backupStart # generated later on. else { - &log(WARN, OPTION_STOP_AUTO . ' option is only available in PostgreSQL >= ' . PG_VERSION_93); + &log(WARN, cfgOptionName(CFGOPT_STOP_AUTO) . ' option is only available in PostgreSQL >= ' . PG_VERSION_93); } } @@ -749,7 +749,7 @@ sub configValidate } # If cluster is not a standby and archive checking is enabled, then perform various validations - if (!$self->isStandby() && optionValid(OPTION_BACKUP_ARCHIVE_CHECK) && optionGet(OPTION_BACKUP_ARCHIVE_CHECK)) + if (!$self->isStandby() && cfgOptionValid(CFGOPT_ARCHIVE_CHECK) && cfgOption(CFGOPT_ARCHIVE_CHECK)) { my $strArchiveMode = $self->executeSqlOne('show archive_mode'); @@ -873,7 +873,7 @@ sub replayWait pgBackRest::Archive::Common->import(); # Initialize working variables - my $oWait = waitInit(optionGet(OPTION_ARCHIVE_TIMEOUT)); + my $oWait = waitInit(cfgOption(CFGOPT_ARCHIVE_TIMEOUT)); my $bTimeout = true; my $strReplayedLSN = undef; @@ -906,7 +906,7 @@ sub replayWait lsnNormalize($strLastReplayedLSN) gt lsnNormalize($strReplayedLSN) && !waitMore($oWait)) { - $oWait = waitInit(optionGet(OPTION_ARCHIVE_TIMEOUT)); + $oWait = waitInit(cfgOption(CFGOPT_ARCHIVE_TIMEOUT)); } } @@ -971,12 +971,13 @@ sub dbObjectGet # Only iterate databases if online and more than one is defined. It might be better to check the version of each database but # this is simple and works. - if (optionTest(OPTION_ONLINE) && optionGet(OPTION_ONLINE) && optionTest(optionIndex(OPTION_DB_PATH, 2))) + if (cfgOptionTest(CFGOPT_ONLINE) && cfgOption(CFGOPT_ONLINE) && cfgOptionTest(cfgOptionIndex(CFGOPT_DB_PATH, 2))) { - for (my $iRemoteIdx = 1; $iRemoteIdx <= 2; $iRemoteIdx++) + for (my $iRemoteIdx = 1; $iRemoteIdx <= cfgOptionIndexTotal(CFGOPT_DB_HOST); $iRemoteIdx++) { # Make sure a db is defined for this index - if (optionTest(optionIndex(OPTION_DB_PATH, $iRemoteIdx)) || optionTest(optionIndex(OPTION_DB_HOST, $iRemoteIdx))) + if (cfgOptionTest(cfgOptionIndex(CFGOPT_DB_PATH, $iRemoteIdx)) || + cfgOptionTest(cfgOptionIndex(CFGOPT_DB_HOST, $iRemoteIdx))) { # Create the db object my $oDb = new pgBackRest::Db($iRemoteIdx); @@ -990,7 +991,7 @@ sub dbObjectGet if ($oDb->isStandby()) { # If standby backup is requested then use the first standby found - if (optionGet(OPTION_BACKUP_STANDBY) && !defined($oDbStandby)) + if (cfgOption(CFGOPT_BACKUP_STANDBY) && !defined($oDbStandby)) { $oDbStandby = $oDb; $iStandbyIdx = $iRemoteIdx; @@ -1015,13 +1016,13 @@ sub dbObjectGet # If the db was not used then destroy the protocol object underneath it if (!$bAssigned) { - protocolDestroy(DB, $iRemoteIdx, true); + protocolDestroy(CFGOPTVAL_REMOTE_TYPE_DB, $iRemoteIdx, true); } } } # Make sure the standby database is defined when backup from standby requested - if (optionGet(OPTION_BACKUP_STANDBY) && !defined($oDbStandby)) + if (cfgOption(CFGOPT_BACKUP_STANDBY) && !defined($oDbStandby)) { confess &log(ERROR, 'unable to find standby database - cannot proceed'); } diff --git a/lib/pgBackRest/Expire.pm b/lib/pgBackRest/Expire.pm index d1c30c1fe..ea57dce4e 100644 --- a/lib/pgBackRest/Expire.pm +++ b/lib/pgBackRest/Expire.pm @@ -104,10 +104,10 @@ sub process my $oStorageRepo = storageRepo(); my $strBackupClusterPath = $oStorageRepo->pathGet(STORAGE_REPO_BACKUP); - my $iFullRetention = optionGet(OPTION_RETENTION_FULL, false); - my $iDifferentialRetention = optionGet(OPTION_RETENTION_DIFF, false); - my $strArchiveRetentionType = optionGet(OPTION_RETENTION_ARCHIVE_TYPE, false); - my $iArchiveRetention = optionGet(OPTION_RETENTION_ARCHIVE, false); + my $iFullRetention = cfgOption(CFGOPT_RETENTION_FULL, false); + my $iDifferentialRetention = cfgOption(CFGOPT_RETENTION_DIFF, false); + my $strArchiveRetentionType = cfgOption(CFGOPT_RETENTION_ARCHIVE_TYPE, false); + my $iArchiveRetention = cfgOption(CFGOPT_RETENTION_ARCHIVE, false); # Load the backup.info my $oBackupInfo = new pgBackRest::Backup::Info($oStorageRepo->pathGet(STORAGE_REPO_BACKUP)); @@ -212,7 +212,7 @@ sub process # If archive retention is still undefined, then ignore archiving if (!defined($iArchiveRetention)) { - &log(INFO, "option '" . &OPTION_RETENTION_ARCHIVE . "' is not set - archive logs will not be expired"); + &log(INFO, "option '" . cfgOptionName(CFGOPT_RETENTION_ARCHIVE) . "' is not set - archive logs will not be expired"); } else { @@ -220,15 +220,15 @@ sub process # Determine which backup type to use for archive retention (full, differential, incremental) and get a list of the # remaining non-expired backups based on the type. - if ($strArchiveRetentionType eq BACKUP_TYPE_FULL) + if ($strArchiveRetentionType eq CFGOPTVAL_BACKUP_TYPE_FULL) { @stryGlobalBackupRetention = $oBackupInfo->list(backupRegExpGet(true), 'reverse'); } - elsif ($strArchiveRetentionType eq BACKUP_TYPE_DIFF) + elsif ($strArchiveRetentionType eq CFGOPTVAL_BACKUP_TYPE_DIFF) { @stryGlobalBackupRetention = $oBackupInfo->list(backupRegExpGet(true, true), 'reverse'); } - elsif ($strArchiveRetentionType eq BACKUP_TYPE_INCR) + elsif ($strArchiveRetentionType eq CFGOPTVAL_BACKUP_TYPE_INCR) { @stryGlobalBackupRetention = $oBackupInfo->list(backupRegExpGet(true, true, true), 'reverse'); } @@ -309,7 +309,7 @@ sub process # This is incase there are old archives left around so that they don't stay around forever else { - if ($strArchiveRetentionType eq BACKUP_TYPE_FULL && scalar @stryLocalBackupRetention > 0) + if ($strArchiveRetentionType eq CFGOPTVAL_BACKUP_TYPE_FULL && scalar @stryLocalBackupRetention > 0) { &log(INFO, "full backup total < ${iArchiveRetention} - using oldest full backup for ${strArchiveId} " . "archive retention"); diff --git a/lib/pgBackRest/Info.pm b/lib/pgBackRest/Info.pm index d219f25f3..548bc13e7 100644 --- a/lib/pgBackRest/Info.pm +++ b/lib/pgBackRest/Info.pm @@ -98,12 +98,12 @@ sub process my ($strOperation) = logDebugParam(__PACKAGE__ . '->process'); # Get stanza if specified - my $strStanza = optionTest(OPTION_STANZA) ? optionGet(OPTION_STANZA) : undef; + my $strStanza = cfgOptionTest(CFGOPT_STANZA) ? cfgOption(CFGOPT_STANZA) : undef; # Get the stanza list with all info my $oyStanzaList = $self->stanzaList($strStanza); - if (optionTest(OPTION_OUTPUT, INFO_OUTPUT_TEXT)) + if (cfgOptionTest(CFGOPT_OUTPUT, CFGOPTVAL_INFO_OUTPUT_TEXT)) { my $strOutput = $self->formatText($oyStanzaList); @@ -116,14 +116,14 @@ sub process syswrite(*STDOUT, 'No stanzas exist in ' . storageRepo()->pathGet() . ".\n"); } } - elsif (optionTest(OPTION_OUTPUT, INFO_OUTPUT_JSON)) + elsif (cfgOptionTest(CFGOPT_OUTPUT, CFGOPTVAL_INFO_OUTPUT_JSON)) { my $oJSON = JSON::PP->new()->canonical()->pretty()->indent_length(4); $self->outputJSON($oJSON->encode($oyStanzaList)); } else { - confess &log(ASSERT, "invalid info output option '" . optionGet(OPTION_OUTPUT) . "'"); + confess &log(ASSERT, "invalid info output option '" . cfgOption(CFGOPT_OUTPUT) . "'"); } # Return from function and log return values if any @@ -370,12 +370,12 @@ sub stanzaList # Run remotely if (!isRepoLocal()) { - @oyStanzaList = @{protocolGet(BACKUP)->cmdExecute(OP_INFO_STANZA_LIST, [$strStanza], true)}; + @oyStanzaList = @{protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP)->cmdExecute(OP_INFO_STANZA_LIST, [$strStanza], true)}; } # Run locally else { - my @stryStanza = storageRepo()->list(CMD_BACKUP, {bIgnoreMissing => true}); + my @stryStanza = storageRepo()->list(cfgCommandName(CFGCMD_BACKUP), {bIgnoreMissing => true}); foreach my $strStanzaFound (@stryStanza) { @@ -492,7 +492,8 @@ sub backupList ); # Load the backup.info but do not attempt to validate it or confirm it's existence - my $oBackupInfo = new pgBackRest::Backup::Info(storageRepo()->pathGet(CMD_BACKUP . "/${strStanza}"), false, false, {bIgnoreMissing => true}); + my $oBackupInfo = new pgBackRest::Backup::Info(storageRepo()->pathGet( + cfgCommandName(CFGCMD_BACKUP) . "/${strStanza}"), false, false, {bIgnoreMissing => true}); # Build the db list my @oyDbList; diff --git a/lib/pgBackRest/LibCLoad.pm b/lib/pgBackRest/LibCLoad.pm new file mode 100644 index 000000000..c011a7005 --- /dev/null +++ b/lib/pgBackRest/LibCLoad.pm @@ -0,0 +1,39 @@ +#################################################################################################################################### +# Determine if C Library is Present +#################################################################################################################################### +package pgBackRest::LibCLoad; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Exporter qw(import); + our @EXPORT = qw(); + +use pgBackRest::Common::Log; + +#################################################################################################################################### +# Attempt to load the C Library +#################################################################################################################################### +my $bLibC = false; + +eval +{ + # Attempt to load the C Library + require pgBackRest::LibC; + $bLibC = true; + + return 1; +} or do {}; + +#################################################################################################################################### +# libC - is the C library present? +#################################################################################################################################### +sub libC +{ + return $bLibC; +} + +push @EXPORT, qw(libC); + +1; diff --git a/lib/pgBackRest/Manifest.pm b/lib/pgBackRest/Manifest.pm index b7c1be418..6623b74c4 100644 --- a/lib/pgBackRest/Manifest.pm +++ b/lib/pgBackRest/Manifest.pm @@ -96,19 +96,19 @@ use constant MANIFEST_KEY_TYPE => 'backup-t push @EXPORT, qw(MANIFEST_KEY_TYPE); # Options that were set when the backup was made -use constant MANIFEST_KEY_BACKUP_STANDBY => 'option-' . OPTION_BACKUP_STANDBY; +use constant MANIFEST_KEY_BACKUP_STANDBY => 'option-' . cfgOptionName(CFGOPT_BACKUP_STANDBY); push @EXPORT, qw(MANIFEST_KEY_BACKUP_STANDBY); -use constant MANIFEST_KEY_HARDLINK => 'option-hardlink'; +use constant MANIFEST_KEY_HARDLINK => 'option-' . cfgOptionName(CFGOPT_HARDLINK); push @EXPORT, qw(MANIFEST_KEY_HARDLINK); -use constant MANIFEST_KEY_ARCHIVE_CHECK => 'option-archive-check'; +use constant MANIFEST_KEY_ARCHIVE_CHECK => 'option-' . cfgOptionName(CFGOPT_ARCHIVE_CHECK); push @EXPORT, qw(MANIFEST_KEY_ARCHIVE_CHECK); -use constant MANIFEST_KEY_ARCHIVE_COPY => 'option-archive-copy'; +use constant MANIFEST_KEY_ARCHIVE_COPY => 'option-' .cfgOptionName(CFGOPT_ARCHIVE_COPY); push @EXPORT, qw(MANIFEST_KEY_ARCHIVE_COPY); -use constant MANIFEST_KEY_CHECKSUM_PAGE => 'option-' . OPTION_CHECKSUM_PAGE; +use constant MANIFEST_KEY_CHECKSUM_PAGE => 'option-' . cfgOptionName(CFGOPT_CHECKSUM_PAGE); push @EXPORT, qw(MANIFEST_KEY_CHECKSUM_PAGE); -use constant MANIFEST_KEY_COMPRESS => 'option-compress'; +use constant MANIFEST_KEY_COMPRESS => 'option-' . cfgOptionName(CFGOPT_COMPRESS); push @EXPORT, qw(MANIFEST_KEY_COMPRESS); -use constant MANIFEST_KEY_ONLINE => 'option-online'; +use constant MANIFEST_KEY_ONLINE => 'option-' . cfgOptionName(CFGOPT_ONLINE); push @EXPORT, qw(MANIFEST_KEY_ONLINE); # Information about the database that was backed up diff --git a/lib/pgBackRest/Protocol/Helper.pm b/lib/pgBackRest/Protocol/Helper.pm index 6a04feb57..63b4dd4fc 100644 --- a/lib/pgBackRest/Protocol/Helper.pm +++ b/lib/pgBackRest/Protocol/Helper.pm @@ -91,12 +91,12 @@ my $hProtocol = {}; # Global remote hash that is created on first reques sub isRepoLocal { # Not valid for remote - if (commandTest(CMD_REMOTE) && !optionTest(OPTION_TYPE, BACKUP)) + if (cfgCommandTest(CFGCMD_REMOTE) && !cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_REMOTE_TYPE_BACKUP)) { - confess &log(ASSERT, 'isRepoLocal() not valid on ' . optionGet(OPTION_TYPE) . ' remote'); + confess &log(ASSERT, 'isRepoLocal() not valid on ' . cfgOption(CFGOPT_TYPE) . ' remote'); } - return optionTest(OPTION_BACKUP_HOST) ? false : true; + return cfgOptionTest(CFGOPT_BACKUP_HOST) ? false : true; } push @EXPORT, qw(isRepoLocal); @@ -115,17 +115,17 @@ sub isDbLocal logDebugParam ( __PACKAGE__ . '::isDbLocal', \@_, - {name => 'iRemoteIdx', optional => true, default => optionValid(OPTION_HOST_ID) ? optionGet(OPTION_HOST_ID) : 1, + {name => 'iRemoteIdx', optional => true, default => cfgOptionValid(CFGOPT_HOST_ID) ? cfgOption(CFGOPT_HOST_ID) : 1, trace => true}, ); # Not valid for remote - if (commandTest(CMD_REMOTE) && !optionTest(OPTION_TYPE, DB)) + if (cfgCommandTest(CFGCMD_REMOTE) && !cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_REMOTE_TYPE_DB)) { - confess &log(ASSERT, 'isDbLocal() not valid on ' . optionGet(OPTION_TYPE) . ' remote'); + confess &log(ASSERT, 'isDbLocal() not valid on ' . cfgOption(CFGOPT_TYPE) . ' remote'); } - my $bLocal = optionTest(optionIndex(OPTION_DB_HOST, $iRemoteIdx)) ? false : true; + my $bLocal = cfgOptionTest(cfgOptionIndex(CFGOPT_DB_HOST, $iRemoteIdx)) ? false : true; # Return from function and log return values if any return logDebugReturn @@ -160,20 +160,19 @@ sub protocolGet ( __PACKAGE__ . '::protocolGet', \@_, {name => 'strRemoteType'}, - {name => 'iRemoteIdx', default => optionValid(OPTION_HOST_ID) ? optionGet(OPTION_HOST_ID) : 1}, + {name => 'iRemoteIdx', default => cfgOptionValid(CFGOPT_HOST_ID) ? cfgOption(CFGOPT_HOST_ID) : 1}, {name => 'bCache', optional => true, default => true}, {name => 'strBackRestBin', optional => true}, {name => 'iProcessIdx', optional => true}, - {name => 'strCommand', optional => true, default => commandGet()}, + {name => 'strCommand', optional => true, default => cfgCommandName(cfgCommandGet())}, ); # Protocol object my $oProtocol; # If no remote requested or if the requested remote type is local then return a local protocol object - my $strRemoteHost = optionIndex("${strRemoteType}-host", $iRemoteIdx); - - if (!optionTest($strRemoteHost)) + if (!cfgOptionTest( + cfgOptionIndex($strRemoteType eq CFGOPTVAL_REMOTE_TYPE_DB ? CFGOPT_DB_HOST : CFGOPT_BACKUP_HOST, $iRemoteIdx))) { confess &log(ASSERT, 'protocol cannot be created when remote host is not specified'); } @@ -200,74 +199,86 @@ sub protocolGet logDebugMisc($strOperation, 'create (' . ($bCache ? '' : 'un') . 'cached) remote protocol'); # Return the remote when required - my $strOptionCmd = OPTION_BACKUP_CMD; - my $strOptionConfig = OPTION_BACKUP_CONFIG; - my $strOptionHost = OPTION_BACKUP_HOST; - my $strOptionUser = OPTION_BACKUP_USER; + my $iOptionIdCmd = CFGOPT_BACKUP_CMD; + my $iOptionIdConfig = CFGOPT_BACKUP_CONFIG; + my $iOptionIdHost = CFGOPT_BACKUP_HOST; + my $iOptionIdUser = CFGOPT_BACKUP_USER; my $strOptionDbPort = undef; my $strOptionDbSocketPath = undef; - my $strOptionSshPort = OPTION_BACKUP_SSH_PORT; + my $strOptionSshPort = CFGOPT_BACKUP_SSH_PORT; - if ($strRemoteType eq DB) + if ($strRemoteType eq CFGOPTVAL_REMOTE_TYPE_DB) { - $strOptionCmd = optionIndex(OPTION_DB_CMD, $iRemoteIdx); - $strOptionConfig = optionIndex(OPTION_DB_CONFIG, $iRemoteIdx); - $strOptionHost = optionIndex(OPTION_DB_HOST, $iRemoteIdx); - $strOptionUser = optionIndex(OPTION_DB_USER, $iRemoteIdx); - $strOptionSshPort = optionIndex(OPTION_DB_SSH_PORT, $iRemoteIdx); + $iOptionIdCmd = cfgOptionIndex(CFGOPT_DB_CMD, $iRemoteIdx); + $iOptionIdConfig = cfgOptionIndex(CFGOPT_DB_CONFIG, $iRemoteIdx); + $iOptionIdHost = cfgOptionIndex(CFGOPT_DB_HOST, $iRemoteIdx); + $iOptionIdUser = cfgOptionIndex(CFGOPT_DB_USER, $iRemoteIdx); + $strOptionSshPort = cfgOptionIndex(CFGOPT_DB_SSH_PORT, $iRemoteIdx); } # Db socket is not valid in all contexts (restore, for instance) - if (optionValid(optionIndex(OPTION_DB_PORT, $iRemoteIdx))) + if (cfgOptionValid(cfgOptionIndex(CFGOPT_DB_PORT, $iRemoteIdx))) { $strOptionDbPort = - optionSource(optionIndex(OPTION_DB_PORT, $iRemoteIdx)) eq SOURCE_DEFAULT ? - undef : optionGet(optionIndex(OPTION_DB_PORT, $iRemoteIdx)); + cfgOptionSource(cfgOptionIndex(CFGOPT_DB_PORT, $iRemoteIdx)) eq CFGDEF_SOURCE_DEFAULT ? + undef : cfgOption(cfgOptionIndex(CFGOPT_DB_PORT, $iRemoteIdx)); } # Db socket is not valid in all contexts (restore, for instance) - if (optionValid(optionIndex(OPTION_DB_SOCKET_PATH, $iRemoteIdx))) + if (cfgOptionValid(cfgOptionIndex(CFGOPT_DB_SOCKET_PATH, $iRemoteIdx))) { $strOptionDbSocketPath = - optionSource(optionIndex(OPTION_DB_SOCKET_PATH, $iRemoteIdx)) eq SOURCE_DEFAULT ? - undef : optionGet(optionIndex(OPTION_DB_SOCKET_PATH, $iRemoteIdx)); + cfgOptionSource(cfgOptionIndex(CFGOPT_DB_SOCKET_PATH, $iRemoteIdx)) eq CFGDEF_SOURCE_DEFAULT ? + undef : cfgOption(cfgOptionIndex(CFGOPT_DB_SOCKET_PATH, $iRemoteIdx)); + } + + # Build hash to set and override command options + my $rhCommandOption = + { + &CFGOPT_COMMAND => {value => $strCommand}, + &CFGOPT_PROCESS => {value => $iProcessIdx}, + &CFGOPT_CONFIG => + {value => cfgOptionValid($iOptionIdConfig) && cfgOptionSource($iOptionIdConfig) eq CFGDEF_SOURCE_DEFAULT ? + undef : cfgOption($iOptionIdConfig)}, + &CFGOPT_TYPE => {value => $strRemoteType}, + &CFGOPT_LOG_PATH => {}, + &CFGOPT_LOCK_PATH => {}, + + # Don't pass CFGOPT_LOG_LEVEL_STDERR because in the case of the local process calling the remote process the + # option will be set to 'protocol' which is not a valid value from the command line. + &CFGOPT_LOG_LEVEL_STDERR => {}, + + &CFGOPT_DB_PORT => {value => $strOptionDbPort}, + &CFGOPT_DB_SOCKET_PATH => {value => $strOptionDbSocketPath}, + + # Set protocol options explicitly so values are not picked up from remote config files + &CFGOPT_BUFFER_SIZE => {value => cfgOption(CFGOPT_BUFFER_SIZE)}, + &CFGOPT_COMPRESS_LEVEL => {value => cfgOption(CFGOPT_COMPRESS_LEVEL)}, + &CFGOPT_COMPRESS_LEVEL_NETWORK => {value => cfgOption(CFGOPT_COMPRESS_LEVEL_NETWORK)}, + &CFGOPT_PROTOCOL_TIMEOUT => {value => cfgOption(CFGOPT_PROTOCOL_TIMEOUT)} + }; + + # Override some per-db options that shouldn't be passed to the command. ??? This could be done better as a new rule for + # these options which would then implemented in cfgCommandWrite(). + for (my $iOptionIdx = 1; $iOptionIdx < cfgOptionIndexTotal(CFGOPT_DB_HOST); $iOptionIdx++) + { + $rhCommandOption->{cfgOptionIndex(CFGOPT_DB_PORT, $iOptionIdx)} = {}; + $rhCommandOption->{cfgOptionIndex(CFGOPT_DB_SOCKET_PATH, $iOptionIdx)} = {}; } $oProtocol = new pgBackRest::Protocol::Remote::Master ( - optionGet(OPTION_CMD_SSH), - commandWrite( - CMD_REMOTE, true, - defined($strBackRestBin) ? $strBackRestBin : optionGet($strOptionCmd), undef, - { - &OPTION_COMMAND => {value => $strCommand}, - &OPTION_PROCESS => {value => $iProcessIdx}, - &OPTION_CONFIG => { - value => optionSource($strOptionConfig) eq SOURCE_DEFAULT ? undef : optionGet($strOptionConfig)}, - &OPTION_TYPE => {value => $strRemoteType}, - &OPTION_LOG_PATH => {}, - &OPTION_LOCK_PATH => {}, - &OPTION_DB_PORT => {value => $strOptionDbPort}, - &OPTION_DB_SOCKET_PATH => {value => $strOptionDbSocketPath}, - - # ??? Not very pretty but will work until there is nicer code in commandWrite to handle this case. It - # doesn't hurt to pass these params but it's messy and distracting for debugging. - optionIndex(OPTION_DB_PORT, 2) => {}, - optionIndex(OPTION_DB_SOCKET_PATH, 2) => {}, - - # Set protocol options explicitly so values are not picked up from remote config files - &OPTION_BUFFER_SIZE => {value => optionGet(OPTION_BUFFER_SIZE)}, - &OPTION_COMPRESS_LEVEL => {value => optionGet(OPTION_COMPRESS_LEVEL)}, - &OPTION_COMPRESS_LEVEL_NETWORK => {value => optionGet(OPTION_COMPRESS_LEVEL_NETWORK)}, - &OPTION_PROTOCOL_TIMEOUT => {value => optionGet(OPTION_PROTOCOL_TIMEOUT)} - }), - optionGet(OPTION_BUFFER_SIZE), - optionGet(OPTION_COMPRESS_LEVEL), - optionGet(OPTION_COMPRESS_LEVEL_NETWORK), - optionGet($strOptionHost), - optionGet($strOptionUser), - optionGet($strOptionSshPort, false), - optionGet(OPTION_PROTOCOL_TIMEOUT) + cfgOption(CFGOPT_CMD_SSH), + cfgCommandWrite( + CFGCMD_REMOTE, true, defined($strBackRestBin) ? $strBackRestBin : cfgOption($iOptionIdCmd), undef, + $rhCommandOption), + cfgOption(CFGOPT_BUFFER_SIZE), + cfgOption(CFGOPT_COMPRESS_LEVEL), + cfgOption(CFGOPT_COMPRESS_LEVEL_NETWORK), + cfgOption($iOptionIdHost), + cfgOption($iOptionIdUser), + cfgOption($strOptionSshPort, false), + cfgOption(CFGOPT_PROTOCOL_TIMEOUT) ); # Cache the protocol diff --git a/lib/pgBackRest/Protocol/Local/Master.pm b/lib/pgBackRest/Protocol/Local/Master.pm index 2a300b930..2bbe64256 100644 --- a/lib/pgBackRest/Protocol/Local/Master.pm +++ b/lib/pgBackRest/Protocol/Local/Master.pm @@ -36,8 +36,8 @@ sub new # Init object and store variables my $self = $class->SUPER::new( - 'local', "'local-${iProcessIdx}'", $strCommand, optionGet(OPTION_BUFFER_SIZE), optionGet(OPTION_COMPRESS_LEVEL), - optionGet(OPTION_COMPRESS_LEVEL_NETWORK), optionGet(OPTION_PROTOCOL_TIMEOUT)); + 'local', "'local-${iProcessIdx}'", $strCommand, cfgOption(CFGOPT_BUFFER_SIZE), cfgOption(CFGOPT_COMPRESS_LEVEL), + cfgOption(CFGOPT_COMPRESS_LEVEL_NETWORK), cfgOption(CFGOPT_PROTOCOL_TIMEOUT)); bless $self, $class; diff --git a/lib/pgBackRest/Protocol/Local/Minion.pm b/lib/pgBackRest/Protocol/Local/Minion.pm index 81b11dbe6..4ac2876ea 100644 --- a/lib/pgBackRest/Protocol/Local/Minion.pm +++ b/lib/pgBackRest/Protocol/Local/Minion.pm @@ -29,7 +29,7 @@ sub new my ($strOperation) = logDebugParam(__PACKAGE__ . '->new'); # Init object and store variables - my $self = $class->SUPER::new(CMD_LOCAL, optionGet(OPTION_BUFFER_SIZE), optionGet(OPTION_PROTOCOL_TIMEOUT)); + my $self = $class->SUPER::new(cfgCommandName(CFGCMD_LOCAL), cfgOption(CFGOPT_BUFFER_SIZE), cfgOption(CFGOPT_PROTOCOL_TIMEOUT)); bless $self, $class; # Return from function and log return values if any diff --git a/lib/pgBackRest/Protocol/Local/Process.pm b/lib/pgBackRest/Protocol/Local/Process.pm index d8a51cb86..77def927e 100644 --- a/lib/pgBackRest/Protocol/Local/Process.pm +++ b/lib/pgBackRest/Protocol/Local/Process.pm @@ -40,7 +40,7 @@ sub new ( __PACKAGE__ . '->new', \@_, {name => 'strHostType'}, - {name => 'iSelectTimeout', default => int(optionGet(OPTION_PROTOCOL_TIMEOUT) / 2)}, + {name => 'iSelectTimeout', default => int(cfgOption(CFGOPT_PROTOCOL_TIMEOUT) / 2)}, {name => 'strBackRestBin', default => BACKREST_BIN}, {name => 'bConfessError', default => true}, ); @@ -180,13 +180,15 @@ sub hostConnect my $oLocal = new pgBackRest::Protocol::Local::Master ( - commandWrite( - CMD_LOCAL, true, $self->{strBackRestBin}, undef, + cfgCommandWrite( + CFGCMD_LOCAL, true, $self->{strBackRestBin}, undef, { - &OPTION_COMMAND => {value => commandGet()}, - &OPTION_PROCESS => {value => $iProcessId}, - &OPTION_TYPE => {value => $self->{strHostType}}, - &OPTION_HOST_ID => {value => $hHost->{iHostConfigIdx}}, + &CFGOPT_COMMAND => {value => cfgCommandName(cfgCommandGet())}, + &CFGOPT_PROCESS => {value => $iProcessId}, + &CFGOPT_TYPE => {value => $self->{strHostType}}, + &CFGOPT_HOST_ID => {value => $hHost->{iHostConfigIdx}}, + + &CFGOPT_LOG_LEVEL_STDERR => {}, }), $iLocalIdx + 1 ); diff --git a/lib/pgBackRest/Protocol/Remote/Minion.pm b/lib/pgBackRest/Protocol/Remote/Minion.pm index f379448f5..13c07617f 100644 --- a/lib/pgBackRest/Protocol/Remote/Minion.pm +++ b/lib/pgBackRest/Protocol/Remote/Minion.pm @@ -46,7 +46,7 @@ sub new ); # Init object and store variables - my $self = $class->SUPER::new(CMD_REMOTE, $iBufferMax, $iProtocolTimeout); + my $self = $class->SUPER::new(cfgCommandName(CFGCMD_REMOTE), $iBufferMax, $iProtocolTimeout); bless $self, $class; # Return from function and log return values if any @@ -68,12 +68,12 @@ sub init my ($strOperation) = logDebugParam(__PACKAGE__ . '->init'); # Create objects - my $oStorage = optionTest(OPTION_TYPE, DB) ? storageDb() : storageRepo(); + my $oStorage = cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_REMOTE_TYPE_DB) ? storageDb() : storageRepo(); - my $oArchiveGet = optionTest(OPTION_TYPE, BACKUP) ? new pgBackRest::Archive::Get::Get() : undef; - my $oCheck = optionTest(OPTION_TYPE, BACKUP) ? new pgBackRest::Check::Check() : undef; - my $oInfo = optionTest(OPTION_TYPE, BACKUP) ? new pgBackRest::Info() : undef; - my $oDb = optionTest(OPTION_TYPE, DB) ? new pgBackRest::Db() : undef; + my $oArchiveGet = cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_REMOTE_TYPE_BACKUP) ? new pgBackRest::Archive::Get::Get() : undef; + my $oCheck = cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_REMOTE_TYPE_BACKUP) ? new pgBackRest::Check::Check() : undef; + my $oInfo = cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_REMOTE_TYPE_BACKUP) ? new pgBackRest::Info() : undef; + my $oDb = cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_REMOTE_TYPE_DB) ? new pgBackRest::Db() : undef; # Create anonymous subs for each command my $hCommandMap = diff --git a/lib/pgBackRest/Protocol/Storage/Helper.pm b/lib/pgBackRest/Protocol/Storage/Helper.pm index 2a7d1e2fe..840791ca7 100644 --- a/lib/pgBackRest/Protocol/Storage/Helper.pm +++ b/lib/pgBackRest/Protocol/Storage/Helper.pm @@ -50,7 +50,7 @@ sub storageDb logDebugParam ( __PACKAGE__ . '::storageDb', \@_, - {name => 'iRemoteIdx', optional => true, default => optionValid(OPTION_HOST_ID) ? optionGet(OPTION_HOST_ID) : 1, + {name => 'iRemoteIdx', optional => true, default => cfgOptionValid(CFGOPT_HOST_ID) ? cfgOption(CFGOPT_HOST_ID) : 1, trace => true}, ); @@ -60,12 +60,13 @@ sub storageDb if (isDbLocal({iRemoteIdx => $iRemoteIdx})) { $hStorage->{&STORAGE_DB}{$iRemoteIdx} = new pgBackRest::Storage::Local( - optionGet(optionIndex(OPTION_DB_PATH, $iRemoteIdx)), new pgBackRest::Storage::Posix::Driver(), - {strTempExtension => STORAGE_TEMP_EXT, lBufferMax => optionGet(OPTION_BUFFER_SIZE)}); + cfgOption(cfgOptionIndex(CFGOPT_DB_PATH, $iRemoteIdx)), new pgBackRest::Storage::Posix::Driver(), + {strTempExtension => STORAGE_TEMP_EXT, lBufferMax => cfgOption(CFGOPT_BUFFER_SIZE)}); } else { - $hStorage->{&STORAGE_DB}{$iRemoteIdx} = new pgBackRest::Protocol::Storage::Remote(protocolGet(DB, $iRemoteIdx)); + $hStorage->{&STORAGE_DB}{$iRemoteIdx} = new pgBackRest::Protocol::Storage::Remote( + protocolGet(CFGOPTVAL_REMOTE_TYPE_DB, $iRemoteIdx)); } } @@ -146,9 +147,9 @@ sub storageRepo if (!defined($strStanza)) { - if (optionValid(OPTION_STANZA) && optionTest(OPTION_STANZA)) + if (cfgOptionValid(CFGOPT_STANZA) && cfgOptionTest(CFGOPT_STANZA)) { - $strStanza = optionGet(OPTION_STANZA); + $strStanza = cfgOption(CFGOPT_STANZA); } else { @@ -184,18 +185,18 @@ sub storageRepo # Create the driver my $oDriver; - if (optionTest(OPTION_REPO_TYPE, REPO_TYPE_S3)) + if (cfgOptionTest(CFGOPT_REPO_TYPE, CFGOPTVAL_REPO_TYPE_S3)) { require pgBackRest::Storage::S3::Driver; $oDriver = new pgBackRest::Storage::S3::Driver( - optionGet(OPTION_REPO_S3_BUCKET), optionGet(OPTION_REPO_S3_ENDPOINT), optionGet(OPTION_REPO_S3_REGION), - optionGet(OPTION_REPO_S3_KEY), optionGet(OPTION_REPO_S3_KEY_SECRET), - {strHost => optionGet(OPTION_REPO_S3_HOST, false), bVerifySsl => optionGet(OPTION_REPO_S3_VERIFY_SSL, false), - strCaPath => optionGet(OPTION_REPO_S3_CA_PATH, false), - strCaFile => optionGet(OPTION_REPO_S3_CA_FILE, false), lBufferMax => optionGet(OPTION_BUFFER_SIZE)}); + cfgOption(CFGOPT_REPO_S3_BUCKET), cfgOption(CFGOPT_REPO_S3_ENDPOINT), cfgOption(CFGOPT_REPO_S3_REGION), + cfgOption(CFGOPT_REPO_S3_KEY), cfgOption(CFGOPT_REPO_S3_KEY_SECRET), + {strHost => cfgOption(CFGOPT_REPO_S3_HOST, false), bVerifySsl => cfgOption(CFGOPT_REPO_S3_VERIFY_SSL, false), + strCaPath => cfgOption(CFGOPT_REPO_S3_CA_PATH, false), + strCaFile => cfgOption(CFGOPT_REPO_S3_CA_FILE, false), lBufferMax => cfgOption(CFGOPT_BUFFER_SIZE)}); } - elsif (optionTest(OPTION_REPO_TYPE, REPO_TYPE_CIFS)) + elsif (cfgOptionTest(CFGOPT_REPO_TYPE, CFGOPTVAL_REPO_TYPE_CIFS)) { require pgBackRest::Storage::Cifs::Driver; @@ -208,13 +209,14 @@ sub storageRepo # Create local storage $hStorage->{&STORAGE_REPO}{$strStanza} = new pgBackRest::Storage::Local( - optionGet(OPTION_REPO_PATH), $oDriver, - {strTempExtension => STORAGE_TEMP_EXT, hRule => $hRule, lBufferMax => optionGet(OPTION_BUFFER_SIZE)}); + cfgOption(CFGOPT_REPO_PATH), $oDriver, + {strTempExtension => STORAGE_TEMP_EXT, hRule => $hRule, lBufferMax => cfgOption(CFGOPT_BUFFER_SIZE)}); } else { # Create remote storage - $hStorage->{&STORAGE_REPO}{$strStanza} = new pgBackRest::Protocol::Storage::Remote(protocolGet(BACKUP)); + $hStorage->{&STORAGE_REPO}{$strStanza} = new pgBackRest::Protocol::Storage::Remote( + protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP)); } } diff --git a/lib/pgBackRest/Protocol/Storage/Remote.pm b/lib/pgBackRest/Protocol/Storage/Remote.pm index bcf287b15..72dc08fbd 100644 --- a/lib/pgBackRest/Protocol/Storage/Remote.pm +++ b/lib/pgBackRest/Protocol/Storage/Remote.pm @@ -171,7 +171,7 @@ sub openRead push( @{$rhParam->{rhyFilter}}, {strClass => STORAGE_FILTER_GZIP, - rxyParam => [{iLevel => optionGet(OPTION_COMPRESS_LEVEL_NETWORK), bWantGzip => false}]}); + rxyParam => [{iLevel => cfgOption(CFGOPT_COMPRESS_LEVEL_NETWORK), bWantGzip => false}]}); delete($rhParam->{bProtocolCompress}); } @@ -235,7 +235,7 @@ sub openWrite if ($bProtocolCompress) { $oDestinationFileIo = new pgBackRest::Storage::Filter::Gzip( - $oDestinationFileIo, {iLevel => optionGet(OPTION_COMPRESS_LEVEL_NETWORK), bWantGzip => false}); + $oDestinationFileIo, {iLevel => cfgOption(CFGOPT_COMPRESS_LEVEL_NETWORK), bWantGzip => false}); } # Return from function and log return values if any diff --git a/lib/pgBackRest/Restore.pm b/lib/pgBackRest/Restore.pm index e99c9650e..832055e7f 100644 --- a/lib/pgBackRest/Restore.pm +++ b/lib/pgBackRest/Restore.pm @@ -40,11 +40,11 @@ sub new my ($strOperation) = logDebugParam(__PACKAGE__ . '->new'); # Initialize protocol - $self->{oProtocol} = !isRepoLocal() ? protocolGet(BACKUP) : undef; + $self->{oProtocol} = !isRepoLocal() ? protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP) : undef; # Initialize variables - $self->{strDbClusterPath} = optionGet(OPTION_DB_PATH); - $self->{strBackupSet} = optionGet(OPTION_SET); + $self->{strDbClusterPath} = cfgOption(CFGOPT_DB_PATH); + $self->{strBackupSet} = cfgOption(CFGOPT_SET); # Return from function and log return values if any return logDebugReturn @@ -218,7 +218,7 @@ sub manifestLoad # If backup is latest then set it equal to backup label, else verify that requested backup and label match my $strBackupLabel = $oManifest->get(MANIFEST_SECTION_BACKUP, MANIFEST_KEY_LABEL); - if ($self->{strBackupSet} eq OPTION_DEFAULT_RESTORE_SET) + if ($self->{strBackupSet} eq cfgOptionDefault(CFGOPT_SET)) { $self->{strBackupSet} = $strBackupLabel; } @@ -238,9 +238,9 @@ sub manifestLoad # Remap tablespaces when requested my $oTablespaceRemap; - if (optionTest(OPTION_TABLESPACE_MAP)) + if (cfgOptionTest(CFGOPT_TABLESPACE_MAP)) { - my $oTablespaceRemapRequest = optionGet(OPTION_TABLESPACE_MAP); + my $oTablespaceRemapRequest = cfgOption(CFGOPT_TABLESPACE_MAP); for my $strKey (sort(keys(%{$oTablespaceRemapRequest}))) { @@ -272,7 +272,7 @@ sub manifestLoad } # Remap all tablespaces (except ones that were done individually above) - if (optionTest(OPTION_TABLESPACE_MAP_ALL)) + if (cfgOptionTest(CFGOPT_TABLESPACE_MAP_ALL)) { for my $strTarget ($oManifest->keys(MANIFEST_SECTION_BACKUP_TARGET)) { @@ -280,7 +280,7 @@ sub manifestLoad { if (!defined(${$oTablespaceRemap}{$strTarget})) { - ${$oTablespaceRemap}{$strTarget} = optionGet(OPTION_TABLESPACE_MAP_ALL) . '/' . + ${$oTablespaceRemap}{$strTarget} = cfgOption(CFGOPT_TABLESPACE_MAP_ALL) . '/' . $oManifest->get(MANIFEST_SECTION_BACKUP_TARGET, $strTarget, MANIFEST_SUBKEY_TABLESPACE_NAME); } } @@ -289,7 +289,7 @@ sub manifestLoad # Issue a warning message when we remap tablespaces in postgre < 9.2 if ($oManifest->get(MANIFEST_SECTION_BACKUP_DB, MANIFEST_KEY_DB_VERSION) < PG_VERSION_92 && - (optionTest(OPTION_TABLESPACE_MAP) || optionTest(OPTION_TABLESPACE_MAP_ALL))) + (cfgOptionTest(CFGOPT_TABLESPACE_MAP) || cfgOptionTest(CFGOPT_TABLESPACE_MAP_ALL))) { &log(WARN, "update pg_tablespace.spclocation with new tablespace location in PostgreSQL < " . PG_VERSION_92); } @@ -315,9 +315,9 @@ sub manifestLoad # Remap links when requested my $oLinkRemap; - if (optionTest(OPTION_LINK_MAP)) + if (cfgOptionTest(CFGOPT_LINK_MAP)) { - my $oLinkRemapRequest = optionGet(OPTION_LINK_MAP); + my $oLinkRemapRequest = cfgOption(CFGOPT_LINK_MAP); for my $strKey (sort(keys(%{$oLinkRemapRequest}))) { @@ -347,7 +347,7 @@ sub manifestLoad } # Remap all links (except ones that were done individually above) - if (optionGet(OPTION_LINK_ALL)) + if (cfgOption(CFGOPT_LINK_ALL)) { for my $strTarget ($oManifest->keys(MANIFEST_SECTION_BACKUP_TARGET)) { @@ -475,7 +475,7 @@ sub clean # Check that all targets exist and are empty (unless --force or --delta specified) my %oTargetFound; - my $bDelta = optionGet(OPTION_FORCE) || optionGet(OPTION_DELTA); + my $bDelta = cfgOption(CFGOPT_FORCE) || cfgOption(CFGOPT_DELTA); for my $strTarget ($oManifest->keys(MANIFEST_SECTION_BACKUP_TARGET)) { @@ -899,12 +899,12 @@ sub recovery # See if recovery.conf already exists my $bRecoveryConfExists = storageDb()->exists($strRecoveryConf); - # If RECOVERY_TYPE_PRESERVE then warn if recovery.conf does not exist and return - if (optionTest(OPTION_TYPE, RECOVERY_TYPE_PRESERVE)) + # If CFGOPTVAL_RESTORE_TYPE_PRESERVE then warn if recovery.conf does not exist and return + if (cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_RESTORE_TYPE_PRESERVE)) { if (!$bRecoveryConfExists) { - &log(WARN, "recovery type is " . optionGet(OPTION_TYPE) . " but recovery file does not exist at ${strRecoveryConf}"); + &log(WARN, "recovery type is " . cfgOption(CFGOPT_TYPE) . " but recovery file does not exist at ${strRecoveryConf}"); } } else @@ -915,16 +915,16 @@ sub recovery storageDb()->remove($strRecoveryConf); } - # If RECOVERY_TYPE_NONE then return - if (!optionTest(OPTION_TYPE, RECOVERY_TYPE_NONE)) + # If CFGOPTVAL_RESTORE_TYPE_NONE then return + if (!cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_RESTORE_TYPE_NONE)) { # Write recovery options read from the configuration file my $strRecovery = ''; my $bRestoreCommandOverride = false; - if (optionTest(OPTION_RESTORE_RECOVERY_OPTION)) + if (cfgOptionTest(CFGOPT_RECOVERY_OPTION)) { - my $oRecoveryRef = optionGet(OPTION_RESTORE_RECOVERY_OPTION); + my $oRecoveryRef = cfgOption(CFGOPT_RECOVERY_OPTION); foreach my $strKey (sort(keys(%$oRecoveryRef))) { @@ -943,33 +943,33 @@ sub recovery # Write the restore command if (!$bRestoreCommandOverride) { - $strRecovery .= "restore_command = '" . commandWrite(CMD_ARCHIVE_GET) . " %f \"%p\"'\n"; + $strRecovery .= "restore_command = '" . cfgCommandWrite(CFGCMD_ARCHIVE_GET) . " %f \"%p\"'\n"; } - # If type is RECOVERY_TYPE_IMMEDIATE - if (optionTest(OPTION_TYPE, RECOVERY_TYPE_IMMEDIATE)) + # If type is CFGOPTVAL_RESTORE_TYPE_IMMEDIATE + if (cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_RESTORE_TYPE_IMMEDIATE)) { - $strRecovery .= "recovery_target = '" . RECOVERY_TYPE_IMMEDIATE . "'\n"; + $strRecovery .= "recovery_target = '" . CFGOPTVAL_RESTORE_TYPE_IMMEDIATE . "'\n"; } - # If type is not RECOVERY_TYPE_DEFAULT write target options - elsif (!optionTest(OPTION_TYPE, RECOVERY_TYPE_DEFAULT)) + # If type is not CFGOPTVAL_RESTORE_TYPE_DEFAULT write target options + elsif (!cfgOptionTest(CFGOPT_TYPE, CFGOPTVAL_RESTORE_TYPE_DEFAULT)) { # Write the recovery target - $strRecovery .= "recovery_target_" . optionGet(OPTION_TYPE) . " = '" . optionGet(OPTION_TARGET) . "'\n"; + $strRecovery .= "recovery_target_" . cfgOption(CFGOPT_TYPE) . " = '" . cfgOption(CFGOPT_TARGET) . "'\n"; # Write recovery_target_inclusive - if (optionGet(OPTION_TARGET_EXCLUSIVE, false)) + if (cfgOption(CFGOPT_TARGET_EXCLUSIVE, false)) { $strRecovery .= "recovery_target_inclusive = 'false'\n"; } } # Write pause_at_recovery_target - if (optionTest(OPTION_TARGET_ACTION)) + if (cfgOptionTest(CFGOPT_TARGET_ACTION)) { - my $strTargetAction = optionGet(OPTION_TARGET_ACTION); + my $strTargetAction = cfgOption(CFGOPT_TARGET_ACTION); - if ($strTargetAction ne OPTION_DEFAULT_RESTORE_TARGET_ACTION) + if ($strTargetAction ne cfgOptionDefault(CFGOPT_TARGET_ACTION)) { if ($strDbVersion >= PG_VERSION_95) { @@ -981,15 +981,16 @@ sub recovery } else { - confess &log(ERROR, OPTION_TARGET_ACTION . ' option is only available in PostgreSQL >= ' . PG_VERSION_91) + confess &log(ERROR, + cfgOptionName(CFGOPT_TARGET_ACTION) . ' option is only available in PostgreSQL >= ' . PG_VERSION_91) } } } # Write recovery_target_timeline - if (optionTest(OPTION_TARGET_TIMELINE)) + if (cfgOptionTest(CFGOPT_TARGET_TIMELINE)) { - $strRecovery .= "recovery_target_timeline = '" . optionGet(OPTION_TARGET_TIMELINE) . "'\n"; + $strRecovery .= "recovery_target_timeline = '" . cfgOption(CFGOPT_TARGET_TIMELINE) . "'\n"; } # Write recovery.conf @@ -1043,7 +1044,7 @@ sub process } # If the restore will be destructive attempt to verify that $PGDATA is valid - if ((optionGet(OPTION_DELTA) || optionGet(OPTION_FORCE)) && + if ((cfgOption(CFGOPT_DELTA) || cfgOption(CFGOPT_FORCE)) && !($oStorageDb->exists($self->{strDbClusterPath} . '/' . DB_FILE_PGVERSION) || $oStorageDb->exists($self->{strDbClusterPath} . '/' . FILE_MANIFEST))) { @@ -1052,8 +1053,8 @@ sub process ' --delta and --force have been disabled and if any files exist in the destination directories the restore' . ' will be aborted.'); - optionSet(OPTION_DELTA, false); - optionSet(OPTION_FORCE, false); + cfgOptionSet(CFGOPT_DELTA, false); + cfgOptionSet(CFGOPT_FORCE, false); } # Copy backup info, load it, then delete @@ -1066,9 +1067,9 @@ sub process $oStorageDb->remove($self->{strDbClusterPath} . '/' . FILE_BACKUP_INFO); # If set to restore is latest then get the actual set - if ($self->{strBackupSet} eq OPTION_DEFAULT_RESTORE_SET) + if ($self->{strBackupSet} eq cfgOptionDefault(CFGOPT_SET)) { - $self->{strBackupSet} = $oBackupInfo->last(BACKUP_TYPE_INCR); + $self->{strBackupSet} = $oBackupInfo->last(CFGOPTVAL_BACKUP_TYPE_INCR); if (!defined($self->{strBackupSet})) { @@ -1110,7 +1111,7 @@ sub process # Build an expression to match files that should be zeroed for filtered restores my $strDbFilter; - if (optionTest(OPTION_DB_INCLUDE)) + if (cfgOptionTest(CFGOPT_DB_INCLUDE)) { # Build a list of databases from the manifest since the db name/id mappings will not be available for an offline restore. my %oDbList; @@ -1135,7 +1136,7 @@ sub process &log(DETAIL, 'databases for include/exclude (' . join(', ', sort(keys(%oDbList))) . ')'); # Remove included databases from the list - my $oDbInclude = optionGet(OPTION_DB_INCLUDE); + my $oDbInclude = cfgOption(CFGOPT_DB_INCLUDE); for my $strDbKey (sort(keys(%{$oDbInclude}))) { @@ -1191,8 +1192,8 @@ sub process } # Initialize the restore process - my $oRestoreProcess = new pgBackRest::Protocol::Local::Process(BACKUP); - $oRestoreProcess->hostAdd(1, optionGet(OPTION_PROCESS_MAX)); + my $oRestoreProcess = new pgBackRest::Protocol::Local::Process(CFGOPTVAL_LOCAL_TYPE_BACKUP); + $oRestoreProcess->hostAdd(1, cfgOption(CFGOPT_PROCESS_MAX)); # Variables used for parallel copy my $lSizeTotal = 0; @@ -1240,13 +1241,13 @@ sub process $oManifest->numericGet(MANIFEST_SECTION_TARGET_FILE, $strRepoFile, MANIFEST_SUBKEY_TIMESTAMP), $oManifest->get(MANIFEST_SECTION_TARGET_FILE, $strRepoFile, MANIFEST_SUBKEY_CHECKSUM, $lSize > 0), defined($strDbFilter) && $strRepoFile =~ $strDbFilter && $strRepoFile !~ /\/PG\_VERSION$/ ? true : false, - optionGet(OPTION_FORCE), $strRepoFile, + cfgOption(CFGOPT_FORCE), $strRepoFile, $oManifest->boolTest(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_HARDLINK, undef, true) ? undef : $oManifest->get(MANIFEST_SECTION_TARGET_FILE, $strRepoFile, MANIFEST_SUBKEY_REFERENCE, false), $oManifest->get(MANIFEST_SECTION_TARGET_FILE, $strRepoFile, MANIFEST_SUBKEY_MODE), $oManifest->get(MANIFEST_SECTION_TARGET_FILE, $strRepoFile, MANIFEST_SUBKEY_USER), $oManifest->get(MANIFEST_SECTION_TARGET_FILE, $strRepoFile, MANIFEST_SUBKEY_GROUP), - $oManifest->numericGet(MANIFEST_SECTION_BACKUP, MANIFEST_KEY_TIMESTAMP_COPY_START), optionGet(OPTION_DELTA), + $oManifest->numericGet(MANIFEST_SECTION_BACKUP, MANIFEST_KEY_TIMESTAMP_COPY_START), cfgOption(CFGOPT_DELTA), $self->{strBackupSet}, $oManifest->boolGet(MANIFEST_SECTION_BACKUP_OPTION, MANIFEST_KEY_COMPRESS)]); } diff --git a/lib/pgBackRest/Stanza.pm b/lib/pgBackRest/Stanza.pm index 0fcf0f507..377f0254d 100644 --- a/lib/pgBackRest/Stanza.pm +++ b/lib/pgBackRest/Stanza.pm @@ -70,19 +70,19 @@ sub process my $iResult = 0; # Process stanza create - if (commandTest(CMD_STANZA_CREATE)) + if (cfgCommandTest(CFGCMD_STANZA_CREATE)) { $iResult = $self->stanzaCreate(); } # Process stanza upgrade - elsif (commandTest(CMD_STANZA_UPGRADE)) + elsif (cfgCommandTest(CFGCMD_STANZA_UPGRADE)) { $iResult = $self->stanzaUpgrade(); } # Else error if any other command is found else { - confess &log(ASSERT, "stanza->process() called with invalid command: " . commandGet()); + confess &log(ASSERT, "stanza->process() called with invalid command: " . cfgCommandName(cfgCommandGet())); } # Return from function and log return values if any @@ -115,7 +115,7 @@ sub stanzaCreate # If force not used, then if files exist force should be required since create must have already occurred and reissuing a create # needs to be a consciuos effort to rewrite the files - if (!optionGet(OPTION_FORCE)) + if (!cfgOption(CFGOPT_FORCE)) { # At least one directory is not empty, then check to see if the info files exist if (@stryFileListArchive || @stryFileListBackup) @@ -166,7 +166,7 @@ sub stanzaCreate if ($iResult != 0) { - &log(WARN, "unable to create stanza '" . optionGet(OPTION_STANZA) . "'"); + &log(WARN, "unable to create stanza '" . cfgOption(CFGOPT_STANZA) . "'"); confess &log(ERROR, $strResultMessage, $iResult); } @@ -330,12 +330,12 @@ sub infoObject # If force was not used, and the file is missing, then confess the error with hint to use force if the option is # configurable (force is not configurable for stanza-upgrade so this will always confess errors on stanza-upgrade) # else confess all other errors - if ((optionValid(OPTION_FORCE) && !optionGet(OPTION_FORCE)) || - (!optionValid(OPTION_FORCE))) + if ((cfgOptionValid(CFGOPT_FORCE) && !cfgOption(CFGOPT_FORCE)) || + (!cfgOptionValid(CFGOPT_FORCE))) { if ($iResult == ERROR_FILE_MISSING) { - confess &log(ERROR, (optionValid(OPTION_FORCE) ? $strResultMessage . $strHintForce : $strResultMessage), $iResult); + confess &log(ERROR, cfgOptionValid(CFGOPT_FORCE) ? $strResultMessage . $strHintForce : $strResultMessage, $iResult); } else { @@ -392,7 +392,7 @@ sub infoFileCreate # If force was not used and the info file does not exist and the directory is not empty, then error # This should also be performed by the calling routine before this function is called, so this is just a safety check - if (!optionGet(OPTION_FORCE) && !$oInfo->{bExists} && @$stryFileList) + if (!cfgOption(CFGOPT_FORCE) && !$oInfo->{bExists} && @$stryFileList) { confess &log(ERROR, ($strPathType eq STORAGE_REPO_BACKUP ? 'backup directory ' : 'archive directory ') . $strStanzaCreateErrorMsg, ERROR_PATH_NOT_EMPTY); @@ -426,7 +426,7 @@ sub infoFileCreate if ($oInfoOnDisk->hash() ne $oInfo->hash()) { # If force was not used and the hashes are different then error - if (!optionGet(OPTION_FORCE)) + if (!cfgOption(CFGOPT_FORCE)) { $iResult = ERROR_FILE_INVALID; $strResultMessage = @@ -488,7 +488,7 @@ sub dbInfoGet # Validate the database configuration. Do not require the database to be online before creating a stanza because the # archive_command will attempt to push an achive before the archive.info file exists which will result in an error in the # postgres logs. - if (optionGet(OPTION_ONLINE)) + if (cfgOption(CFGOPT_ONLINE)) { # If the db-path in pgbackrest.conf does not match the pg_control then this will error alert the user to fix pgbackrest.conf $self->{oDb}->configValidate(); diff --git a/lib/pgBackRest/Storage/Helper.pm b/lib/pgBackRest/Storage/Helper.pm index 9f89ef92d..39df5a231 100644 --- a/lib/pgBackRest/Storage/Helper.pm +++ b/lib/pgBackRest/Storage/Helper.pm @@ -72,7 +72,7 @@ sub storageLocal $hStorage->{&STORAGE_LOCAL}{$strPath} = new pgBackRest::Storage::Local( $strPath, new pgBackRest::Storage::Posix::Driver(), {strTempExtension => STORAGE_TEMP_EXT, - lBufferMax => optionValid(OPTION_BUFFER_SIZE, false) ? optionGet(OPTION_BUFFER_SIZE, false) : undef}); + lBufferMax => cfgOptionValid(CFGOPT_BUFFER_SIZE, false) ? cfgOption(CFGOPT_BUFFER_SIZE, false) : undef}); } # Return from function and log return values if any @@ -99,7 +99,7 @@ sub storageSpool logDebugParam ( __PACKAGE__ . '::storageSpool', \@_, - {name => 'strStanza', default => optionGet(OPTION_STANZA), trace => true}, + {name => 'strStanza', default => cfgOption(CFGOPT_STANZA), trace => true}, ); # Create storage if not defined @@ -113,8 +113,8 @@ sub storageSpool # Create local storage $hStorage->{&STORAGE_SPOOL}{$strStanza} = new pgBackRest::Storage::Local( - optionGet(OPTION_SPOOL_PATH), new pgBackRest::Storage::Posix::Driver(), - {hRule => $hRule, strTempExtension => STORAGE_TEMP_EXT, lBufferMax => optionGet(OPTION_BUFFER_SIZE)}); + cfgOption(CFGOPT_SPOOL_PATH), new pgBackRest::Storage::Posix::Driver(), + {hRule => $hRule, strTempExtension => STORAGE_TEMP_EXT, lBufferMax => cfgOption(CFGOPT_BUFFER_SIZE)}); } # Return from function and log return values if any diff --git a/lib/pgBackRest/Version.pm b/lib/pgBackRest/Version.pm index 06459ad35..e6206faf3 100644 --- a/lib/pgBackRest/Version.pm +++ b/lib/pgBackRest/Version.pm @@ -35,7 +35,7 @@ use constant BACKREST_BIN => abs_path( # Defines the current version of the BackRest executable. The version number is used to track features but does not affect what # repositories or manifests can be read - that's the job of the format number. #----------------------------------------------------------------------------------------------------------------------------------- -use constant BACKREST_VERSION => '1.22'; +use constant BACKREST_VERSION => '1.23dev'; push @EXPORT, qw(BACKREST_VERSION); # Format Format Number diff --git a/libc/.gitignore b/libc/.gitignore index 06bba3dd2..6ad8f9c46 100644 --- a/libc/.gitignore +++ b/libc/.gitignore @@ -1,10 +1 @@ -Makefile.old -Makefile -MYMETA.* -LibC.bs -LibC.c -*.o -pm_to_blib -blib -const-c.inc -const-xs.inc +lib/pgBackRest/LibC.pm diff --git a/libc/LibC.h b/libc/LibC.h index 2108be4e2..557546320 100644 --- a/libc/LibC.h +++ b/libc/LibC.h @@ -1,35 +1,9 @@ -#include "EXTERN.h" -#include "perl.h" +#ifndef LIBC_H +#define LIBC_H + +#include "common/type.h" +#include "config/config.h" +#include "config/configRule.h" +#include "postgres/pageChecksum.h" -/*********************************************************************************************************************************** -Older compilers do not define true/false -***********************************************************************************************************************************/ -#ifndef false - #define false 0 #endif - -#ifndef true - #define true 1 -#endif - -/*********************************************************************************************************************************** -Define integer types based on Perl portability -***********************************************************************************************************************************/ -typedef U8 uint8; /* == 8 bits */ -typedef U16 uint16; /* == 16 bits */ -typedef U32 uint32; /* == 32 bits */ -typedef UV uint64; /* == 64 bits */ - -typedef I8 int8; /* == 8 bits */ -typedef I16 int16; /* == 16 bits */ -typedef I32 int32; /* == 32 bits */ -typedef IV int64; /* == 64 bits */ - -/*********************************************************************************************************************************** -Checksum functions -***********************************************************************************************************************************/ -uint16 pageChecksum(const char *szPage, uint32 uiBlockNo, uint32 uiPageSize); -bool pageChecksumTest(const char *szPage, uint32 uiBlockNo, uint32 uiPageSize, uint32 uiIgnoreWalId, uint32 uiIgnoreWalOffset); -bool pageChecksumBufferTest( - const char *szPageBuffer, uint32 uiBufferSize, uint32 uiBlockNoStart, uint32 uiPageSize, uint32 uiIgnoreWalId, - uint32 uiIgnoreWalOffset); diff --git a/libc/LibC.xs b/libc/LibC.xs index 7c39de2b3..a5e56e22a 100644 --- a/libc/LibC.xs +++ b/libc/LibC.xs @@ -13,10 +13,151 @@ * 'unsigned short', 'void *', 'wchar_t', 'wchar_t *' */ -MODULE = pgBackRest::LibC PACKAGE = pgBackRest::LibC +MODULE = pgBackRest::LibC PACKAGE = pgBackRest::LibC +PROTOTYPES: DISABLE INCLUDE: const-xs.inc +# Config Rule +# ---------------------------------------------------------------------------------------------------------------------------------- +I32 +cfgCommandId(szCommandName) + const char *szCommandName + +I32 +cfgOptionId(szOptionName) + const char *szOptionName + +bool +cfgRuleOptionAllowList(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +const char * +cfgRuleOptionAllowListValue(uiCommandId, uiOptionId, uiValueId) + U32 uiCommandId + U32 uiOptionId + U32 uiValueId + +I32 +cfgRuleOptionAllowListValueTotal(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +bool +cfgRuleOptionAllowListValueValid(uiCommandId, uiOptionId, szValue); + U32 uiCommandId + U32 uiOptionId + const char *szValue + +bool +cfgRuleOptionAllowRange(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +double +cfgRuleOptionAllowRangeMax(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +double +cfgRuleOptionAllowRangeMin(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +const char * +cfgRuleOptionDefault(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +bool +cfgRuleOptionDepend(uiCommandId, uiOptionId); + U32 uiCommandId + U32 uiOptionId + +I32 +cfgRuleOptionDependOption(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +const char * +cfgRuleOptionDependValue(uiCommandId, uiOptionId, uiValueId) + U32 uiCommandId + U32 uiOptionId + U32 uiValueId + +I32 +cfgRuleOptionDependValueTotal(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +bool +cfgRuleOptionDependValueValid(uiCommandId, uiOptionId, szValue) + U32 uiCommandId + U32 uiOptionId + const char *szValue + +const char * +cfgRuleOptionHint(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +const char * +cfgRuleOptionNameAlt(uiOptionId) + U32 uiOptionId + +bool cfgRuleOptionNegate(uiOptionId) + U32 uiOptionId + +const char * +cfgRuleOptionPrefix(uiOptionId) + U32 uiOptionId + +bool +cfgRuleOptionRequired(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +const char * +cfgRuleOptionSection(uiOptionId) + U32 uiOptionId + +bool +cfgRuleOptionSecure(uiOptionId) + U32 uiOptionId + +I32 +cfgRuleOptionType(uiOptionId); + U32 uiOptionId + +bool +cfgRuleOptionValid(uiCommandId, uiOptionId) + U32 uiCommandId + U32 uiOptionId + +U32 +cfgOptionTotal() + +bool +cfgRuleOptionValueHash(uiOptionId) + U32 uiOptionId + +# Config +# ---------------------------------------------------------------------------------------------------------------------------------- +const char * +cfgCommandName(uiCommandId) + U32 uiCommandId + +I32 +cfgOptionIndexTotal(uiOptionId) + U32 uiOptionId + +const char * +cfgOptionName(uiOptionId) + U32 uiOptionId + +# Page Checksum +# ---------------------------------------------------------------------------------------------------------------------------------- U16 pageChecksum(page, blkno, pageSize) const char * page diff --git a/libc/Makefile.PL b/libc/Makefile.PL index 062ee9dcf..117894d42 100644 --- a/libc/Makefile.PL +++ b/libc/Makefile.PL @@ -1,43 +1,391 @@ +#################################################################################################################################### +# Build Makefile and Auto-Generate Files Required for Build +#################################################################################################################################### use 5.010001; use strict; use warnings FATAL => qw(all); use Carp qw(confess); +use English '-no_match_vars'; +use Cwd qw(abs_path); +use File::Basename qw(dirname); + +use lib dirname($0) . '/../build/lib'; +use lib dirname($0) . '/../lib'; + +#################################################################################################################################### +# Storage object to use for all file operations +#################################################################################################################################### +use pgBackRest::Common::Log; +use pgBackRest::Storage::Local; +use pgBackRest::Storage::Posix::Driver; + +my $strBuildPath = dirname(dirname(abs_path($0))); + +my $oStorage = new pgBackRest::Storage::Local( + $strBuildPath, new pgBackRest::Storage::Posix::Driver({bFileSync => false, bPathSync => false})); + +#################################################################################################################################### +# Build C files required for the library +#################################################################################################################################### +use pgBackRestBuild::Build; + +my $rhBuild = buildAll($strBuildPath); + +#################################################################################################################################### +# Perl function and constant exports +#################################################################################################################################### +use constant BLD_EXPORTTYPE_SUB => 'sub'; +use constant BLD_EXPORTTYPE_CONSTANT => 'constant'; + +my $rhExport = +{ + 'checksum' => + { + &BLD_EXPORTTYPE_SUB => [qw( + pageChecksum + pageChecksumBufferTest + pageChecksumTest + )], + }, + + 'config' => + { + &BLD_EXPORTTYPE_SUB => [qw( + cfgCommandName + cfgOptionIndexTotal + cfgOptionName + )], + }, + + 'configRule' => + { + &BLD_EXPORTTYPE_SUB => [qw( + cfgCommandId + cfgOptionId + cfgRuleOptionAllowList + cfgRuleOptionAllowListValue + cfgRuleOptionAllowListValueTotal + cfgRuleOptionAllowListValueValid + cfgRuleOptionAllowRange + cfgRuleOptionAllowRangeMax + cfgRuleOptionAllowRangeMin + cfgRuleOptionDefault + cfgRuleOptionDepend + cfgRuleOptionDependOption + cfgRuleOptionDependValue + cfgRuleOptionDependValueTotal + cfgRuleOptionDependValueValid + cfgRuleOptionHint + cfgRuleOptionNameAlt + cfgRuleOptionNegate + cfgRuleOptionPrefix + cfgRuleOptionRequired + cfgRuleOptionSection + cfgRuleOptionSecure + cfgRuleOptionType + cfgRuleOptionValid + cfgOptionTotal + cfgRuleOptionValueHash + )], + }, + + 'debug' => + { + &BLD_EXPORTTYPE_CONSTANT => [qw( + UVSIZE + )], + + &BLD_EXPORTTYPE_SUB => [qw( + libCVersion + )], + }, +}; + +#################################################################################################################################### +# Generate LibC.pm +#################################################################################################################################### +use pgBackRest::Common::String; +use pgBackRest::Config::Data; +use pgBackRest::Version; + +use pgBackRestBuild::Build::Common; + +use constant LIB_NAME => 'LibC'; + +# Split text into lines and indent +sub formatText +{ + my $strLine = shift; + my $iLength = shift; + my $iIndent = shift; + + my $strPart; + my $strResult; + my $bFirst = true; + + do + { + ($strPart, $strLine) = stringSplit($strLine, ' ', $iLength - $iIndent); + + $strResult .= ($bFirst ? '' : "\n") . (' ' x $iIndent) . trim($strPart); + + $bFirst = false; + } + while (defined($strLine)); + + return $strResult; +} + +# Build file +{ + # Get current version + my $strVersion = BACKREST_VERSION; + my $bDev = false; + + if ($strVersion =~ /dev$/) + { + $strVersion = substr($strVersion, 0, length($strVersion) - 3) . '.999'; + $bDev = true; + } + + my $strLibC = + 'package ' . BACKREST_NAME . '::' . LIB_NAME . ";\n" . + "\n" . + "use 5.010001;\n" . + "use strict;\n" . + "use warnings;\n" . + "use Carp;\n" . + "\n" . + "require Exporter;\n" . + "use AutoLoader;\n" . + "\n" . + "our \@ISA = qw(Exporter);\n" . + "\n" . + '# Library version' . ($bDev ? " (.999 indicates development version)" : '') . "\n" . + "our \$VERSION = '${strVersion}';\n" . + "\n" . + "sub libCVersion {return \$VERSION};\n"; + + # Generate constants for options that have a list of strings as allowed values + my $bFirst = true; + my $rhOptionRule = cfgdefRule(); + + $strLibC .= + "\n# Configuration option value constants\n" . + "use constant\n" . + "{\n"; + + foreach my $strOption (sort(keys(%{$rhOptionRule}))) + { + my $rhOption = $rhOptionRule->{$strOption}; + + next if $rhOption->{&CFGBLDDEF_RULE_TYPE} ne CFGOPTDEF_TYPE_STRING; + next if $strOption =~ /^log-level-/; + + if (defined($rhOption->{&CFGBLDDEF_RULE_ALLOW_LIST})) + { + $strLibC .= $bFirst ? '' : "\n"; + $bFirst = false; + + foreach my $strValue (@{$rhOption->{&CFGBLDDEF_RULE_ALLOW_LIST}}) + { + my $strConstant = 'CFGOPTVAL_' . uc("${strOption}_${strValue}"); + $strConstant =~ s/\-/\_/g; + + $strLibC .= " ${strConstant}" . (' ' x (69 - length($strConstant) - 4)) . "=> '${strValue}',\n"; + push(@{$rhExport->{'config'}{&BLD_EXPORTTYPE_CONSTANT}}, $strConstant); + } + } + + foreach my $strCommand (sort(keys(%{$rhOption->{&CFGBLDDEF_RULE_COMMAND}}))) + { + my $rhCommand = $rhOption->{&CFGBLDDEF_RULE_COMMAND}{$strCommand}; + + if (defined($rhCommand->{&CFGBLDDEF_RULE_ALLOW_LIST})) + { + $strLibC .= $bFirst ? '' : "\n"; + $bFirst = false; + + foreach my $strValue (@{$rhCommand->{&CFGBLDDEF_RULE_ALLOW_LIST}}) + { + my $strConstant = 'CFGOPTVAL_' . uc("${strCommand}_${strOption}_${strValue}"); + $strConstant =~ s/\-/\_/g; + + $strLibC .= " ${strConstant}" . (' ' x (69 - length($strConstant) - 4)) . "=> '${strValue}',\n"; + push(@{$rhExport->{'config'}{&BLD_EXPORTTYPE_CONSTANT}}, $strConstant); + } + } + } + } + + $strLibC .= + "};\n"; + + # Generate export sections + $bFirst = true; + + $strLibC .= + "\n# Export function and constants\n" . + "our \%EXPORT_TAGS =\n" . + "(\n"; + + foreach my $strPath (sort(keys(%{$rhBuild}))) + { + foreach my $strFile (sort(keys(%{$rhBuild->{$strPath}{&BLD_FILE}}))) + { + my $rhFileConstant = $rhBuild->{$strPath}{&BLD_FILE}{$strFile}{&BLD_CONSTANT_GROUP}; + + foreach my $strConstantGroup (sort(keys(%{$rhFileConstant}))) + { + my $rhConstantGroup = $rhFileConstant->{$strConstantGroup}; + + foreach my $strConstant (sort(keys(%{$rhConstantGroup->{&BLD_CONSTANT}}))) + { + my $rhConstant = $rhConstantGroup->{&BLD_CONSTANT}{$strConstant}; + + if ($rhConstant->{&BLD_CONSTANT_EXPORT}) + { + push(@{$rhExport->{$strFile}{&BLD_EXPORTTYPE_CONSTANT}}, $strConstant); + } + } + } + } + } + + foreach my $strSection (sort(keys(%{$rhExport}))) + { + my $rhExportSection = $rhExport->{$strSection}; + + $strLibC .= ($bFirst ? '' : "\n") . " '${strSection}' => [qw(\n"; + + if (defined($rhExportSection->{&BLD_EXPORTTYPE_CONSTANT}) && @{$rhExportSection->{&BLD_EXPORTTYPE_CONSTANT}} > 0) + { + $strLibC .= formatText(join(' ', sort(@{$rhExportSection->{&BLD_EXPORTTYPE_CONSTANT}})), 132, 8) . "\n"; + } + + if (defined($rhExportSection->{&BLD_EXPORTTYPE_SUB}) && @{$rhExportSection->{&BLD_EXPORTTYPE_SUB}} > 0) + { + $strLibC .= formatText(join(' ', sort(@{$rhExportSection->{&BLD_EXPORTTYPE_SUB}})), 132, 8) . "\n"; + } + + $strLibC .= " )],\n"; + $bFirst = false; + } + + $strLibC .= + ");\n" . + "\n" . + "our \@EXPORT_OK = (\n"; + + foreach my $strSection (sort(keys(%{$rhExport}))) + { + $strLibC .= " \@{\$EXPORT_TAGS{'${strSection}'}},\n"; + } + + $strLibC .= + ");\n" . + "\n" . + "# Nothing is exported by default\n" . + "our \@EXPORT = qw();\n" . + "\n" . + "# Autoload constants from the constant() XS function\n" . + "sub AUTOLOAD\n" . + "{\n" . + " my \$strConstantFunctionName;\n" . + " our \$AUTOLOAD;\n" . + "\n" . + " (\$strConstantFunctionName = \$AUTOLOAD) =~ s/.*:://;\n" . + "\n" . + ' croak "&' . BACKREST_NAME . '::' . LIB_NAME . "::constant not defined\"\n" . + " if \$strConstantFunctionName eq 'constant';\n" . + " my (\$error, \$val) = constant(\$strConstantFunctionName);\n" . + " if (\$error) {croak \$error;}\n" . + "\n" . + " {\n" . + " no strict 'refs';\n" . + " *\$AUTOLOAD = sub {\$val};\n" . + " }\n" . + "\n" . + " goto &\$AUTOLOAD;\n" . + "}\n" . + "\n" . + "require XSLoader;\n" . + "XSLoader::load('" . BACKREST_NAME . '::' . LIB_NAME . "', \$VERSION);\n" . + "\n" . + "1;\n" . + "__END__\n"; + + + my $strLibFile = 'libc/lib/' . BACKREST_NAME . '/' . LIB_NAME . '.pm'; + $oStorage->pathCreate(dirname($strLibFile), {bCreateParent => true, bIgnoreExists => true}); + $oStorage->put($strLibFile, $strLibC); +} + +#################################################################################################################################### +# Build list of constants to export from C and add them to the constant array +#################################################################################################################################### +{ + # Build constants + my @stryConstant; + + foreach my $strSection (sort(keys(%{$rhExport}))) + { + foreach my $strConstant (@{$rhExport->{$strSection}{&BLD_EXPORTTYPE_CONSTANT}}) + { + push(@stryConstant, $strConstant); + } + } + + # Build constant C code + if (eval {require ExtUtils::Constant; 1}) + { + ExtUtils::Constant::WriteConstants + ( + NAME => BACKREST_NAME . '::' . LIB_NAME, + NAMES => \@stryConstant, + DEFAULT_TYPE => 'IV', + C_FILE => 'const-c.inc', + XS_FILE => 'const-xs.inc', + ); + } + else + { + die "ExtUtils::Constant is required to build constants!"; + } +} + +#################################################################################################################################### +# Create C Makefile +#################################################################################################################################### use ExtUtils::MakeMaker; -# See lib/ExtUtils/MakeMaker.pm for details of how to influence -# the contents of the Makefile that is written. WriteMakefile ( - NAME => 'pgBackRest::LibC', - VERSION_FROM => 'lib/pgBackRest/LibC.pm', # finds $VERSION, requires EU::MM from perl >= 5.5 - AUTHOR => 'David Steele ', - CCFLAGS => '-std=c99 -D_FILE_OFFSET_BITS=64 -funroll-loops -ftree-vectorize -ftree-vectorizer-verbose=2 $(CFLAGS)', - LIBS => [''], # e.g., '-lm' - DEFINE => '', # e.g., '-DHAVE_SOMETHING' - INC => '-I.', # e.g., '-I. -I/usr/include/other' - OBJECT => 'LibC.o pageChecksum.o', # link all C files + NAME => BACKREST_NAME . '::LibC', + VERSION_FROM => 'lib/' . BACKREST_NAME . '/LibC.pm', + AUTHOR => 'David Steele ', + + CCFLAGS => join(' ', qw( + -o $@ + -std=c99 + -D_FILE_OFFSET_BITS=64 + -funroll-loops + -ftree-vectorize + $(CFLAGS) + )), + + INC => join(' ', qw( + -I. + -I../src + )), + + C => [qw( + LibC.c + ../src/config/config.c + ../src/config/configRule.c + ../src/postgres/pageChecksum.c + )], + + OBJECT => '$(O_FILES)', ); - -if (eval {require ExtUtils::Constant; 1}) -{ - # List of C constants to export - my @names = - ( - qw(UVSIZE), - ); - - ExtUtils::Constant::WriteConstants - ( - NAME => 'pgBackRest::LibC', - NAMES => \@names, - DEFAULT_TYPE => 'IV', - C_FILE => 'const-c.inc', - XS_FILE => 'const-xs.inc', - ); -} -# Require constants to be built dynamically -else -{ - die "NO FALLBACK - ExtUtils::Constant is required to build constants!"; -} diff --git a/libc/lib/pgBackRest/LibC.pm b/libc/lib/pgBackRest/LibC.pm deleted file mode 100644 index 4912af6e5..000000000 --- a/libc/lib/pgBackRest/LibC.pm +++ /dev/null @@ -1,67 +0,0 @@ -package pgBackRest::LibC; - -use 5.010001; -use strict; -use warnings; -use Carp; - -require Exporter; -use AutoLoader; - -our @ISA = qw(Exporter); - -# Library version (add .999 during development) -our $VERSION = '1.22'; - -sub libCVersion {return $VERSION}; - -# Items to export into caller's namespace by default. Note: do not export names by default without a very good reason. Use EXPORT_OK -# instead. Do not simply export all your public functions/methods/constants. -# -# This allows declaration use pgBackRest::LibC ':all'; If you do not need this, moving things directly into @EXPORT or @EXPORT_OK -# will save memory. -our %EXPORT_TAGS = -( - 'debug' => [qw( - UVSIZE - libCVersion - )], - - 'checksum' => [qw( - pageChecksum - pageChecksumTest - pageChecksumBufferTest - )], -); - -our @EXPORT_OK = (@{$EXPORT_TAGS{'debug'}}, @{$EXPORT_TAGS{'checksum'}}); - -# Nothing is exported by default -our @EXPORT = qw(); - -# This AUTOLOAD is used to 'autoload' constants from the constant() XS function. Nothing in this function needs to be updated to -# add new constants. -sub AUTOLOAD -{ - my $constname; - our $AUTOLOAD; - - ($constname = $AUTOLOAD) =~ s/.*:://; - - croak "&pgBackRest::LibC::constant not defined" if $constname eq 'constant'; - my ($error, $val) = constant($constname); - - if ($error) { croak $error; } - { - no strict 'refs'; - *$AUTOLOAD = sub {$val}; - } - - goto &$AUTOLOAD; -} - -require XSLoader; -XSLoader::load('pgBackRest::LibC', $VERSION); - -1; -__END__ diff --git a/libc/t/config.t b/libc/t/config.t new file mode 100644 index 000000000..ac2a4186d --- /dev/null +++ b/libc/t/config.t @@ -0,0 +1,100 @@ +#################################################################################################################################### +# Config Tests +#################################################################################################################################### +use strict; +use warnings; +use Carp; +use English '-no_match_vars'; + +use Fcntl qw(O_RDONLY); + +# Set number of tests +use Test::More tests => 56; + +# Load the module dynamically so it does not interfere with the test above +use pgBackRest::LibC qw(:config :configRule); + +# Config rule functions +ok (cfgCommandId('archive-push') eq CFGCMD_ARCHIVE_PUSH); +ok (cfgCommandId('restore') eq CFGCMD_RESTORE); + +ok (cfgOptionId('target') eq CFGOPT_TARGET); +ok (cfgOptionId('log-level-console') eq CFGOPT_LOG_LEVEL_CONSOLE); + +ok (cfgRuleOptionAllowList(CFGCMD_BACKUP, CFGOPT_TYPE)); +ok (!cfgRuleOptionAllowList(CFGCMD_BACKUP, CFGOPT_DB_HOST)); + +ok (cfgRuleOptionAllowListValueTotal(CFGCMD_BACKUP, CFGOPT_TYPE) == 3); + +ok (cfgRuleOptionAllowListValue(CFGCMD_BACKUP, CFGOPT_TYPE, 0) eq 'full'); +ok (cfgRuleOptionAllowListValue(CFGCMD_BACKUP, CFGOPT_TYPE, 1) eq 'diff'); +ok (cfgRuleOptionAllowListValue(CFGCMD_BACKUP, CFGOPT_TYPE, 2) eq 'incr'); + +ok (cfgRuleOptionAllowListValueValid(CFGCMD_BACKUP, CFGOPT_TYPE, 'diff')); +ok (!cfgRuleOptionAllowListValueValid(CFGCMD_BACKUP, CFGOPT_TYPE, 'bogus')); + +ok (cfgRuleOptionAllowRange(CFGCMD_BACKUP, CFGOPT_COMPRESS_LEVEL)); +ok (!cfgRuleOptionAllowRange(CFGCMD_BACKUP, CFGOPT_BACKUP_HOST)); + +ok (cfgRuleOptionAllowRangeMin(CFGCMD_BACKUP, CFGOPT_DB_TIMEOUT) == 0.1); +ok (cfgRuleOptionAllowRangeMin(CFGCMD_BACKUP, CFGOPT_COMPRESS_LEVEL) == 0); +ok (cfgRuleOptionAllowRangeMax(CFGCMD_BACKUP, CFGOPT_COMPRESS_LEVEL) == 9); + +ok (cfgRuleOptionDefault(CFGCMD_BACKUP, CFGOPT_COMPRESS_LEVEL) == 6); +ok (!defined(cfgRuleOptionDefault(CFGCMD_BACKUP, CFGOPT_BACKUP_HOST))); + +ok (cfgRuleOptionDepend(CFGCMD_RESTORE, CFGOPT_REPO_S3_KEY)); +ok (!cfgRuleOptionDepend(CFGCMD_RESTORE, CFGOPT_TYPE)); + +ok (cfgRuleOptionDependOption(CFGCMD_BACKUP, CFGOPT_DB_USER) == CFGOPT_DB_HOST); + +ok (cfgRuleOptionDependValueTotal(CFGCMD_RESTORE, CFGOPT_TARGET) == 3); + +ok (cfgRuleOptionDependValue(CFGCMD_RESTORE, CFGOPT_TARGET, 0) eq 'name'); +ok (cfgRuleOptionDependValue(CFGCMD_RESTORE, CFGOPT_TARGET, 1) eq 'time'); +ok (cfgRuleOptionDependValue(CFGCMD_RESTORE, CFGOPT_TARGET, 2) eq 'xid'); + +ok (cfgRuleOptionDependValueValid(CFGCMD_RESTORE, CFGOPT_TARGET, 'time')); +ok (!cfgRuleOptionDependValueValid(CFGCMD_RESTORE, CFGOPT_TARGET, 'bogus')); + +ok (cfgRuleOptionHint(CFGCMD_BACKUP, CFGOPT_DB1_PATH) eq 'does this stanza exist?'); + +ok (cfgOptionIndexTotal(CFGOPT_DB_PATH) == 2); +ok (cfgOptionIndexTotal(CFGOPT_REPO_PATH) == 1); + +ok (cfgRuleOptionNameAlt(CFGOPT_DB1_HOST) eq 'db-host'); +ok (cfgRuleOptionNameAlt(CFGOPT_PROCESS_MAX) eq 'thread-max'); +ok (!defined(cfgRuleOptionNameAlt(CFGOPT_TYPE))); + +ok (cfgRuleOptionNegate(CFGOPT_ONLINE)); +ok (cfgRuleOptionNegate(CFGOPT_COMPRESS)); +ok (!cfgRuleOptionNegate(CFGOPT_TYPE)); + +ok (cfgRuleOptionPrefix(CFGOPT_DB_HOST) eq 'db'); +ok (cfgRuleOptionPrefix(CFGOPT_DB2_HOST) eq 'db'); +ok (!defined(cfgRuleOptionPrefix(CFGOPT_TYPE))); + +ok (cfgRuleOptionRequired(CFGCMD_BACKUP, CFGOPT_CONFIG)); +ok (!cfgRuleOptionRequired(CFGCMD_RESTORE, CFGOPT_BACKUP_HOST)); + +ok (cfgRuleOptionSection(CFGOPT_REPO_S3_KEY) eq 'global'); +ok (!defined(cfgRuleOptionSection(CFGOPT_TYPE))); + +ok (cfgRuleOptionSecure(CFGOPT_REPO_S3_KEY)); +ok (!cfgRuleOptionSecure(CFGOPT_BACKUP_HOST)); + +ok (cfgRuleOptionType(CFGOPT_TYPE) == CFGOPTDEF_TYPE_STRING); +ok (cfgRuleOptionType(CFGOPT_COMPRESS) == CFGOPTDEF_TYPE_BOOLEAN); + +ok (cfgRuleOptionValid(CFGCMD_BACKUP, CFGOPT_TYPE)); +ok (!cfgRuleOptionValid(CFGCMD_INFO, CFGOPT_TYPE)); + +ok (cfgRuleOptionValueHash(CFGOPT_LINK_MAP)); +ok (!cfgRuleOptionValueHash(CFGOPT_TYPE)); + +# Config functions +ok (cfgCommandName(CFGCMD_ARCHIVE_GET) eq 'archive-get'); +ok (cfgCommandName(CFGCMD_BACKUP) eq 'backup'); + +ok (cfgOptionName(CFGOPT_TYPE) eq 'type'); +ok (cfgOptionName(CFGOPT_COMPRESS_LEVEL) eq 'compress-level'); diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 000000000..de4f38f3f --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,3 @@ +config.auto.h +config.auto.c +configRule.auto.c diff --git a/src/common/type.h b/src/common/type.h new file mode 100644 index 000000000..b72d03814 --- /dev/null +++ b/src/common/type.h @@ -0,0 +1,31 @@ +#ifndef TYPE_H +#define TYPE_H + +#include "EXTERN.h" +#include "perl.h" + +/*********************************************************************************************************************************** +Older compilers do not define true/false +***********************************************************************************************************************************/ +#ifndef false + #define false 0 +#endif + +#ifndef true + #define true 1 +#endif + +/*********************************************************************************************************************************** +Define integer types based on Perl portability +***********************************************************************************************************************************/ +typedef U8 uint8; /* == 8 bits */ +typedef U16 uint16; /* == 16 bits */ +typedef U32 uint32; /* == 32 bits */ +typedef UV uint64; /* == 64 bits */ + +typedef I8 int8; /* == 8 bits */ +typedef I16 int16; /* == 16 bits */ +typedef I32 int32; /* == 32 bits */ +typedef IV int64; /* == 64 bits */ + +#endif diff --git a/src/config/config.auto.md b/src/config/config.auto.md new file mode 100644 index 000000000..1ebe2f70c --- /dev/null +++ b/src/config/config.auto.md @@ -0,0 +1,28 @@ +# Query Configuration Settings + +## cfgOptionIndexTotal + +Total index values allowed. + +### Truth Table: + +This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that return `1` are excluded for brevity. + +| Function | uiOptionId | Result | +| -------- | ---------- | ------ | +| cfgOptionIndexTotal | `CFGOPT_DB1_CMD` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB1_CONFIG` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB1_HOST` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB1_PATH` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB1_PORT` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB1_SOCKET_PATH` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB1_SSH_PORT` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB1_USER` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB2_CMD` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB2_CONFIG` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB2_HOST` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB2_PATH` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB2_PORT` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB2_SOCKET_PATH` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB2_SSH_PORT` | `2` | +| cfgOptionIndexTotal | `CFGOPT_DB2_USER` | `2` | diff --git a/src/config/config.c b/src/config/config.c new file mode 100644 index 000000000..468b0c9f0 --- /dev/null +++ b/src/config/config.c @@ -0,0 +1,7 @@ +/*********************************************************************************************************************************** +Command and Option Rules +***********************************************************************************************************************************/ +#include "LibC.h" +#include "config/config.h" + +#include "config.auto.c" diff --git a/src/config/config.h b/src/config/config.h new file mode 100644 index 000000000..3660275fe --- /dev/null +++ b/src/config/config.h @@ -0,0 +1,14 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include "common/type.h" +#include "config/config.auto.h" + +/*********************************************************************************************************************************** +Functions +***********************************************************************************************************************************/ +const char *cfgCommandName(uint32 uiCommandId); +int32 cfgOptionIndexTotal(uint32 uiOptionId); +const char *cfgOptionName(uint32 uiCommandId); + +#endif diff --git a/src/config/configRule.auto.md b/src/config/configRule.auto.md new file mode 100644 index 000000000..55eb5100d --- /dev/null +++ b/src/config/configRule.auto.md @@ -0,0 +1,1338 @@ +# Parse Configuration Settings + +## cfgRuleOptionAllowList + +Is there an allow list for this option? + +### Truth Table: + +This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that return `false` are excluded for brevity. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionAllowList | _\_ | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionAllowList | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionAllowList | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionAllowList | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionAllowList | _\_ | `CFGOPT_OUTPUT` | `true` | +| cfgRuleOptionAllowList | _\_ | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionAllowList | _\_ | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `true` | +| cfgRuleOptionAllowList | _\_ | `CFGOPT_TARGET_ACTION` | `true` | +| cfgRuleOptionAllowList | _\_ | `CFGOPT_TYPE` | `true` | + +## cfgRuleOptionAllowListValue + +Get value from allowed list. + +### Truth Table: + +This function is valid when `cfgRuleOptionAllowList()` = `true`. + +| Function | uiCommandId | uiOptionId | uiValueId | Result | +| -------- | ----------- | ---------- | --------- | ------ | +| cfgRuleOptionAllowListValue | `CFGCMD_BACKUP` | `CFGOPT_TYPE` | `0` | `"full"` | +| cfgRuleOptionAllowListValue | `CFGCMD_BACKUP` | `CFGOPT_TYPE` | `1` | `"diff"` | +| cfgRuleOptionAllowListValue | `CFGCMD_BACKUP` | `CFGOPT_TYPE` | `2` | `"incr"` | +| cfgRuleOptionAllowListValue | `CFGCMD_LOCAL` | `CFGOPT_TYPE` | `0` | `"db"` | +| cfgRuleOptionAllowListValue | `CFGCMD_LOCAL` | `CFGOPT_TYPE` | `1` | `"backup"` | +| cfgRuleOptionAllowListValue | `CFGCMD_REMOTE` | `CFGOPT_TYPE` | `0` | `"db"` | +| cfgRuleOptionAllowListValue | `CFGCMD_REMOTE` | `CFGOPT_TYPE` | `1` | `"backup"` | +| cfgRuleOptionAllowListValue | `CFGCMD_RESTORE` | `CFGOPT_TYPE` | `0` | `"name"` | +| cfgRuleOptionAllowListValue | `CFGCMD_RESTORE` | `CFGOPT_TYPE` | `1` | `"time"` | +| cfgRuleOptionAllowListValue | `CFGCMD_RESTORE` | `CFGOPT_TYPE` | `2` | `"xid"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `0` | `"16384"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `1` | `"32768"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `2` | `"65536"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `3` | `"131072"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `4` | `"262144"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `5` | `"524288"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `6` | `"1048576"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `7` | `"2097152"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `8` | `"4194304"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `9` | `"8388608"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_BUFFER_SIZE` | `10` | `"16777216"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `0` | `"off"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `1` | `"error"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `2` | `"warn"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `3` | `"info"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `4` | `"detail"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `5` | `"debug"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `6` | `"trace"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `0` | `"off"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `1` | `"error"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `2` | `"warn"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `3` | `"info"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `4` | `"detail"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `5` | `"debug"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `6` | `"trace"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `0` | `"off"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `1` | `"error"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `2` | `"warn"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `3` | `"info"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `4` | `"detail"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `5` | `"debug"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `6` | `"trace"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_OUTPUT` | `0` | `"text"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_OUTPUT` | `1` | `"json"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_REPO_TYPE` | `0` | `"cifs"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_REPO_TYPE` | `1` | `"posix"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_REPO_TYPE` | `2` | `"s3"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `0` | `"full"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `1` | `"diff"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `2` | `"incr"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_TARGET_ACTION` | `0` | `"pause"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_TARGET_ACTION` | `1` | `"promote"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_TARGET_ACTION` | `2` | `"shutdown"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_TYPE` | `3` | `"preserve"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_TYPE` | `4` | `"none"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_TYPE` | `5` | `"immediate"` | +| cfgRuleOptionAllowListValue | _\_ | `CFGOPT_TYPE` | `6` | `"default"` | + +## cfgRuleOptionAllowListValueTotal + +Total number of values allowed. + +### Truth Table: + +This function is valid when `cfgRuleOptionAllowList()` = `true`. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionAllowListValueTotal | `CFGCMD_BACKUP` | `CFGOPT_TYPE` | `3` | +| cfgRuleOptionAllowListValueTotal | `CFGCMD_LOCAL` | `CFGOPT_TYPE` | `2` | +| cfgRuleOptionAllowListValueTotal | `CFGCMD_REMOTE` | `CFGOPT_TYPE` | `2` | +| cfgRuleOptionAllowListValueTotal | `CFGCMD_RESTORE` | `CFGOPT_TYPE` | `7` | +| cfgRuleOptionAllowListValueTotal | _\_ | `CFGOPT_BUFFER_SIZE` | `11` | +| cfgRuleOptionAllowListValueTotal | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `7` | +| cfgRuleOptionAllowListValueTotal | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `7` | +| cfgRuleOptionAllowListValueTotal | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `7` | +| cfgRuleOptionAllowListValueTotal | _\_ | `CFGOPT_OUTPUT` | `2` | +| cfgRuleOptionAllowListValueTotal | _\_ | `CFGOPT_REPO_TYPE` | `3` | +| cfgRuleOptionAllowListValueTotal | _\_ | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `3` | +| cfgRuleOptionAllowListValueTotal | _\_ | `CFGOPT_TARGET_ACTION` | `3` | + +## cfgRuleOptionAllowRange + +Is the option constrained to a range? + +### Truth Table: + +This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that return `false` are excluded for brevity. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionAllowRange | _\_ | `CFGOPT_ARCHIVE_TIMEOUT` | `true` | +| cfgRuleOptionAllowRange | _\_ | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionAllowRange | _\_ | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionAllowRange | _\_ | `CFGOPT_DB_TIMEOUT` | `true` | +| cfgRuleOptionAllowRange | _\_ | `CFGOPT_PROCESS_MAX` | `true` | +| cfgRuleOptionAllowRange | _\_ | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionAllowRange | _\_ | `CFGOPT_RETENTION_ARCHIVE` | `true` | +| cfgRuleOptionAllowRange | _\_ | `CFGOPT_RETENTION_DIFF` | `true` | +| cfgRuleOptionAllowRange | _\_ | `CFGOPT_RETENTION_FULL` | `true` | + +## cfgRuleOptionAllowRangeMax + +Maximum value allowed (if the option is constrained to a range). + +### Truth Table: + +This function is valid when `cfgRuleOptionAllowRange()` = `true`. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionAllowRangeMax | _\_ | `CFGOPT_ARCHIVE_TIMEOUT` | `86400` | +| cfgRuleOptionAllowRangeMax | _\_ | `CFGOPT_COMPRESS_LEVEL` | `9` | +| cfgRuleOptionAllowRangeMax | _\_ | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `9` | +| cfgRuleOptionAllowRangeMax | _\_ | `CFGOPT_DB_TIMEOUT` | `604800` | +| cfgRuleOptionAllowRangeMax | _\_ | `CFGOPT_PROCESS_MAX` | `96` | +| cfgRuleOptionAllowRangeMax | _\_ | `CFGOPT_PROTOCOL_TIMEOUT` | `604800` | +| cfgRuleOptionAllowRangeMax | _\_ | `CFGOPT_RETENTION_ARCHIVE` | `999999999` | +| cfgRuleOptionAllowRangeMax | _\_ | `CFGOPT_RETENTION_DIFF` | `999999999` | +| cfgRuleOptionAllowRangeMax | _\_ | `CFGOPT_RETENTION_FULL` | `999999999` | + +## cfgRuleOptionAllowRangeMin + +Minimum value allowed (if the option is constrained to a range). + +### Truth Table: + +This function is valid when `cfgRuleOptionAllowRange()` = `true`. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionAllowRangeMin | _\_ | `CFGOPT_ARCHIVE_TIMEOUT` | `0.1` | +| cfgRuleOptionAllowRangeMin | _\_ | `CFGOPT_COMPRESS_LEVEL` | `0` | +| cfgRuleOptionAllowRangeMin | _\_ | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `0` | +| cfgRuleOptionAllowRangeMin | _\_ | `CFGOPT_DB_TIMEOUT` | `0.1` | +| cfgRuleOptionAllowRangeMin | _\_ | `CFGOPT_PROCESS_MAX` | `1` | +| cfgRuleOptionAllowRangeMin | _\_ | `CFGOPT_PROTOCOL_TIMEOUT` | `0.1` | +| cfgRuleOptionAllowRangeMin | _\_ | `CFGOPT_RETENTION_ARCHIVE` | `1` | +| cfgRuleOptionAllowRangeMin | _\_ | `CFGOPT_RETENTION_DIFF` | `1` | +| cfgRuleOptionAllowRangeMin | _\_ | `CFGOPT_RETENTION_FULL` | `1` | + +## cfgRuleOptionDefault + +Default value. + +### Truth Table: + +This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that return `NULL` are excluded for brevity. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionDefault | `CFGCMD_BACKUP` | `CFGOPT_TYPE` | `"incr"` | +| cfgRuleOptionDefault | `CFGCMD_RESTORE` | `CFGOPT_TYPE` | `"default"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_ARCHIVE_ASYNC` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_ARCHIVE_CHECK` | `"1"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_ARCHIVE_COPY` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_ARCHIVE_TIMEOUT` | `"60"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_BACKUP_CONFIG` | `"/etc/pgbackrest.conf"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_BACKUP_STANDBY` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_BACKUP_USER` | `"backrest"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_BUFFER_SIZE` | `"4194304"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_CMD_SSH` | `"ssh"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_COMPRESS` | `"1"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_COMPRESS_LEVEL` | `"6"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `"3"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_CONFIG` | `"/etc/pgbackrest.conf"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB_TIMEOUT` | `"1800"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB1_CONFIG` | `"/etc/pgbackrest.conf"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB1_PORT` | `"5432"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB1_USER` | `"postgres"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB2_CONFIG` | `"/etc/pgbackrest.conf"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB2_PORT` | `"5432"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DB2_USER` | `"postgres"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_DELTA` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_FORCE` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_HARDLINK` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_LINK_ALL` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_LOCK_PATH` | `"/tmp/pgbackrest"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `"warn"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `"info"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `"warn"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_LOG_PATH` | `"/var/log/pgbackrest"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_LOG_TIMESTAMP` | `"1"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_MANIFEST_SAVE_THRESHOLD` | `"1073741824"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_NEUTRAL_UMASK` | `"1"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_ONLINE` | `"1"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_OUTPUT` | `"text"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_PROCESS_MAX` | `"1"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_PROTOCOL_TIMEOUT` | `"1830"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_REPO_PATH` | `"/var/lib/pgbackrest"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_REPO_S3_VERIFY_SSL` | `"1"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_REPO_TYPE` | `"posix"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_RESUME` | `"1"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `"full"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_SET` | `"latest"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_SPOOL_PATH` | `"/var/spool/pgbackrest"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_START_FAST` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_STOP_AUTO` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_TARGET_ACTION` | `"pause"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_TARGET_EXCLUSIVE` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_TEST` | `"0"` | +| cfgRuleOptionDefault | _\_ | `CFGOPT_TEST_DELAY` | `"5"` | + +## cfgRuleOptionDepend + +Does the option have a dependency on another option? + +### Truth Table: + +This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that return `false` are excluded for brevity. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionDepend | `CFGCMD_BACKUP` | `CFGOPT_FORCE` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_ARCHIVE_CHECK` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_ARCHIVE_COPY` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB1_CMD` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB1_CONFIG` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB1_SSH_PORT` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB1_USER` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB2_CMD` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB2_CONFIG` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_RECOVERY_OPTION` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_SPOOL_PATH` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_TARGET` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_TARGET_ACTION` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_TARGET_EXCLUSIVE` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_TARGET_TIMELINE` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_TEST_DELAY` | `true` | +| cfgRuleOptionDepend | _\_ | `CFGOPT_TEST_POINT` | `true` | + +## cfgRuleOptionDependOption + +Name of the option that this option depends in order to be set. + +### Truth Table: + +This function is valid when `cfgRuleOptionDepend()` = `true`. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_ARCHIVE_CHECK` | `CFGOPT_ONLINE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_ARCHIVE_COPY` | `CFGOPT_ARCHIVE_CHECK` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_BACKUP_CMD` | `CFGOPT_BACKUP_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_BACKUP_CONFIG` | `CFGOPT_BACKUP_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_BACKUP_SSH_PORT` | `CFGOPT_BACKUP_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_BACKUP_USER` | `CFGOPT_BACKUP_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB1_CMD` | `CFGOPT_DB1_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB1_CONFIG` | `CFGOPT_DB1_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB1_SSH_PORT` | `CFGOPT_DB1_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB1_USER` | `CFGOPT_DB1_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB2_CMD` | `CFGOPT_DB2_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB2_CONFIG` | `CFGOPT_DB2_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB2_SSH_PORT` | `CFGOPT_DB2_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_DB2_USER` | `CFGOPT_DB2_HOST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_FORCE` | `CFGOPT_ONLINE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_RECOVERY_OPTION` | `CFGOPT_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_REPO_S3_BUCKET` | `CFGOPT_REPO_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_REPO_S3_CA_FILE` | `CFGOPT_REPO_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_REPO_S3_CA_PATH` | `CFGOPT_REPO_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_REPO_S3_ENDPOINT` | `CFGOPT_REPO_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_REPO_S3_HOST` | `CFGOPT_REPO_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_REPO_S3_KEY` | `CFGOPT_REPO_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_REPO_S3_KEY_SECRET` | `CFGOPT_REPO_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_REPO_S3_REGION` | `CFGOPT_REPO_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_REPO_S3_VERIFY_SSL` | `CFGOPT_REPO_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_SPOOL_PATH` | `CFGOPT_ARCHIVE_ASYNC` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_TARGET` | `CFGOPT_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_TARGET_ACTION` | `CFGOPT_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_TARGET_EXCLUSIVE` | `CFGOPT_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_TARGET_TIMELINE` | `CFGOPT_TYPE` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_TEST_DELAY` | `CFGOPT_TEST` | +| cfgRuleOptionDependOption | _\_ | `CFGOPT_TEST_POINT` | `CFGOPT_TEST` | + +## cfgRuleOptionDependValue + +The depend option must have one of these values before this option is set. + +### Truth Table: + +This function is valid when `cfgRuleOptionDepend()` = `true`. + +| Function | uiCommandId | uiOptionId | uiValueId | Result | +| -------- | ----------- | ---------- | --------- | ------ | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_ARCHIVE_CHECK` | `0` | `"1"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_ARCHIVE_COPY` | `0` | `"1"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_FORCE` | `0` | `"0"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_RECOVERY_OPTION` | `0` | `"default"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_RECOVERY_OPTION` | `1` | `"name"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_RECOVERY_OPTION` | `2` | `"time"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_RECOVERY_OPTION` | `3` | `"xid"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_REPO_S3_BUCKET` | `0` | `"s3"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_REPO_S3_CA_FILE` | `0` | `"s3"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_REPO_S3_CA_PATH` | `0` | `"s3"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_REPO_S3_ENDPOINT` | `0` | `"s3"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_REPO_S3_HOST` | `0` | `"s3"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_REPO_S3_KEY` | `0` | `"s3"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_REPO_S3_KEY_SECRET` | `0` | `"s3"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_REPO_S3_REGION` | `0` | `"s3"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_REPO_S3_VERIFY_SSL` | `0` | `"s3"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_SPOOL_PATH` | `0` | `"1"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET` | `0` | `"name"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET` | `1` | `"time"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET` | `2` | `"xid"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET_ACTION` | `0` | `"name"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET_ACTION` | `1` | `"time"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET_ACTION` | `2` | `"xid"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET_EXCLUSIVE` | `0` | `"time"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET_EXCLUSIVE` | `1` | `"xid"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET_TIMELINE` | `0` | `"default"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET_TIMELINE` | `1` | `"name"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET_TIMELINE` | `2` | `"time"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TARGET_TIMELINE` | `3` | `"xid"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TEST_DELAY` | `0` | `"1"` | +| cfgRuleOptionDependValue | _\_ | `CFGOPT_TEST_POINT` | `0` | `"1"` | + +## cfgRuleOptionDependValueTotal + +Total depend values for this option. + +### Truth Table: + +This function is valid when `cfgRuleOptionDepend()` = `true`. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_ARCHIVE_CHECK` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_ARCHIVE_COPY` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_BACKUP_CMD` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_BACKUP_CONFIG` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_BACKUP_SSH_PORT` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_BACKUP_USER` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB1_CMD` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB1_CONFIG` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB1_SSH_PORT` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB1_USER` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB2_CMD` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB2_CONFIG` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB2_SSH_PORT` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_DB2_USER` | `0` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_FORCE` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_RECOVERY_OPTION` | `4` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_REPO_S3_BUCKET` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_REPO_S3_CA_FILE` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_REPO_S3_CA_PATH` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_REPO_S3_ENDPOINT` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_REPO_S3_HOST` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_REPO_S3_KEY` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_REPO_S3_KEY_SECRET` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_REPO_S3_REGION` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_REPO_S3_VERIFY_SSL` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_SPOOL_PATH` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_TARGET` | `3` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_TARGET_ACTION` | `3` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_TARGET_EXCLUSIVE` | `2` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_TARGET_TIMELINE` | `4` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_TEST_DELAY` | `1` | +| cfgRuleOptionDependValueTotal | _\_ | `CFGOPT_TEST_POINT` | `1` | + +## cfgRuleOptionHint + +Some clue as to what value the user should provide when the option is missing but required. + +### Truth Table: + +This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that return `NULL` are excluded for brevity. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionHint | _\_ | `CFGOPT_DB1_PATH` | `"does this stanza exist?"` | +| cfgRuleOptionHint | _\_ | `CFGOPT_DB2_PATH` | `"does this stanza exist?"` | + +## cfgRuleOptionNameAlt + +Alternate name for the option primarily used for deprecated names. + +### Truth Table: + +This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that return `NULL` are excluded for brevity. + +| Function | uiOptionId | Result | +| -------- | ---------- | ------ | +| cfgRuleOptionNameAlt | `CFGOPT_DB1_CMD` | `"db-cmd"` | +| cfgRuleOptionNameAlt | `CFGOPT_DB1_CONFIG` | `"db-config"` | +| cfgRuleOptionNameAlt | `CFGOPT_DB1_HOST` | `"db-host"` | +| cfgRuleOptionNameAlt | `CFGOPT_DB1_PATH` | `"db-path"` | +| cfgRuleOptionNameAlt | `CFGOPT_DB1_PORT` | `"db-port"` | +| cfgRuleOptionNameAlt | `CFGOPT_DB1_SOCKET_PATH` | `"db-socket-path"` | +| cfgRuleOptionNameAlt | `CFGOPT_DB1_SSH_PORT` | `"db-ssh-port"` | +| cfgRuleOptionNameAlt | `CFGOPT_DB1_USER` | `"db-user"` | +| cfgRuleOptionNameAlt | `CFGOPT_PROCESS_MAX` | `"thread-max"` | + +## cfgRuleOptionNegate + +Can the boolean option be negated? + +### Truth Table: + +Permutations that return `false` are excluded for brevity. + +| Function | uiOptionId | Result | +| -------- | ---------- | ------ | +| cfgRuleOptionNegate | `CFGOPT_ARCHIVE_ASYNC` | `true` | +| cfgRuleOptionNegate | `CFGOPT_ARCHIVE_CHECK` | `true` | +| cfgRuleOptionNegate | `CFGOPT_ARCHIVE_COPY` | `true` | +| cfgRuleOptionNegate | `CFGOPT_BACKUP_STANDBY` | `true` | +| cfgRuleOptionNegate | `CFGOPT_CHECKSUM_PAGE` | `true` | +| cfgRuleOptionNegate | `CFGOPT_COMPRESS` | `true` | +| cfgRuleOptionNegate | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionNegate | `CFGOPT_HARDLINK` | `true` | +| cfgRuleOptionNegate | `CFGOPT_LINK_ALL` | `true` | +| cfgRuleOptionNegate | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionNegate | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionNegate | `CFGOPT_ONLINE` | `true` | +| cfgRuleOptionNegate | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionNegate | `CFGOPT_RESUME` | `true` | +| cfgRuleOptionNegate | `CFGOPT_START_FAST` | `true` | +| cfgRuleOptionNegate | `CFGOPT_STOP_AUTO` | `true` | + +## cfgRuleOptionPrefix + +Prefix when the option has an index > 1 (e.g. "db"). + +### Truth Table: + +Permutations that return `NULL` are excluded for brevity. + +| Function | uiOptionId | Result | +| -------- | ---------- | ------ | +| cfgRuleOptionPrefix | `CFGOPT_DB1_CMD` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB1_CONFIG` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB1_HOST` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB1_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB1_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB1_SOCKET_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB1_SSH_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB1_USER` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB2_CMD` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB2_CONFIG` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB2_HOST` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB2_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB2_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB2_SOCKET_PATH` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB2_SSH_PORT` | `"db"` | +| cfgRuleOptionPrefix | `CFGOPT_DB2_USER` | `"db"` | + +## cfgRuleOptionRequired + +Is the option required? + +### Truth Table: + +This function is valid when `cfgRuleOptionValid()` = `true`. Permutations that return `false` are excluded for brevity. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionRequired | `CFGCMD_ARCHIVE_GET` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionRequired | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionRequired | `CFGCMD_BACKUP` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionRequired | `CFGCMD_BACKUP` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionRequired | `CFGCMD_CHECK` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionRequired | `CFGCMD_CHECK` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionRequired | `CFGCMD_EXPIRE` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionRequired | `CFGCMD_LOCAL` | `CFGOPT_PROCESS` | `true` | +| cfgRuleOptionRequired | `CFGCMD_LOCAL` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionRequired | `CFGCMD_RESTORE` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionRequired | `CFGCMD_RESTORE` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionRequired | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionRequired | `CFGCMD_STANZA_CREATE` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionRequired | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionRequired | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_ARCHIVE_ASYNC` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_ARCHIVE_CHECK` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_ARCHIVE_COPY` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_ARCHIVE_TIMEOUT` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_BACKUP_STANDBY` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_COMMAND` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_COMPRESS` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_DB_TIMEOUT` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_DB1_CONFIG` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_DB1_PORT` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_DELTA` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_FORCE` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_HARDLINK` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_HOST_ID` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_LINK_ALL` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_MANIFEST_SAVE_THRESHOLD` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_ONLINE` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_OUTPUT` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_PROCESS_MAX` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_RESUME` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_SET` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_SPOOL_PATH` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_START_FAST` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_STOP_AUTO` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_TARGET` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_TARGET_ACTION` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_TARGET_EXCLUSIVE` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_TEST` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_TEST_DELAY` | `true` | +| cfgRuleOptionRequired | _\_ | `CFGOPT_TYPE` | `true` | + +## cfgRuleOptionSection + +Section that the option belongs in, NULL means command-line only. + +### Truth Table: + +Permutations that return `NULL` are excluded for brevity. + +| Function | uiOptionId | Result | +| -------- | ---------- | ------ | +| cfgRuleOptionSection | `CFGOPT_ARCHIVE_ASYNC` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_ARCHIVE_CHECK` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_ARCHIVE_COPY` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_ARCHIVE_MAX_MB` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_ARCHIVE_QUEUE_MAX` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_ARCHIVE_TIMEOUT` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_BACKUP_CMD` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_BACKUP_CONFIG` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_BACKUP_HOST` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_BACKUP_SSH_PORT` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_BACKUP_STANDBY` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_BACKUP_USER` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_BUFFER_SIZE` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_CHECKSUM_PAGE` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_CMD_SSH` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_COMPRESS` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_COMPRESS_LEVEL` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB_INCLUDE` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB_TIMEOUT` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB1_CMD` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB1_CONFIG` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB1_HOST` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB1_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB1_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB1_SOCKET_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB1_SSH_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB1_USER` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB2_CMD` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB2_CONFIG` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_DB2_HOST` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB2_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB2_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB2_SOCKET_PATH` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB2_SSH_PORT` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_DB2_USER` | `"stanza"` | +| cfgRuleOptionSection | `CFGOPT_HARDLINK` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_LINK_ALL` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_LINK_MAP` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_LOCK_PATH` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_LOG_LEVEL_CONSOLE` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_LOG_LEVEL_FILE` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_LOG_LEVEL_STDERR` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_LOG_PATH` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_LOG_TIMESTAMP` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_MANIFEST_SAVE_THRESHOLD` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_NEUTRAL_UMASK` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_PROCESS_MAX` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_PROTOCOL_TIMEOUT` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_RECOVERY_OPTION` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_PATH` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_S3_BUCKET` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_S3_CA_FILE` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_S3_CA_PATH` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_S3_ENDPOINT` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_S3_HOST` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_S3_KEY` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_S3_KEY_SECRET` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_S3_REGION` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_S3_VERIFY_SSL` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_REPO_TYPE` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_RESUME` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_RETENTION_ARCHIVE` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_RETENTION_DIFF` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_RETENTION_FULL` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_SPOOL_PATH` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_START_FAST` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_STOP_AUTO` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_TABLESPACE_MAP` | `"global"` | +| cfgRuleOptionSection | `CFGOPT_TABLESPACE_MAP_ALL` | `"global"` | + +## cfgRuleOptionSecure + +Secure options can never be passed on the commmand-line. + +### Truth Table: + +Permutations that return `false` are excluded for brevity. + +| Function | uiOptionId | Result | +| -------- | ---------- | ------ | +| cfgRuleOptionSecure | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionSecure | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | + +## cfgRuleOptionType + +Secure options can never be passed on the commmand-line. + +### Truth Table: + +| Function | uiOptionId | Result | +| -------- | ---------- | ------ | +| cfgRuleOptionType | `CFGOPT_ARCHIVE_ASYNC` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_ARCHIVE_CHECK` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_ARCHIVE_COPY` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_ARCHIVE_MAX_MB` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_ARCHIVE_QUEUE_MAX` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_ARCHIVE_TIMEOUT` | `CFGOPTDEF_TYPE_FLOAT` | +| cfgRuleOptionType | `CFGOPT_BACKUP_CMD` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_BACKUP_CONFIG` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_BACKUP_HOST` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_BACKUP_SSH_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_BACKUP_STANDBY` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_BACKUP_USER` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_BUFFER_SIZE` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_CHECKSUM_PAGE` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_CMD_SSH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_COMMAND` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_COMPRESS` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_COMPRESS_LEVEL` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_CONFIG` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB_INCLUDE` | `CFGOPTDEF_TYPE_HASH` | +| cfgRuleOptionType | `CFGOPT_DB_TIMEOUT` | `CFGOPTDEF_TYPE_FLOAT` | +| cfgRuleOptionType | `CFGOPT_DB1_CMD` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB1_CONFIG` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB1_HOST` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB1_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB1_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB1_SOCKET_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB1_SSH_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB1_USER` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB2_CMD` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB2_CONFIG` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB2_HOST` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB2_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB2_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB2_SOCKET_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DB2_SSH_PORT` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_DB2_USER` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_DELTA` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_FORCE` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_HARDLINK` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_HOST_ID` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_LINK_ALL` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_LINK_MAP` | `CFGOPTDEF_TYPE_HASH` | +| cfgRuleOptionType | `CFGOPT_LOCK_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_LOG_LEVEL_CONSOLE` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_LOG_LEVEL_FILE` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_LOG_LEVEL_STDERR` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_LOG_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_LOG_TIMESTAMP` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_MANIFEST_SAVE_THRESHOLD` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_NEUTRAL_UMASK` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_ONLINE` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_OUTPUT` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_PROCESS` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_PROCESS_MAX` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_PROTOCOL_TIMEOUT` | `CFGOPTDEF_TYPE_FLOAT` | +| cfgRuleOptionType | `CFGOPT_RECOVERY_OPTION` | `CFGOPTDEF_TYPE_HASH` | +| cfgRuleOptionType | `CFGOPT_REPO_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_REPO_S3_BUCKET` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_REPO_S3_CA_FILE` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_REPO_S3_CA_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_REPO_S3_ENDPOINT` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_REPO_S3_HOST` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_REPO_S3_KEY` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_REPO_S3_KEY_SECRET` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_REPO_S3_REGION` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_REPO_S3_VERIFY_SSL` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_REPO_TYPE` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_RESUME` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_RETENTION_ARCHIVE` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_RETENTION_DIFF` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_RETENTION_FULL` | `CFGOPTDEF_TYPE_INTEGER` | +| cfgRuleOptionType | `CFGOPT_SET` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_SPOOL_PATH` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_STANZA` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_START_FAST` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_STOP_AUTO` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_TABLESPACE_MAP` | `CFGOPTDEF_TYPE_HASH` | +| cfgRuleOptionType | `CFGOPT_TABLESPACE_MAP_ALL` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_TARGET` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_TARGET_ACTION` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_TARGET_EXCLUSIVE` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_TARGET_TIMELINE` | `CFGOPTDEF_TYPE_STRING` | +| cfgRuleOptionType | `CFGOPT_TEST` | `CFGOPTDEF_TYPE_BOOLEAN` | +| cfgRuleOptionType | `CFGOPT_TEST_DELAY` | `CFGOPTDEF_TYPE_FLOAT` | +| cfgRuleOptionType | `CFGOPT_TEST_POINT` | `CFGOPTDEF_TYPE_HASH` | +| cfgRuleOptionType | `CFGOPT_TYPE` | `CFGOPTDEF_TYPE_STRING` | + +## cfgRuleOptionValid + +Is the option valid for this command? + +### Truth Table: + +Permutations that return `false` are excluded for brevity. + +| Function | uiCommandId | uiOptionId | Result | +| -------- | ----------- | ---------- | ------ | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_BACKUP_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_COMPRESS` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_GET` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_ARCHIVE_ASYNC` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_ARCHIVE_MAX_MB` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_ARCHIVE_QUEUE_MAX` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_ARCHIVE_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_BACKUP_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_COMPRESS` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB1_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB1_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB2_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_PROCESS_MAX` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_SPOOL_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_TEST` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_TEST_DELAY` | `true` | +| cfgRuleOptionValid | `CFGCMD_ARCHIVE_PUSH` | `CFGOPT_TEST_POINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_ARCHIVE_CHECK` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_ARCHIVE_COPY` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_ARCHIVE_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_BACKUP_STANDBY` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_CHECKSUM_PAGE` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_COMPRESS` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB1_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB1_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB1_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB1_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB1_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB1_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB1_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_FORCE` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_HARDLINK` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_MANIFEST_SAVE_THRESHOLD` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_ONLINE` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_PROCESS_MAX` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_RESUME` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_RETENTION_ARCHIVE` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_RETENTION_DIFF` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_RETENTION_FULL` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_START_FAST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_STOP_AUTO` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_TEST` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_TEST_DELAY` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_TEST_POINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_BACKUP` | `CFGOPT_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_ARCHIVE_CHECK` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_ARCHIVE_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_BACKUP_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_BACKUP_STANDBY` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB1_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB1_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB1_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB1_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB1_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB1_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB1_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_ONLINE` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_CHECK` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB1_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB1_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB1_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB1_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB2_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB2_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB2_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_RETENTION_ARCHIVE` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_RETENTION_ARCHIVE_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_RETENTION_DIFF` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_RETENTION_FULL` | `true` | +| cfgRuleOptionValid | `CFGCMD_EXPIRE` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_BACKUP_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_OUTPUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_INFO` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_BACKUP_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_COMMAND` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB1_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB1_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB1_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB1_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB1_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB1_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB2_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB2_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB2_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB2_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_HOST_ID` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_PROCESS` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_LOCAL` | `CFGOPT_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_COMMAND` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB1_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB1_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB2_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_DB2_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_PROCESS` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_REMOTE` | `CFGOPT_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_BACKUP_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_COMPRESS` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB_INCLUDE` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_DELTA` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_FORCE` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_LINK_ALL` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_LINK_MAP` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_PROCESS_MAX` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_RECOVERY_OPTION` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_SET` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_TABLESPACE_MAP` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_TABLESPACE_MAP_ALL` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_TARGET` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_TARGET_ACTION` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_TARGET_EXCLUSIVE` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_TARGET_TIMELINE` | `true` | +| cfgRuleOptionValid | `CFGCMD_RESTORE` | `CFGOPT_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_BACKUP_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_BACKUP_STANDBY` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB1_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB1_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB1_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB1_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB1_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB1_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB1_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_FORCE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_ONLINE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_CREATE` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_BACKUP_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_BACKUP_STANDBY` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_BUFFER_SIZE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_COMPRESS_LEVEL` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_COMPRESS_LEVEL_NETWORK` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB1_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB1_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB1_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB1_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB1_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB1_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB1_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB1_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_SOCKET_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_DB2_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_ONLINE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_PROTOCOL_TIMEOUT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STANZA_UPGRADE` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_BACKUP_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB1_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB1_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB1_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB1_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB2_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB2_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB2_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_START` | `CFGOPT_STANZA` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_BACKUP_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_BACKUP_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_BACKUP_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_BACKUP_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_BACKUP_USER` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_CMD_SSH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB1_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB1_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB1_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB1_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB2_CMD` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB2_CONFIG` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB2_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_DB2_SSH_PORT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_FORCE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_LOCK_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_LOG_LEVEL_CONSOLE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_LOG_LEVEL_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_LOG_LEVEL_STDERR` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_LOG_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_LOG_TIMESTAMP` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_NEUTRAL_UMASK` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_S3_BUCKET` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_S3_CA_FILE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_S3_CA_PATH` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_S3_ENDPOINT` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_S3_HOST` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_S3_KEY` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_S3_KEY_SECRET` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_S3_REGION` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_S3_VERIFY_SSL` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_REPO_TYPE` | `true` | +| cfgRuleOptionValid | `CFGCMD_STOP` | `CFGOPT_STANZA` | `true` | + +## cfgRuleOptionValueHash + +Is the option a true hash or just a list of keys? + +### Truth Table: + +Permutations that return `false` are excluded for brevity. + +| Function | uiOptionId | Result | +| -------- | ---------- | ------ | +| cfgRuleOptionValueHash | `CFGOPT_LINK_MAP` | `true` | +| cfgRuleOptionValueHash | `CFGOPT_RECOVERY_OPTION` | `true` | +| cfgRuleOptionValueHash | `CFGOPT_TABLESPACE_MAP` | `true` | +| cfgRuleOptionValueHash | `CFGOPT_TEST_POINT` | `true` | diff --git a/src/config/configRule.c b/src/config/configRule.c new file mode 100644 index 000000000..7d146ea86 --- /dev/null +++ b/src/config/configRule.c @@ -0,0 +1,57 @@ +/*********************************************************************************************************************************** +Command and Option Rules +***********************************************************************************************************************************/ +#include "config.h" +#include "configRule.h" + +#include "configRule.auto.c" + +/*********************************************************************************************************************************** +cfgCommandTotal - total number of commands +***********************************************************************************************************************************/ +uint32 +cfgCommandTotal() +{ + return CFGCMDDEF_TOTAL; +} + +/*********************************************************************************************************************************** +cfgOptionTotal - total number of configuration options +***********************************************************************************************************************************/ +uint32 +cfgOptionTotal() +{ + return CFGOPTDEF_TOTAL; +} + +/*********************************************************************************************************************************** +cfgRuleOptionAllowListValueValid - check if the value matches a value in the allow list +***********************************************************************************************************************************/ +bool +cfgRuleOptionAllowListValueValid(uint32 uiCommandId, uint32 uiOptionId, const char *szValue) +{ + if (szValue != NULL) + { + for (uint32 uiIndex = 0; uiIndex < cfgRuleOptionAllowListValueTotal(uiCommandId, uiOptionId); uiIndex++) + if (strcmp(szValue, cfgRuleOptionAllowListValue(uiCommandId, uiOptionId, uiIndex)) == 0) + return true; + } + + return false; +} + +/*********************************************************************************************************************************** +cfgRuleOptionDependValueValid - check if the value matches a value in the allow list +***********************************************************************************************************************************/ +bool +cfgRuleOptionDependValueValid(uint32 uiCommandId, uint32 uiOptionId, const char *szValue) +{ + if (szValue != NULL) + { + for (uint32 uiIndex = 0; uiIndex < cfgRuleOptionDependValueTotal(uiCommandId, uiOptionId); uiIndex++) + if (strcmp(szValue, cfgRuleOptionDependValue(uiCommandId, uiOptionId, uiIndex)) == 0) + return true; + } + + return false; +} diff --git a/src/config/configRule.h b/src/config/configRule.h new file mode 100644 index 000000000..3e2a279d4 --- /dev/null +++ b/src/config/configRule.h @@ -0,0 +1,40 @@ +#ifndef CONFIG_RULE_H +#define CONFIG_RULE_H + +#include "common/type.h" + +/*********************************************************************************************************************************** +Functions +***********************************************************************************************************************************/ +int32 cfgCommandId(const char *szCommandName); +int32 cfgOptionId(const char *szOptionName); +bool cfgRuleOptionAllowListValueValid(uint32 uiCommandId, uint32 uiOptionId, const char *szValue); +bool cfgRuleOptionDependValueValid(uint32 uiCommandId, uint32 uiOptionId, const char *szValue); +uint32 cfgOptionTotal(); + +/*********************************************************************************************************************************** +Auto-Generated Functions +***********************************************************************************************************************************/ +bool cfgRuleOptionAllowList(uint32 uiCommandId, uint32 uiOptionId); +const char * cfgRuleOptionAllowListValue(uint32 uiCommandId, uint32 uiOptionId, uint32 uiValueId); +int32 cfgRuleOptionAllowListValueTotal(uint32 uiCommandId, uint32 uiOptionId); +bool cfgRuleOptionAllowRange(uint32 uiCommandId, uint32 uiOptionId); +double cfgRuleOptionAllowRangeMax(uint32 uiCommandId, uint32 uiOptionId); +double cfgRuleOptionAllowRangeMin(uint32 uiCommandId, uint32 uiOptionId); +const char * cfgRuleOptionDefault(uint32 uiCommandId, uint32 uiOptionId); +bool cfgRuleOptionDepend(uint32 uiCommandId, uint32 uiOptionId); +int32 cfgRuleOptionDependOption(uint32 uiCommandId, uint32 uiOptionId); +const char *cfgRuleOptionDependValue(uint32 uiCommandId, uint32 uiOptionId, uint32 uiValueId); +int32 cfgRuleOptionDependValueTotal(uint32 uiCommandId, uint32 uiOptionId); +const char *cfgRuleOptionHint(uint32 uiCommandId, uint32 uiOptionId); +const char *cfgRuleOptionNameAlt(uint32 uiOptionId); +bool cfgRuleOptionNegate(uint32 uiOptionId); +const char *cfgRuleOptionPrefix(uint32 uiOptionId); +bool cfgRuleOptionRequired(uint32 uiCommandId, uint32 uiOptionId); +const char *cfgRuleOptionSection(uint32 uiOptionId); +bool cfgRuleOptionSecure(uint32 uiOptionId); +int32 cfgRuleOptionType(uint32 uiOptionId); +bool cfgRuleOptionValid(uint32 uiCommandId, uint32 uiOptionId); +bool cfgRuleOptionValueHash(uint32 uiOptionId); + +#endif diff --git a/libc/pageChecksum.c b/src/postgres/pageChecksum.c similarity index 100% rename from libc/pageChecksum.c rename to src/postgres/pageChecksum.c diff --git a/src/postgres/pageChecksum.h b/src/postgres/pageChecksum.h new file mode 100644 index 000000000..448c4e541 --- /dev/null +++ b/src/postgres/pageChecksum.h @@ -0,0 +1,15 @@ +#ifndef PAGE_CHECKSUM_H +#define PAGE_CHECKSUM_H + +#include "common/type.h" + +/*********************************************************************************************************************************** +Functions +***********************************************************************************************************************************/ +uint16 pageChecksum(const char *szPage, uint32 uiBlockNo, uint32 uiPageSize); +bool pageChecksumTest(const char *szPage, uint32 uiBlockNo, uint32 uiPageSize, uint32 uiIgnoreWalId, uint32 uiIgnoreWalOffset); +bool pageChecksumBufferTest( + const char *szPageBuffer, uint32 uiBufferSize, uint32 uiBlockNoStart, uint32 uiPageSize, uint32 uiIgnoreWalId, + uint32 uiIgnoreWalOffset); + +#endif diff --git a/test/expect/archive-stop-001.log b/test/expect/archive-stop-001.log index 2dc6aff76..f3b74af23 100644 --- a/test/expect/archive-stop-001.log +++ b/test/expect/archive-stop-001.log @@ -4,7 +4,7 @@ run 001 - rmt 0, cmp 0, error version, s3 0 stanza-create db - create required data for stanza (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info diff --git a/test/expect/archive-stop-002.log b/test/expect/archive-stop-002.log index 9147fc9ef..c9544efcf 100644 --- a/test/expect/archive-stop-002.log +++ b/test/expect/archive-stop-002.log @@ -4,7 +4,7 @@ run 002 - rmt 0, cmp 1, error version, s3 0 stanza-create db - create required data for stanza (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info diff --git a/test/expect/archive-stop-003.log b/test/expect/archive-stop-003.log index 6afdc14a8..28d17d308 100644 --- a/test/expect/archive-stop-003.log +++ b/test/expect/archive-stop-003.log @@ -4,7 +4,7 @@ run 003 - rmt 1, cmp 0, error version, s3 0 stanza-create db - create required data for stanza (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info diff --git a/test/expect/archive-stop-004.log b/test/expect/archive-stop-004.log index 552499e14..a8fa6a9ee 100644 --- a/test/expect/archive-stop-004.log +++ b/test/expect/archive-stop-004.log @@ -4,7 +4,7 @@ run 004 - rmt 1, cmp 0, error connect, s3 0 stanza-create db - create required data for stanza (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info diff --git a/test/expect/archive-stop-005.log b/test/expect/archive-stop-005.log index 590800870..5068e48cb 100644 --- a/test/expect/archive-stop-005.log +++ b/test/expect/archive-stop-005.log @@ -4,7 +4,7 @@ run 005 - rmt 1, cmp 1, error version, s3 0 stanza-create db - create required data for stanza (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info diff --git a/test/expect/archive-stop-006.log b/test/expect/archive-stop-006.log index f180c8144..87684f4b6 100644 --- a/test/expect/archive-stop-006.log +++ b/test/expect/archive-stop-006.log @@ -4,7 +4,7 @@ run 006 - rmt 1, cmp 1, error connect, s3 0 stanza-create db - create required data for stanza (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info diff --git a/test/expect/archive-stop-007.log b/test/expect/archive-stop-007.log index 25ce733d3..4585fb03b 100644 --- a/test/expect/archive-stop-007.log +++ b/test/expect/archive-stop-007.log @@ -4,7 +4,7 @@ run 007 - rmt 1, cmp 0, error connect, s3 1 stanza-create db - create required data for stanza (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info diff --git a/test/expect/expire-expire-001.log b/test/expect/expire-expire-001.log index a0ba9d3a0..a81cb228d 100644 --- a/test/expect/expire-expire-001.log +++ b/test/expect/expire-expire-001.log @@ -297,7 +297,7 @@ db-version="9.2" Nothing to expire > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=1 --retention-diff=1 --retention-archive-type=full --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db P00 DETAIL: archive retention on backup [BACKUP-FULL-1], archiveId = 9.2-1, start = 000000010000000000000000 P00 DETAIL: no archive to remove, archiveId = 9.2-1 P00 INFO: expire command end: completed successfully @@ -896,7 +896,7 @@ db-version="9.2" Expire oldest full backup, archive expire falls on segment major boundary > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=1 --retention-diff=1 --retention-archive-type=full --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db P00 INFO: expire full backup set: [BACKUP-FULL-1], [BACKUP-INCR-1] P00 INFO: remove expired backup [BACKUP-INCR-1] P00 INFO: remove expired backup [BACKUP-FULL-1] @@ -1258,7 +1258,7 @@ db-version="9.2" Expire oldest full backup > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=1 --retention-diff=1 --retention-archive-type=full --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=1 --retention-archive-type=full --retention-diff=1 --retention-full=1 --stanza=db P00 INFO: expire diff backup [BACKUP-DIFF-1] P00 INFO: remove expired backup [BACKUP-DIFF-1] P00 DETAIL: archive retention on backup [BACKUP-FULL-2], archiveId = 9.2-1, start = 000000010000000100000000 @@ -1907,7 +1907,7 @@ db-version="9.2" Expire oldest diff backup, archive expire does not fall on major segment boundary > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=1 --retention-diff=1 --retention-archive-type=diff --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=1 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=1 --stanza=db P00 INFO: expire full backup set: [BACKUP-FULL-2], [BACKUP-DIFF-2] P00 INFO: remove expired backup [BACKUP-DIFF-2] P00 INFO: remove expired backup [BACKUP-FULL-2] @@ -2025,7 +2025,7 @@ db-version="9.2" Expire oldest diff backup (cascade to incr) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=1 --retention-diff=1 --retention-archive-type=diff --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=1 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=1 --stanza=db P00 INFO: expire diff backup set: [BACKUP-DIFF-3], [BACKUP-INCR-2] P00 INFO: remove expired backup [BACKUP-INCR-2] P00 INFO: remove expired backup [BACKUP-DIFF-3] @@ -2134,7 +2134,7 @@ db-version="9.2" Expire archive based on newest incr backup > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=1 --retention-diff=1 --retention-archive-type=incr --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=1 --retention-archive-type=incr --retention-diff=1 --retention-full=1 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=1 --retention-archive-type=incr --retention-diff=1 --retention-full=1 --stanza=db P00 DETAIL: archive retention on backup [BACKUP-FULL-3], archiveId = 9.2-1, start = 000000010000000200000010, stop = 000000010000000200000012 P00 DETAIL: archive retention on backup [BACKUP-DIFF-4], archiveId = 9.2-1, start = 00000001000000020000001E, stop = 000000010000000200000020 P00 DETAIL: archive retention on backup [BACKUP-INCR-3], archiveId = 9.2-1, start = 000000010000000200000024 @@ -2269,7 +2269,7 @@ db-version="9.2" Expire diff treating full as diff > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=2 --retention-diff=1 --retention-archive-type=diff --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=2 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=2 --stanza=db P00 INFO: expire full backup set: [BACKUP-FULL-3], [BACKUP-DIFF-4], [BACKUP-INCR-3] P00 INFO: expire diff backup [BACKUP-DIFF-5] P00 INFO: remove expired backup [BACKUP-DIFF-5] @@ -2400,7 +2400,7 @@ db-version="9.2" Expire diff with retention-archive with warning retention-diff not set > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-archive-type=diff --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=1 --retention-archive-type=diff --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=1 --retention-archive-type=diff --stanza=db P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 WARN: option 'retention-diff' is not set for 'retention-archive-type=diff' @@ -2554,7 +2554,7 @@ db-version="9.2" Expire full with retention-archive with warning retention-full not set > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-archive-type=full --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=1 --retention-archive-type=full --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=1 --retention-archive-type=full --stanza=db P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DETAIL: archive retention on backup [BACKUP-FULL-4], archiveId = 9.2-1, start = 00000001000000020000002A, stop = 00000001000000020000002C @@ -2718,7 +2718,7 @@ db-version="9.2" Expire no archive with warning since retention-archive not set for INCR > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=1 --retention-diff=1 --retention-archive-type=incr expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive-type=incr --retention-diff=1 --retention-full=1 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive-type=incr --retention-diff=1 --retention-full=1 --stanza=db P00 WARN: WAL segments will not be expired: option 'retention-archive-type=incr' but option 'retention-archive' is not set P00 INFO: expire full backup [BACKUP-FULL-4] P00 INFO: expire full backup [BACKUP-FULL-5] @@ -2893,7 +2893,7 @@ db-version="9.2" Expire no archive with warning since neither retention-archive nor retention-diff is set > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-archive-type=diff expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive-type=diff --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive-type=diff --stanza=db P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 WARN: WAL segments will not be expired: option 'retention-archive-type=diff' but neither option 'retention-archive' nor option 'retention-diff' is set @@ -3079,7 +3079,7 @@ db-version="9.2" Use oldest full backup for archive retention > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=10 --retention-diff=10 --retention-archive-type=full --retention-archive=10 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=10 --retention-archive-type=full --retention-diff=10 --retention-full=10 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=10 --retention-archive-type=full --retention-diff=10 --retention-full=10 --stanza=db P00 INFO: full backup total < 10 - using oldest full backup for 9.2-1 archive retention P00 DETAIL: archive retention on backup [BACKUP-FULL-8], archiveId = 9.2-1, start = 000000010000000200000054 P00 DETAIL: remove archive: archiveId = 9.2-1, start = 00000001000000020000002A, stop = 000000010000000200000050 diff --git a/test/expect/expire-expire-002.log b/test/expect/expire-expire-002.log index 2987477d8..37f0d38e6 100644 --- a/test/expect/expire-expire-002.log +++ b/test/expect/expire-expire-002.log @@ -63,7 +63,7 @@ db-version="9.2" Create backups in current db version > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-archive-type=diff expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive-type=diff --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive-type=diff --stanza=db P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 WARN: WAL segments will not be expired: option 'retention-archive-type=diff' but neither option 'retention-archive' nor option 'retention-diff' is set @@ -469,7 +469,7 @@ db-version="9.3" Upgrade stanza and expire only earliest db backup and archive > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=3 --retention-archive-type=full expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive-type=full --retention-full=3 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive-type=full --retention-full=3 --stanza=db P00 INFO: expire full backup set: [BACKUP-FULL-1], [BACKUP-INCR-1] P00 INFO: remove expired backup [BACKUP-INCR-1] P00 INFO: remove expired backup [BACKUP-FULL-1] @@ -1137,7 +1137,7 @@ db-version="9.5" Upgrade the stanza, create full back - earliest db orphaned archive removed and earliest full backup and archive in previous db version removed > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=2 --retention-archive-type=full expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive-type=full --retention-full=2 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive-type=full --retention-full=2 --stanza=db P00 INFO: expire full backup [BACKUP-FULL-2] P00 INFO: expire full backup set: [BACKUP-FULL-3], [BACKUP-INCR-2] P00 INFO: remove expired backup [BACKUP-INCR-2] @@ -1287,7 +1287,7 @@ db-version="9.5" Expire all archive last full backup through pitr > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=3 --retention-diff=1 --retention-archive-type=diff --retention-archive=1 expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=3 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=1 --retention-archive-type=diff --retention-diff=1 --retention-full=3 --stanza=db P00 INFO: expire diff backup [BACKUP-DIFF-1] P00 INFO: remove expired backup [BACKUP-DIFF-1] P00 DETAIL: archive retention on backup [BACKUP-FULL-4], archiveId = 9.3-2, start = 0000000100000000000000FF @@ -1430,7 +1430,7 @@ db-version="9.5" Expire all archive except for the current database > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config="[TEST_PATH]/db-master/pgbackrest.conf" --stanza=db --log-level-console=detail --retention-full=2 --retention-archive-type=full expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive-type=full --retention-full=2 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive-type=full --retention-full=2 --stanza=db P00 INFO: expire full backup [BACKUP-FULL-4] P00 INFO: remove expired backup [BACKUP-FULL-4] P00 INFO: remove archive path: [TEST_PATH]/db-master/repo/archive/db/9.3-2 diff --git a/test/expect/help-help-001.log b/test/expect/help-help-001.log index eccd53030..c57b2d6fe 100644 --- a/test/expect/help-help-001.log +++ b/test/expect/help-help-001.log @@ -37,7 +37,7 @@ Get version. Displays installed pgBackRest version. -> [BACKREST-BIN] help --output=json --stanza=main info +> [BACKREST-BIN] help --output=json --stanza=main --backup-host=backup info ------------------------------------------------------------------------------------------------------------------------------------ [BACKREST-NAME-VERSION] - 'info' command help @@ -85,6 +85,7 @@ Repository Options: --backup-config pgBackRest backup host configuration file [default=/etc/pgbackrest.conf] --backup-host backup host when operating remotely via SSH +[current=backup] --backup-ssh-port backup server SSH port when backup-host is set --backup-user backup host user when backup-host is set [default=backrest] @@ -117,3 +118,94 @@ The following output types are supported: current: json default: text + +> [BACKREST-BIN] help check +------------------------------------------------------------------------------------------------------------------------------------ +[BACKREST-NAME-VERSION] - 'check' command help + +Check the configuration. + +The check command validates that pgBackRest and the archive_command setting are +configured correctly for archiving and backups. It detects misconfigurations, +particularly in archiving, that result in incomplete backups because required +WAL segments did not reach the archive. The command can be run on the database +or the backup host. The command may also be run on the standby host, however, +since pg_switch_xlog() cannot be performed on the standby, the command will +only test the repository configuration. + +Note that pg_create_restore_point('pgBackRest Archive Check') and +pg_switch_xlog() are called to force PostgreSQL to archive a WAL segment. +Restore points are only supported in PostgreSQL >= 9.1 so for older versions +the check command may fail if there has been no write activity since the last +log rotation, therefore it is recommended that activity be generated by the +user if there have been no writes since the last xlog switch before running the +check command. + +Command Options: + + --archive-check check that WAL segments are present in the archive +before backup completes [default=y] + --archive-timeout archive timeout [default=60] + --backup-standby backup from the standby cluster [default=n] + --online check an online cluster [default=y] + +General Options: + + --buffer-size buffer size for file operations [default=4194304] + --cmd-ssh path to ssh client executable [default=ssh] + --compress-level compression level for stored files [default=6] + --compress-level-network compression level for network transfer when +compress=n [default=3] + --config pgBackRest configuration file +[default=/etc/pgbackrest.conf] + --db-timeout database query timeout [default=1800] + --neutral-umask use a neutral umask [default=y] + --protocol-timeout protocol timeout [default=1830] + --stanza defines the stanza + +Log Options: + + --log-level-console level for console logging [default=warn] + --log-level-file level for file logging [default=info] + --log-level-stderr level for stderr logging [default=warn] + --log-path path where log files are stored +[default=/var/log/pgbackrest] + --log-timestamp enable timestamp in logging [default=y] + +Repository Options: + + --backup-cmd pgBackRest exe path on the backup host + --backup-config pgBackRest backup host configuration file +[default=/etc/pgbackrest.conf] + --backup-host backup host when operating remotely via SSH + --backup-ssh-port backup server SSH port when backup-host is set + --backup-user backup host user when backup-host is set +[default=backrest] + --repo-path repository path where WAL segments and backups +stored [default=/var/lib/pgbackrest] + --repo-s3-bucket s3 repository bucket + --repo-s3-ca-file s3 SSL CA File + --repo-s3-ca-path s3 SSL CA Path + --repo-s3-endpoint s3 repository endpoint + --repo-s3-host s3 repository host + --repo-s3-key s3 repository access key + --repo-s3-key-secret s3 repository secret access key + --repo-s3-region s3 repository region + --repo-s3-verify-ssl verify S3 server certificate [default=y] + --repo-type type of storage used for the repository +[default=posix] + +Stanza Options: + + --db-cmd pgBackRest exe path on the database host + --db-config pgBackRest database host configuration file +[default=/etc/pgbackrest.conf] + --db-host cluster host for operating remotely via SSH + --db-path cluster data directory + --db-port cluster port [default=5432] + --db-socket-path cluster unix socket path + --db-ssh-port database server SSH port when db-host is set + --db-user cluster host logon user when db-host is set +[default=postgres] + +Use 'pgbackrest help check [option]' for more information. diff --git a/test/expect/mock-all-001.log b/test/expect/mock-all-001.log index 76b5ac0c1..af73b641d 100644 --- a/test/expect/mock-all-001.log +++ b/test/expect/mock-all-001.log @@ -14,7 +14,7 @@ info all stanzas - no stanzas exist (db-master host) stanza-create db - create required data for stanza (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -52,7 +52,7 @@ db-version="9.4" full backup - error on identical link destinations (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [070]: link [TEST_PATH]/db-master/db/base/postgresql.conf (../pg_config) references a subdirectory of or the same directory as link [TEST_PATH]/db-master/db/base/pg_config_bad (../../db/pg_config) @@ -61,7 +61,7 @@ P00 INFO: backup command end: aborted with exception [070] full backup - error on link to a link (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [070]: link '[TEST_PATH]/db-master/db/base/postgresql.conf.bad' -> '../pg_config/postgresql.conf.link' cannot reference another link @@ -70,7 +70,7 @@ P00 INFO: backup command end: aborted with exception [070] full backup - create pg_stat link, pg_clog dir (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --manifest-save-threshold=3 --buffer-size=16384 --checksum-page --process-max=1 --repo-type=cifs --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --buffer-size=16384 --checksum-page --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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 --manifest-save-threshold=3 --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --repo-type=cifs --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --buffer-size=16384 --checksum-page --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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 --manifest-save-threshold=3 --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --repo-type=cifs --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 16384, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -149,8 +149,8 @@ P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/base/1/PG_VERSION, pg_data/base/1/PG_VERSION, 3, [undef], 0, [BACKUP-FULL-1], 0, [MODIFICATION-TIME-1], 1, [undef]), strKey = pg_data/base/1/PG_VERSION, strOp = backupFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/PG_VERSION, pg_data/PG_VERSION, 3, [undef], 0, [BACKUP-FULL-1], 0, [MODIFICATION-TIME-1], 1, [undef]), strKey = pg_data/PG_VERSION, strOp = backupFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->hostConnect: start local process: iHostConfigIdx = 1, iHostIdx = 0, iHostProcessIdx = 0, iProcessId = 1, strHostType = db -P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --buffer-size=16384 --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --repo-type=cifs --stanza=db --type=db local -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 16384, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --buffer-size=16384 --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --repo-type=cifs --stanza=db --type=db local, strId = 'local-1', strName = local +P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --buffer-size=16384 --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --repo-type=cifs --stanza=db --type=db local +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 16384, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --buffer-size=16384 --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --repo-type=cifs --stanza=db --type=db local, strId = 'local-1', strName = local P00 DEBUG: Protocol::Local::Process->hostConnect=>: bResult = true P00 DEBUG: Protocol::Local::Process->init: init local process: iDirection = 1, iHostIdx = 0, iProcessId = 1, iQueueIdx = 0, iQueueLastIdx = 0 P00 DEBUG: Protocol::Local::Process->init=>: bResult = true @@ -265,7 +265,7 @@ P00 DEBUG: Storage::Local->openWrite(): bAtomic = , bPathCreate = pathSync(): bRecurse = , strPathExp = [TEST_PATH]/db-master/repo/backup/db P00 DEBUG: Storage::Local->pathSync(): bRecurse = , strPathExp = P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=16384 --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --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 --repo-type=cifs --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=16384 --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 --repo-type=cifs --stanza=db P00 DEBUG: Backup::Info->new(): bIgnoreMissing = , bLoad = , bRequired = , bValidate = , oStorage = <[object]>, strBackupClusterPath = [TEST_PATH]/db-master/repo/backup/db P00 DEBUG: Storage::Local->openRead(): bIgnoreMissing = true, rhyFilter = [undef], xFileExp = [TEST_PATH]/db-master/repo/backup/db/backup.info P00 DEBUG: Backup::Info->reconstruct(): bRequired = , bSave = , iCatalogVersion = [undef], iControlVersion = [undef], strDbVersion = [undef], ullDbSysId = [undef] @@ -425,7 +425,7 @@ full backup - invalid cmd line (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --type=full --stanza=bogus backup ------------------------------------------------------------------------------------------------------------------------------------ STDERR: -ERROR [037]: : backup command requires option: db-path +ERROR [037]: : backup command requires option: db1-path HINT: does this stanza exist? stop all stanzas (db-master host) @@ -444,7 +444,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 full backup - abort backup - local (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --type=full --stanza=db backup --test --test-delay=5 --test-point=backup-start=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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 --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=5 --test-point=backup-start=y --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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 --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=5 --test-point=backup-start=y --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -514,7 +514,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 63 full backup - global stop (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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 --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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 --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -557,7 +557,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 full backup - stanza stop (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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 --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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 --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -609,7 +609,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 full backup - resume (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --force --checksum-page --type=full --stanza=db backup --test --test-delay=0.2 --test-point=backup-resume=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --checksum-page --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --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 --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-resume=y --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --checksum-page --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --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 --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-resume=y --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -706,8 +706,8 @@ P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/base/1/PG_VERSION, pg_data/base/1/PG_VERSION, 3, 184473f470864e067ee3a22e64b47b0a1c356f29, 0, [BACKUP-FULL-2], 0, [MODIFICATION-TIME-1], 1, [undef]), strKey = pg_data/base/1/PG_VERSION, strOp = backupFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/PG_VERSION, pg_data/PG_VERSION, 3, [undef], 0, [BACKUP-FULL-2], 0, [MODIFICATION-TIME-1], 1, [undef]), strKey = pg_data/PG_VERSION, strOp = backupFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->hostConnect: start local process: iHostConfigIdx = 1, iHostIdx = 0, iHostProcessIdx = 0, iProcessId = 1, strHostType = db -P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local, strId = 'local-1', strName = local +P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local, strId = 'local-1', strName = local P00 DEBUG: Protocol::Local::Process->hostConnect=>: bResult = true P00 DEBUG: Protocol::Local::Process->init: init local process: iDirection = 1, iHostIdx = 0, iProcessId = 1, iQueueIdx = 0, iQueueLastIdx = 0 P00 DEBUG: Protocol::Local::Process->init=>: bResult = true @@ -773,7 +773,7 @@ P00 DEBUG: Storage::Local->openWrite(): bAtomic = , bPathCreate = pathSync(): bRecurse = , strPathExp = [TEST_PATH]/db-master/repo/backup/db P00 DEBUG: Storage::Local->pathSync(): bRecurse = , strPathExp = P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --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: expire 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: Backup::Info->new(): bIgnoreMissing = , bLoad = , bRequired = , bValidate = , oStorage = <[object]>, strBackupClusterPath = [TEST_PATH]/db-master/repo/backup/db P00 DEBUG: Storage::Local->openRead(): bIgnoreMissing = true, rhyFilter = [undef], xFileExp = [TEST_PATH]/db-master/repo/backup/db/backup.info P00 DEBUG: Backup::Info->reconstruct(): bRequired = , bSave = , iCatalogVersion = [undef], iControlVersion = [undef], strDbVersion = [undef], ullDbSysId = [undef] @@ -932,7 +932,7 @@ db-version="9.4" full backup - invalid repo (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --repo-path=/bogus_path --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/bogus_path --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/bogus_path --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [073]: repo-path '/bogus_path' does not exist @@ -941,7 +941,7 @@ P00 INFO: backup command end: aborted with exception [073] restore delta, backup '[BACKUP-FULL-2]' - add and delete files (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --set=[BACKUP-FULL-2] --link-all --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --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 --repo-path=[TEST_PATH]/db-master/repo --set=[BACKUP-FULL-2] --stanza=db +P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --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 --repo-path=[TEST_PATH]/db-master/repo --set=[BACKUP-FULL-2] --stanza=db P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp P00 DEBUG: Storage::Local->pathExists(): strPathExp = P00 DEBUG: Storage::Local->pathExists=>: bExists = true @@ -1103,8 +1103,8 @@ P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/base/1/PG_VERSION, 3, [MODIFICATION-TIME-1], 184473f470864e067ee3a22e64b47b0a1c356f29, 0, 0, pg_data/base/1/PG_VERSION, [undef], 0660, [USER-1], [GROUP-1], [MODIFICATION-TIME-3], 1, [BACKUP-FULL-2], 0), strKey = pg_data/base/1/PG_VERSION, strOp = restoreFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/PG_VERSION, 3, [MODIFICATION-TIME-1], 184473f470864e067ee3a22e64b47b0a1c356f29, 0, 0, pg_data/PG_VERSION, [undef], 0600, [USER-1], [GROUP-1], [MODIFICATION-TIME-3], 1, [BACKUP-FULL-2], 0), strKey = pg_data/PG_VERSION, strOp = restoreFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->hostConnect: start local process: iHostConfigIdx = 1, iHostIdx = 0, iHostProcessIdx = 0, iProcessId = 1, strHostType = backup -P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=restore --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=backup local -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=restore --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=backup local, strId = 'local-1', strName = local +P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=restore --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=backup local +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=restore --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=backup local, strId = 'local-1', strName = local P00 DEBUG: Protocol::Local::Process->hostConnect=>: bResult = true P00 DEBUG: Protocol::Local::Process->init: init local process: iDirection = 1, iHostIdx = 0, iProcessId = 1, iQueueIdx = 0, iQueueLastIdx = 0 P00 DEBUG: Protocol::Local::Process->init=>: bResult = true @@ -1185,7 +1185,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf restore delta, backup '[BACKUP-FULL-2]' - fix broken symlink (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --set=[BACKUP-FULL-2] --link-all --log-level-console=detail --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --delta --link-all --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-FULL-2] --stanza=db +P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --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=detail --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 --set=[BACKUP-FULL-2] --stanza=db P00 INFO: restore backup set [BACKUP-FULL-2] P00 WARN: backup group for pg_data/base/16384/PG_VERSION was not mapped to a name, set to [GROUP-1] P00 WARN: backup user for pg_data/base/1/PG_VERSION was not mapped to a name, set to [USER-1] @@ -1220,7 +1220,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf restore delta, backup '[BACKUP-FULL-2]' - restore all links by mapping (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --set=[BACKUP-FULL-2] --log-level-console=detail --link-map=pg_stat=../pg_stat --link-map=postgresql.conf=../pg_config/postgresql.conf --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --delta --link-map=pg_stat=../pg_stat --link-map=postgresql.conf=../pg_config/postgresql.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-FULL-2] --stanza=db +P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --delta --link-map=pg_stat=../pg_stat --link-map=postgresql.conf=../pg_config/postgresql.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-FULL-2] --stanza=db P00 INFO: restore backup set [BACKUP-FULL-2] P00 WARN: backup group for pg_data/base/16384/PG_VERSION was not mapped to a name, set to [GROUP-1] P00 WARN: backup user for pg_data/base/1/PG_VERSION was not mapped to a name, set to [USER-1] @@ -1284,7 +1284,7 @@ P00 ERROR: [038]: unable to restore while PostgreSQL is running restore delta, backup '[BACKUP-FULL-2]' - restore all links --link-all and mapping (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --set=[BACKUP-FULL-2] --log-level-console=detail --link-map=pg_stat=../pg_stat --link-all --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --delta --link-all --link-map=pg_stat=../pg_stat --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-FULL-2] --stanza=db +P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --delta --link-all --link-map=pg_stat=../pg_stat --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-FULL-2] --stanza=db P00 INFO: restore backup set [BACKUP-FULL-2] P00 WARN: backup group for pg_data/base/16384/PG_VERSION was not mapped to a name, set to [GROUP-1] P00 WARN: backup user for pg_data/base/1/PG_VERSION was not mapped to a name, set to [USER-1] @@ -1316,7 +1316,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf restore delta, force, backup '[BACKUP-FULL-2]', expect exit 40 - fail on missing PG_VERSION (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --force --set=[BACKUP-FULL-2] --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --delta --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-FULL-2] --stanza=db +P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --delta --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-FULL-2] --stanza=db P00 WARN: --delta or --force specified but unable to find 'PG_VERSION' or 'backup.manifest' in '[TEST_PATH]/db-master/db/base' to confirm that this is a valid $PGDATA directory. --delta and --force have been disabled and if any files exist in the destination directories the restore will be aborted. P00 INFO: restore backup set [BACKUP-FULL-2] P00 WARN: backup group for pg_data/base/16384/PG_VERSION was not mapped to a name, set to [GROUP-1] @@ -1330,7 +1330,7 @@ P00 INFO: restore command end: aborted with exception [040] restore delta, force, backup '[BACKUP-FULL-2]' - restore succeeds with backup.manifest file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --force --set=[BACKUP-FULL-2] --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --delta --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-FULL-2] --stanza=db +P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --delta --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-FULL-2] --stanza=db P00 INFO: restore backup set [BACKUP-FULL-2] P00 WARN: backup group for pg_data/base/16384/PG_VERSION was not mapped to a name, set to [GROUP-1] P00 WARN: group bogus in manifest cannot be used for restore, set to [USER-1] @@ -1367,7 +1367,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf incr backup - invalid database version (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [051]: database version = 9.4, system-id 6353949018581704918 does not match backup version = 8.0, system-id = 6353949018581704918 @@ -1377,7 +1377,7 @@ P00 INFO: backup command end: aborted with exception [051] incr backup - invalid system id (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [051]: database version = 9.4, system-id 6353949018581704918 does not match backup version = 9.4, system-id = 6999999999999999999 @@ -1387,7 +1387,7 @@ P00 INFO: backup command end: aborted with exception [051] incr backup - invalid control version (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [051]: database control-version = 942, catalog-version 201409291 does not match backup control-version = 842, catalog-version = 201409291 @@ -1397,7 +1397,7 @@ P00 INFO: backup command end: aborted with exception [051] incr backup - invalid catalog version (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [051]: database control-version = 942, catalog-version 201409291 does not match backup control-version = 942, catalog-version = 197208141 @@ -1407,7 +1407,7 @@ P00 INFO: backup command end: aborted with exception [051] incr backup - invalid path in pg_tblspc (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1418,7 +1418,7 @@ P00 INFO: backup command end: aborted with exception [069] incr backup - invalid relative tablespace is ../ (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1429,7 +1429,7 @@ P00 INFO: backup command end: aborted with exception [071] incr backup - invalid relative tablespace is .. (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1440,7 +1440,7 @@ P00 INFO: backup command end: aborted with exception [071] incr backup - invalid relative tablespace is ../../$PGDATA (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1451,7 +1451,7 @@ P00 INFO: backup command end: aborted with exception [071] incr backup - invalid relative tablespace is ../../$PGDATA (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1462,7 +1462,7 @@ P00 INFO: backup command end: aborted with exception [071] incr backup - tablespace link references a link (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1473,7 +1473,7 @@ P00 INFO: backup command end: aborted with exception [070] incr backup - invalid relative tablespace in $PGDATA (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1484,7 +1484,7 @@ P00 INFO: backup command end: aborted with exception [071] incr backup - $PGDATA is a substring of valid tblspc excluding / (file missing err expected) (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1495,7 +1495,7 @@ P00 INFO: backup command end: aborted with exception [055] incr backup - invalid tablespace in $PGDATA (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1506,7 +1506,7 @@ P00 INFO: backup command end: aborted with exception [071] incr backup - add tablespace 1 (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --test --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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 --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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 --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -1591,8 +1591,8 @@ P00 DEBUG: Backup::Backup->processManifest: reference pg_data/base/16384/PG P00 DEBUG: Backup::Backup->processManifest: reference pg_data/base/1/PG_VERSION to [BACKUP-FULL-2] P00 DEBUG: Backup::Backup->processManifest: reference pg_data/PG_VERSION to [BACKUP-FULL-2] P00 DEBUG: Protocol::Local::Process->hostConnect: start local process: iHostConfigIdx = 1, iHostIdx = 0, iHostProcessIdx = 0, iProcessId = 1, strHostType = db -P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local, strId = 'local-1', strName = local +P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local, strId = 'local-1', strName = local P00 DEBUG: Protocol::Local::Process->hostConnect=>: bResult = true P00 DEBUG: Protocol::Local::Process->init: init local process: iDirection = 1, iHostIdx = 0, iProcessId = 1, iQueueIdx = 0, iQueueLastIdx = 1 P00 DEBUG: Protocol::Local::Process->init=>: bResult = true @@ -1629,7 +1629,7 @@ P00 DEBUG: Storage::Local->openWrite(): bAtomic = , bPathCreate = pathSync(): bRecurse = , strPathExp = [TEST_PATH]/db-master/repo/backup/db P00 DEBUG: Storage::Local->pathSync(): bRecurse = , strPathExp = P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --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: expire 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: Backup::Info->new(): bIgnoreMissing = , bLoad = , bRequired = , bValidate = , oStorage = <[object]>, strBackupClusterPath = [TEST_PATH]/db-master/repo/backup/db P00 DEBUG: Storage::Local->openRead(): bIgnoreMissing = true, rhyFilter = [undef], xFileExp = [TEST_PATH]/db-master/repo/backup/db/backup.info P00 DEBUG: Backup::Info->reconstruct(): bRequired = , bSave = , iCatalogVersion = [undef], iControlVersion = [undef], strDbVersion = [undef], ullDbSysId = [undef] @@ -1802,7 +1802,7 @@ db-version="9.4" incr backup - resume and add tablespace 2 (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --process-max=1 --stanza=db backup --test --test-delay=0.2 --test-point=backup-resume=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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 --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-resume=y +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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 --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-resume=y P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -1904,8 +1904,8 @@ P00 DEBUG: Backup::Backup->processManifest: reference pg_data/base/16384/PG P00 DEBUG: Backup::Backup->processManifest: reference pg_data/base/1/PG_VERSION to [BACKUP-FULL-2] P00 DEBUG: Backup::Backup->processManifest: reference pg_data/PG_VERSION to [BACKUP-FULL-2] P00 DEBUG: Protocol::Local::Process->hostConnect: start local process: iHostConfigIdx = 1, iHostIdx = 0, iHostProcessIdx = 0, iProcessId = 1, strHostType = db -P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local, strId = 'local-1', strName = local +P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --type=db local, strId = 'local-1', strName = local P00 DEBUG: Protocol::Local::Process->hostConnect=>: bResult = true P00 DEBUG: Protocol::Local::Process->init: init local process: iDirection = 1, iHostIdx = 0, iProcessId = 1, iQueueIdx = 0, iQueueLastIdx = 2 P00 DEBUG: Protocol::Local::Process->init=>: bResult = true @@ -1949,7 +1949,7 @@ P00 DEBUG: Storage::Local->openWrite(): bAtomic = , bPathCreate = pathSync(): bRecurse = , strPathExp = [TEST_PATH]/db-master/repo/backup/db P00 DEBUG: Storage::Local->pathSync(): bRecurse = , strPathExp = P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --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: expire 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: Backup::Info->new(): bIgnoreMissing = , bLoad = , bRequired = , bValidate = , oStorage = <[object]>, strBackupClusterPath = [TEST_PATH]/db-master/repo/backup/db P00 DEBUG: Storage::Local->openRead(): bIgnoreMissing = true, rhyFilter = [undef], xFileExp = [TEST_PATH]/db-master/repo/backup/db/backup.info P00 DEBUG: Backup::Info->reconstruct(): bRequired = , bSave = , iCatalogVersion = [undef], iControlVersion = [undef], strDbVersion = [undef], ullDbSysId = [undef] @@ -2133,7 +2133,7 @@ db-version="9.4" diff backup - cannot resume - new diff (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --process-max=1 --type=diff --stanza=db backup --test --test-delay=0.2 --test-point=backup-noresume=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-noresume=y --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-noresume=y --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 WARN: backup [BACKUP-INCR-2] missing manifest removed from backup.info @@ -2150,7 +2150,7 @@ P00 WARN: page misalignment in file [TEST_PATH]/db-master/db/base/pg_tblspc/1/ P00 INFO: diff backup size = 29B P00 INFO: new backup label = [BACKUP-DIFF-1] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -2297,7 +2297,7 @@ db-version="9.4" diff backup - cannot resume - disabled / no repo link (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --no-resume --log-level-console=detail --process-max=1 --type=diff --stanza=db backup --test --test-delay=0.2 --test-point=backup-noresume=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --no-resume --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-noresume=y --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --no-resume --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-noresume=y --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 WARN: backup [BACKUP-DIFF-1] missing manifest removed from backup.info @@ -2314,7 +2314,7 @@ P00 WARN: page misalignment in file [TEST_PATH]/db-master/db/base/pg_tblspc/1/ P00 INFO: diff backup size = 29B P00 INFO: new backup label = [BACKUP-DIFF-2] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -2461,7 +2461,7 @@ db-version="9.4" restore, backup '[BACKUP-DIFF-2]', expect exit 40 - fail on used path (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --set=[BACKUP-DIFF-2] --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --set=[BACKUP-DIFF-2] --stanza=db +P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-DIFF-2] --stanza=db P00 INFO: restore backup set [BACKUP-DIFF-2] P00 DETAIL: check [TEST_PATH]/db-master/db/base exists P00 ERROR: [040]: cannot restore to path '[TEST_PATH]/db-master/db/base' that contains files - try using --delta if this is what you intended @@ -2470,7 +2470,7 @@ P00 INFO: restore command end: aborted with exception [040] restore, backup '[BACKUP-DIFF-2]', remap - remap all paths (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --set=[BACKUP-DIFF-2] --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --set=[BACKUP-DIFF-2] --stanza=db --tablespace-map=1=[TEST_PATH]/db-master/db/tablespace/ts1-2 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 +P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base-2 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-DIFF-2] --stanza=db --tablespace-map=1=[TEST_PATH]/db-master/db/tablespace/ts1-2 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 P00 INFO: restore backup set [BACKUP-DIFF-2] P00 INFO: remap $PGDATA directory to [TEST_PATH]/db-master/db/base-2 P00 INFO: remap tablespace pg_tblspc/1 directory to [TEST_PATH]/db-master/db/tablespace/ts1-2 @@ -2505,7 +2505,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf restore delta, backup '[BACKUP-DIFF-2]', remap - ensure file in tblspc root remains after --delta (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --set=[BACKUP-DIFF-2] --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-DIFF-2] --stanza=db --tablespace-map=1=[TEST_PATH]/db-master/db/tablespace/ts1-2 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 +P00 INFO: restore command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base-2 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --set=[BACKUP-DIFF-2] --stanza=db --tablespace-map=1=[TEST_PATH]/db-master/db/tablespace/ts1-2 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 P00 INFO: restore backup set [BACKUP-DIFF-2] P00 INFO: remap $PGDATA directory to [TEST_PATH]/db-master/db/base-2 P00 INFO: remap tablespace pg_tblspc/1 directory to [TEST_PATH]/db-master/db/tablespace/ts1-2 @@ -2544,7 +2544,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf incr backup - add files and remove tablespace 2 (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --process-max=1 --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-DIFF-2], version = [VERSION-1] @@ -2556,7 +2556,7 @@ P00 WARN: page misalignment in file [TEST_PATH]/db-master/db/base-2/base/base2 P00 INFO: incr backup size = 13B P00 INFO: new backup label = [BACKUP-INCR-3] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -2704,7 +2704,7 @@ db-version="9.4" incr backup - update files - fail on missing backup.info (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [055]: unable to open [TEST_PATH]/db-master/repo/backup/db/backup.info or [TEST_PATH]/db-master/repo/backup/db/backup.info.copy @@ -2715,7 +2715,7 @@ P00 INFO: backup command end: aborted with exception [055] stanza-create db - fail on backup directory missing backup.info (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 ERROR: [055]: backup information missing HINT: use stanza-create --force to force the stanza data to be created. P00 INFO: stanza-create command end: aborted with exception [055] @@ -2738,7 +2738,7 @@ db-version="9.4" stanza-create db - create required data for stanza (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -2781,7 +2781,7 @@ db-version="9.4" incr backup - update files (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-INCR-3], version = [VERSION-1] @@ -2791,7 +2791,7 @@ P00 WARN: page misalignment in file [TEST_PATH]/db-master/db/base-2/base/16384 P00 INFO: incr backup size = 8B P00 INFO: new backup label = [BACKUP-INCR-4] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -2940,7 +2940,7 @@ db-version="9.4" diff backup - updates since last full (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --process-max=1 --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -2958,7 +2958,7 @@ P01 INFO: backup file [TEST_PATH]/db-master/db/base-2/pg_tblspc/2/[TS_PATH-1]/ P00 INFO: diff backup size = 43B P00 INFO: new backup label = [BACKUP-DIFF-3] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -3108,7 +3108,7 @@ db-version="9.4" incr backup - remove files - but won't affect manifest (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup --test --test-delay=1 --test-point=manifest-build=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=1 --test-point=manifest-build=y +P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=1 --test-point=manifest-build=y P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-DIFF-3], version = [VERSION-1] @@ -3118,7 +3118,7 @@ P00 TEST: PgBaCkReStTeSt-MANIFEST-BUILD-PgBaCkReStTeSt P00 INFO: incr backup size = 0B P00 INFO: new backup label = [BACKUP-INCR-5] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -3269,7 +3269,7 @@ db-version="9.4" diff backup - remove files during backup (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --process-max=1 --type=diff --stanza=db backup --test --test-delay=1 --test-point=manifest-build=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --hardlink --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=1 --test-point=manifest-build=y --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2 --hardlink --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --test --test-delay=1 --test-point=manifest-build=y --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -3287,7 +3287,7 @@ P01 INFO: backup file [TEST_PATH]/db-master/db/base-2/pg_tblspc/2/[TS_PATH-1]/ P00 INFO: diff backup size = 35B P00 INFO: new backup label = [BACKUP-DIFF-4] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -3438,7 +3438,7 @@ db-version="9.4" full backup - update file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --hardlink --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2 --hardlink --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P01 INFO: backup file [TEST_PATH]/db-master/db/base-2/base/32768/33001 (64KB, 44%) checksum 6bf316f11d28c28914ea9be92c00de9bea6d9a6b @@ -3460,7 +3460,7 @@ P01 INFO: backup file [TEST_PATH]/db-master/db/base-2/pg_tblspc/2/[TS_PATH-1]/ P00 INFO: full backup size = 144KB P00 INFO: new backup label = [BACKUP-FULL-3] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -3955,7 +3955,7 @@ info db stanza - normal output (db-master host) expire full=1 (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --log-level-console=detail --retention-full=1 --stanza=db expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-full=1 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-full=1 --stanza=db P00 INFO: expire full backup set: [BACKUP-FULL-2], [BACKUP-DIFF-2], [BACKUP-INCR-3], [BACKUP-INCR-4], [BACKUP-DIFF-3], [BACKUP-INCR-5], [BACKUP-DIFF-4] P00 INFO: remove expired backup [BACKUP-DIFF-4] P00 INFO: remove expired backup [BACKUP-INCR-5] @@ -3969,7 +3969,7 @@ P00 INFO: expire command end: completed successfully diff backup - add file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=detail --checksum-page --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --checksum-page --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --hardlink --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --checksum-page --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2 --hardlink --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-3], version = [VERSION-1] @@ -3993,7 +3993,7 @@ P01 INFO: backup file [TEST_PATH]/db-master/db/base-2/base/base2.txt (9B, 100% P00 INFO: diff backup size = 9B P00 INFO: new backup label = [BACKUP-DIFF-5] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -4141,7 +4141,7 @@ db-version="9.4" restore delta, remap - selective restore 16384 (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --log-level-console=detail --db-include=16384 --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-include=16384=1 --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 +P00 INFO: restore command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-include=16384=1 --db1-path=[TEST_PATH]/db-master/db/base-2 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 P00 INFO: restore backup set [BACKUP-DIFF-5] P00 INFO: remap tablespace pg_tblspc/2 directory to [TEST_PATH]/db-master/db/tablespace/ts2-2 P00 DETAIL: check [TEST_PATH]/db-master/db/base-2 exists @@ -4179,7 +4179,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf restore delta, remap - selective restore 32768 (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --log-level-console=detail --db-include=32768 --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-include=32768=1 --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 +P00 INFO: restore command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-include=32768=1 --db1-path=[TEST_PATH]/db-master/db/base-2 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 P00 INFO: restore backup set [BACKUP-DIFF-5] P00 INFO: remap tablespace pg_tblspc/2 directory to [TEST_PATH]/db-master/db/tablespace/ts2-2 P00 DETAIL: check [TEST_PATH]/db-master/db/base-2 exists @@ -4227,7 +4227,7 @@ P00 ERROR: [081]: system databases (template0, postgres, etc.) are included by restore, remap, expect exit 73 - no tablespace remap - error when tablespace dir does not exist (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --log-level-console=detail --tablespace-map-all=../../tablespace --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --tablespace-map-all=../../tablespace +P00 INFO: restore command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base-2/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --tablespace-map-all=../../tablespace P00 INFO: restore backup set [BACKUP-DIFF-5] P00 INFO: remap $PGDATA directory to [TEST_PATH]/db-master/db/base-2/base P00 INFO: remap tablespace pg_tblspc/2 directory to ../../tablespace/ts2 @@ -4239,7 +4239,7 @@ P00 INFO: restore command end: aborted with exception [073] restore - no tablespace remap (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --tablespace-map-all=../../tablespace --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: restore command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --tablespace-map-all=../../tablespace +P00 INFO: restore command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base-2/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --tablespace-map-all=../../tablespace P00 INFO: restore backup set [BACKUP-DIFF-5] P00 INFO: remap $PGDATA directory to [TEST_PATH]/db-master/db/base-2/base P00 INFO: remap tablespace pg_tblspc/2 directory to ../../tablespace/ts2 @@ -4442,7 +4442,7 @@ diff backup - config file warning on local (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=info 2>&1 --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ WARN: [TEST_PATH]/db-master/pgbackrest.conf file contains invalid option 'bogus' -P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2/base --db-timeout=45 --hardlink --lock-path=[TEST_PATH]/db-master/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2/base --hardlink --lock-path=[TEST_PATH]/db-master/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-3], version = [VERSION-1] @@ -4450,7 +4450,7 @@ P01 INFO: backup file [TEST_PATH]/db-master/db/base-2/base/base/base2.txt (9B, P00 INFO: diff backup size = 9B P00 INFO: new backup label = [BACKUP-DIFF-6] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=info --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=info --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -4598,7 +4598,7 @@ db-version="9.4" diff backup - option backup-standby reset - backup performed from master (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --no-online --log-level-console=info --backup-standby --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --backup-standby --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2/base --db-timeout=45 --hardlink --lock-path=[TEST_PATH]/db-master/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --backup-standby --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base-2/base --hardlink --lock-path=[TEST_PATH]/db-master/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 WARN: option backup-standby is enabled but standby is not properly configured - backups will be performed from the master @@ -4607,7 +4607,7 @@ P01 INFO: backup file [TEST_PATH]/db-master/db/base-2/base/base/base2.txt (9B, P00 INFO: diff backup size = 9B P00 INFO: new backup label = [BACKUP-DIFF-7] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=info --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: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=info --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 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully diff --git a/test/expect/mock-all-002.log b/test/expect/mock-all-002.log index b73e87aee..bb7925127 100644 --- a/test/expect/mock-all-002.log +++ b/test/expect/mock-all-002.log @@ -14,7 +14,7 @@ info all stanzas - no stanzas exist (db-master host) stanza-create db - create required data for stanza (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -52,7 +52,7 @@ db-version="9.4" full backup - error on identical link destinations (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [070]: link [TEST_PATH]/db-master/db/base/postgresql.conf (../pg_config) references a subdirectory of or the same directory as link [TEST_PATH]/db-master/db/base/pg_config_bad (../../db/pg_config) @@ -61,7 +61,7 @@ P00 INFO: backup command end: aborted with exception [070] full backup - error on link to a link (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [070]: link '[TEST_PATH]/db-master/db/base/postgresql.conf.bad' -> '../pg_config/postgresql.conf.link' cannot reference another link @@ -70,7 +70,7 @@ P00 INFO: backup command end: aborted with exception [070] full backup - create pg_stat link, pg_clog dir (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --manifest-save-threshold=3 --protocol-timeout=2 --db-timeout=1 --cmd-ssh=/usr/bin/ssh --buffer-size=16384 --checksum-page --process-max=1 --repo-type=cifs --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --buffer-size=16384 --checksum-page --cmd-ssh=/usr/bin/ssh --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=1 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --manifest-save-threshold=3 --no-online --process-max=1 --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --buffer-size=16384 --checksum-page --cmd-ssh=/usr/bin/ssh --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=1 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --manifest-save-threshold=3 --no-online --process-max=1 --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 16384, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/backup/repo, strTempExtension = pgbackrest.tmp @@ -91,8 +91,8 @@ P00 DEBUG: Storage::Local->list=>: stryFileList = () P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 16384, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 2, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=16384 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=1 --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db --type=db remote, strCommandSSH = /usr/bin/ssh, strHost = db-master, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 16384, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 2, strCommand = /usr/bin/ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=16384 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=1 --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db --type=db remote', strId = 'db-master remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 16384, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 2, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=16384 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=1 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db --type=db remote, strCommandSSH = /usr/bin/ssh, strHost = db-master, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 16384, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 2, strCommand = /usr/bin/ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=16384 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=1 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db --type=db remote', strId = 'db-master remote', strName = remote P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: found cached protocol @@ -150,8 +150,8 @@ P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/base/1/PG_VERSION, pg_data/base/1/PG_VERSION, 3, [undef], 0, [BACKUP-FULL-1], 0, [MODIFICATION-TIME-1], 1, [undef]), strKey = pg_data/base/1/PG_VERSION, strOp = backupFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/PG_VERSION, pg_data/PG_VERSION, 3, [undef], 0, [BACKUP-FULL-1], 0, [MODIFICATION-TIME-1], 1, [undef]), strKey = pg_data/PG_VERSION, strOp = backupFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->hostConnect: start local process: iHostConfigIdx = 1, iHostIdx = 0, iHostProcessIdx = 0, iProcessId = 1, strHostType = db -P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --buffer-size=16384 --cmd-ssh=/usr/bin/ssh --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=1 --db-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db --type=db local -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 16384, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 2, strCommand = [BACKREST-BIN] --buffer-size=16384 --cmd-ssh=/usr/bin/ssh --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=1 --db-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db --type=db local, strId = 'local-1', strName = local +P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --buffer-size=16384 --cmd-ssh=/usr/bin/ssh --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=1 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db --type=db local +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 16384, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 2, strCommand = [BACKREST-BIN] --buffer-size=16384 --cmd-ssh=/usr/bin/ssh --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=1 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db --type=db local, strId = 'local-1', strName = local P00 DEBUG: Protocol::Local::Process->hostConnect=>: bResult = true P00 DEBUG: Protocol::Local::Process->init: init local process: iDirection = 1, iHostIdx = 0, iProcessId = 1, iQueueIdx = 0, iQueueLastIdx = 0 P00 DEBUG: Protocol::Local::Process->init=>: bResult = true @@ -268,7 +268,7 @@ P00 DEBUG: Storage::Local->openWrite(): bAtomic = , bPathCreate = pathSync(): bRecurse = , strPathExp = [TEST_PATH]/backup/repo/backup/db P00 DEBUG: Storage::Local->pathSync(): bRecurse = , strPathExp = P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=16384 --cmd-ssh=/usr/bin/ssh --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=1 --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=2 --repo-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --buffer-size=16384 --cmd-ssh=/usr/bin/ssh --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-path=[TEST_PATH]/backup/repo --repo-type=cifs --stanza=db P00 DEBUG: Backup::Info->new(): bIgnoreMissing = , bLoad = , bRequired = , bValidate = , oStorage = <[object]>, strBackupClusterPath = [TEST_PATH]/backup/repo/backup/db P00 DEBUG: Storage::Local->openRead(): bIgnoreMissing = true, rhyFilter = [undef], xFileExp = [TEST_PATH]/backup/repo/backup/db/backup.info P00 DEBUG: Backup::Info->reconstruct(): bRequired = , bSave = , iCatalogVersion = [undef], iControlVersion = [undef], strDbVersion = [undef], ullDbSysId = [undef] @@ -443,7 +443,7 @@ db-version="9.4" full backup - protocol timeout (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --protocol-timeout=1 --db-timeout=.1 --type=full --stanza=db backup --test --test-delay=1 --test-point=backup-start=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=.1 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=1 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=1 --test-point=backup-start=y --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=.1 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=1 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=1 --test-point=backup-start=y --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/backup/repo, strTempExtension = pgbackrest.tmp @@ -470,8 +470,8 @@ P00 DEBUG: Storage::Local->exists=>: bExists = true P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=.1 --protocol-timeout=1 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=.1 --protocol-timeout=1 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=.1 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=1 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 1, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=.1 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=1 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: found cached protocol @@ -536,7 +536,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 full backup - abort backup - local (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --type=full --stanza=db backup --test --test-delay=5 --test-point=backup-start=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=5 --test-point=backup-start=y --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=5 --test-point=backup-start=y --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/backup/repo, strTempExtension = pgbackrest.tmp @@ -567,8 +567,8 @@ P00 DEBUG: Storage::Local->exists=>: bExists = true P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: found cached protocol @@ -620,7 +620,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 63 full backup - global stop (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/backup/repo, strTempExtension = pgbackrest.tmp @@ -651,8 +651,8 @@ P00 DEBUG: Storage::Local->exists=>: bExists = true P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote P00 ERROR: [062]: process 'db-master remote' terminated unexpectedly [062]: stop file exists for all stanzas P00 DEBUG: Common::Exit::exitSafe(): iExitCode = [undef], oException = [object], strSignal = [undef] @@ -690,7 +690,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 full backup - stanza stop (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/backup/repo, strTempExtension = pgbackrest.tmp @@ -721,8 +721,8 @@ P00 DEBUG: Storage::Local->exists=>: bExists = true P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote P00 ERROR: [062]: process 'db-master remote' terminated unexpectedly [062]: stop file exists for stanza db P00 DEBUG: Common::Exit::exitSafe(): iExitCode = [undef], oException = [object], strSignal = [undef] @@ -782,7 +782,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 full backup - abort backup - remote (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --type=full --stanza=db backup --test --test-delay=5 --test-point=backup-start=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=5 --test-point=backup-start=y --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=5 --test-point=backup-start=y --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/backup/repo, strTempExtension = pgbackrest.tmp @@ -813,8 +813,8 @@ P00 DEBUG: Storage::Local->exists=>: bExists = true P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: found cached protocol @@ -864,7 +864,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 63 full backup - global stop (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/backup/repo, strTempExtension = pgbackrest.tmp @@ -893,7 +893,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 full backup - resume (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --force --checksum-page --type=full --stanza=db backup --test --test-delay=0.2 --test-point=backup-resume=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --checksum-page --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-resume=y --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --checksum-page --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-resume=y --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/backup/repo, strTempExtension = pgbackrest.tmp @@ -922,8 +922,8 @@ P00 DEBUG: Backup::Info->delete(): strBackupLabel = [BACKUP-FULL-1] P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: found cached protocol @@ -991,8 +991,8 @@ P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/base/1/PG_VERSION, pg_data/base/1/PG_VERSION, 3, 184473f470864e067ee3a22e64b47b0a1c356f29, 0, [BACKUP-FULL-2], 0, [MODIFICATION-TIME-1], 1, [undef]), strKey = pg_data/base/1/PG_VERSION, strOp = backupFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/PG_VERSION, pg_data/PG_VERSION, 3, [undef], 0, [BACKUP-FULL-2], 0, [MODIFICATION-TIME-1], 1, [undef]), strKey = pg_data/PG_VERSION, strOp = backupFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->hostConnect: start local process: iHostConfigIdx = 1, iHostIdx = 0, iHostProcessIdx = 0, iProcessId = 1, strHostType = db -P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local, strId = 'local-1', strName = local +P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local, strId = 'local-1', strName = local P00 DEBUG: Protocol::Local::Process->hostConnect=>: bResult = true P00 DEBUG: Protocol::Local::Process->init: init local process: iDirection = 1, iHostIdx = 0, iProcessId = 1, iQueueIdx = 0, iQueueLastIdx = 0 P00 DEBUG: Protocol::Local::Process->init=>: bResult = true @@ -1060,7 +1060,7 @@ P00 DEBUG: Storage::Local->openWrite(): bAtomic = , bPathCreate = pathSync(): bRecurse = , strPathExp = [TEST_PATH]/backup/repo/backup/db P00 DEBUG: Storage::Local->pathSync(): bRecurse = , strPathExp = P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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-path=[TEST_PATH]/backup/repo --stanza=db P00 DEBUG: Backup::Info->new(): bIgnoreMissing = , bLoad = , bRequired = , bValidate = , oStorage = <[object]>, strBackupClusterPath = [TEST_PATH]/backup/repo/backup/db P00 DEBUG: Storage::Local->openRead(): bIgnoreMissing = true, rhyFilter = [undef], xFileExp = [TEST_PATH]/backup/repo/backup/db/backup.info P00 DEBUG: Backup::Info->reconstruct(): bRequired = , bSave = , iCatalogVersion = [undef], iControlVersion = [undef], strDbVersion = [undef], ullDbSysId = [undef] @@ -1235,7 +1235,7 @@ db-version="9.4" full backup - invalid repo (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --repo-path=/bogus_path --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=/bogus_path --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=/bogus_path --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [073]: repo-path '/bogus_path' does not exist @@ -1244,15 +1244,15 @@ P00 INFO: backup command end: aborted with exception [073] restore delta, backup '[BACKUP-FULL-2]' - add and delete files (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --set=[BACKUP-FULL-2] --link-all --cmd-ssh=/usr/bin/ssh --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --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 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 --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: 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 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::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=restore --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --stanza=db --type=backup remote, strCommandSSH = /usr/bin/ssh, strHost = backup, strUser = [USER-2] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = /usr/bin/ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no backrest@backup '[BACKREST-BIN] --buffer-size=4194304 --command=restore --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --stanza=db --type=backup remote', strId = 'backup remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=restore --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --stanza=db --type=backup remote, strCommandSSH = /usr/bin/ssh, strHost = backup, strUser = [USER-2] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = /usr/bin/ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no backrest@backup '[BACKREST-BIN] --buffer-size=4194304 --command=restore --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --stanza=db --type=backup remote', strId = 'backup remote', strName = remote P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [undef], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/db/base, strTempExtension = pgbackrest.tmp P00 DEBUG: Storage::Local->pathExists(): strPathExp = [TEST_PATH]/db-master/db/base P00 DEBUG: Storage::Local->pathExists=>: bExists = true @@ -1369,8 +1369,8 @@ P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/base/1/PG_VERSION, 3, [MODIFICATION-TIME-1], 184473f470864e067ee3a22e64b47b0a1c356f29, 0, 0, pg_data/base/1/PG_VERSION, [undef], 0660, [USER-1], [GROUP-1], [MODIFICATION-TIME-3], 1, [BACKUP-FULL-2], 0), strKey = pg_data/base/1/PG_VERSION, strOp = restoreFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->queueJob(): iHostConfigIdx = 1, rParam = ([TEST_PATH]/db-master/db/base/PG_VERSION, 3, [MODIFICATION-TIME-1], 184473f470864e067ee3a22e64b47b0a1c356f29, 0, 0, pg_data/PG_VERSION, [undef], 0600, [USER-1], [GROUP-1], [MODIFICATION-TIME-3], 1, [BACKUP-FULL-2], 0), strKey = pg_data/PG_VERSION, strOp = restoreFile, strQueue = pg_data P00 DEBUG: Protocol::Local::Process->hostConnect: start local process: iHostConfigIdx = 1, iHostIdx = 0, iHostProcessIdx = 0, iProcessId = 1, strHostType = backup -P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-2] --cmd-ssh=/usr/bin/ssh --command=restore --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --stanza=db --type=backup local -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-2] --cmd-ssh=/usr/bin/ssh --command=restore --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --stanza=db --type=backup local, strId = 'local-1', strName = local +P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-2] --cmd-ssh=/usr/bin/ssh --command=restore --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --stanza=db --type=backup local +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-2] --cmd-ssh=/usr/bin/ssh --command=restore --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --host-id=1 --lock-path=[TEST_PATH]/db-master/lock --log-path=[TEST_PATH]/db-master/log --process=1 --protocol-timeout=60 --stanza=db --type=backup local, strId = 'local-1', strName = local P00 DEBUG: Protocol::Local::Process->hostConnect=>: bResult = true P00 DEBUG: Protocol::Local::Process->init: init local process: iDirection = 1, iHostIdx = 0, iProcessId = 1, iQueueIdx = 0, iQueueLastIdx = 0 P00 DEBUG: Protocol::Local::Process->init=>: bResult = true @@ -1453,7 +1453,7 @@ restore_command = '[BACKREST-BIN] --cmd-ssh=/usr/bin/ssh --config=[TEST_PATH]/db restore delta, backup '[BACKUP-FULL-2]' - fix broken symlink (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --set=[BACKUP-FULL-2] --link-all --log-level-console=detail --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --delta --link-all --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: restore command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-2] --no-compress --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=detail --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 INFO: restore backup set [BACKUP-FULL-2] P00 DETAIL: check [TEST_PATH]/db-master/db/base exists P00 DETAIL: check [TEST_PATH]/db-master/db/pg_stat exists @@ -1486,7 +1486,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf restore delta, force, backup '[BACKUP-FULL-2]', expect exit 40 - fail on missing PG_VERSION (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --force --set=[BACKUP-FULL-2] --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --delta --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: restore command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-2] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --delta --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 WARN: --delta or --force specified but unable to find 'PG_VERSION' or 'backup.manifest' in '[TEST_PATH]/db-master/db/base' to confirm that this is a valid $PGDATA directory. --delta and --force have been disabled and if any files exist in the destination directories the restore will be aborted. P00 INFO: restore backup set [BACKUP-FULL-2] P00 WARN: contents of directory link pg_stat will be restored in a directory at the same location @@ -1498,7 +1498,7 @@ P00 INFO: restore command end: aborted with exception [040] restore delta, force, backup '[BACKUP-FULL-2]' - restore succeeds with backup.manifest file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --force --set=[BACKUP-FULL-2] --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --delta --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: restore command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-2] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --delta --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: restore backup set [BACKUP-FULL-2] P00 WARN: group bogus in manifest cannot be used for restore, set to [USER-1] P00 WARN: user bogus in manifest cannot be used for restore, set to [USER-1] @@ -1533,7 +1533,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf incr backup - invalid database version (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [051]: database version = 9.4, system-id 6353949018581704918 does not match backup version = 8.0, system-id = 6353949018581704918 @@ -1543,7 +1543,7 @@ P00 INFO: backup command end: aborted with exception [051] incr backup - invalid system id (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [051]: database version = 9.4, system-id 6353949018581704918 does not match backup version = 9.4, system-id = 6999999999999999999 @@ -1553,7 +1553,7 @@ P00 INFO: backup command end: aborted with exception [051] incr backup - invalid control version (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [051]: database control-version = 942, catalog-version 201409291 does not match backup control-version = 842, catalog-version = 201409291 @@ -1563,7 +1563,7 @@ P00 INFO: backup command end: aborted with exception [051] incr backup - invalid catalog version (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 ERROR: [051]: database control-version = 942, catalog-version 201409291 does not match backup control-version = 942, catalog-version = 197208141 @@ -1573,7 +1573,7 @@ P00 INFO: backup command end: aborted with exception [051] incr backup - invalid path in pg_tblspc (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1584,7 +1584,7 @@ P00 INFO: backup command end: aborted with exception [069] incr backup - invalid relative tablespace in $PGDATA (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1595,7 +1595,7 @@ P00 INFO: backup command end: aborted with exception [071] incr backup - invalid tablespace in $PGDATA (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -1606,7 +1606,7 @@ P00 INFO: backup command end: aborted with exception [071] incr backup - add tablespace 1 (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --test --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/backup/repo, strTempExtension = pgbackrest.tmp @@ -1633,8 +1633,8 @@ P00 DEBUG: Storage::Local->exists=>: bExists = true P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: found cached protocol @@ -1699,8 +1699,8 @@ P00 DEBUG: Backup::Backup->processManifest: reference pg_data/base/16384/PG P00 DEBUG: Backup::Backup->processManifest: reference pg_data/base/1/PG_VERSION to [BACKUP-FULL-2] P00 DEBUG: Backup::Backup->processManifest: reference pg_data/PG_VERSION to [BACKUP-FULL-2] P00 DEBUG: Protocol::Local::Process->hostConnect: start local process: iHostConfigIdx = 1, iHostIdx = 0, iHostProcessIdx = 0, iProcessId = 1, strHostType = db -P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local, strId = 'local-1', strName = local +P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local, strId = 'local-1', strName = local P00 DEBUG: Protocol::Local::Process->hostConnect=>: bResult = true P00 DEBUG: Protocol::Local::Process->init: init local process: iDirection = 1, iHostIdx = 0, iProcessId = 1, iQueueIdx = 0, iQueueLastIdx = 1 P00 DEBUG: Protocol::Local::Process->init=>: bResult = true @@ -1739,7 +1739,7 @@ P00 DEBUG: Storage::Local->openWrite(): bAtomic = , bPathCreate = pathSync(): bRecurse = , strPathExp = [TEST_PATH]/backup/repo/backup/db P00 DEBUG: Storage::Local->pathSync(): bRecurse = , strPathExp = P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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-path=[TEST_PATH]/backup/repo --stanza=db P00 DEBUG: Backup::Info->new(): bIgnoreMissing = , bLoad = , bRequired = , bValidate = , oStorage = <[object]>, strBackupClusterPath = [TEST_PATH]/backup/repo/backup/db P00 DEBUG: Storage::Local->openRead(): bIgnoreMissing = true, rhyFilter = [undef], xFileExp = [TEST_PATH]/backup/repo/backup/db/backup.info P00 DEBUG: Backup::Info->reconstruct(): bRequired = , bSave = , iCatalogVersion = [undef], iControlVersion = [undef], strDbVersion = [undef], ullDbSysId = [undef] @@ -1928,7 +1928,7 @@ db-version="9.4" incr backup - resume and add tablespace 2 (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --process-max=1 --stanza=db backup --test --test-delay=0.2 --test-point=backup-resume=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-resume=y +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-resume=y P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/backup/repo, strTempExtension = pgbackrest.tmp @@ -1963,8 +1963,8 @@ P00 DEBUG: Backup::Info->delete(): strBackupLabel = [BACKUP-INCR-1] P00 DEBUG: Db->new(): iRemoteIdx = 1 P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: create (cached) remote protocol -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote, strCommandSSH = ssh, strHost = db-master, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no [USER-1]@db-master '[BACKREST-BIN] --buffer-size=4194304 --command=backup --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db remote', strId = 'db-master remote', strName = remote P00 DEBUG: Db::dbObjectGet=>: iDbMasterIdx = 1, iDbStandbyIdx = [undef], oDbMaster = [object], oDbStandby = [undef] P00 DEBUG: Protocol::Helper::protocolGet(): bCache = , iProcessIdx = [undef], iRemoteIdx = 1, strBackRestBin = [undef], strCommand = , strRemoteType = db P00 DEBUG: Protocol::Helper::protocolGet: found cached protocol @@ -2038,8 +2038,8 @@ P00 DEBUG: Backup::Backup->processManifest: reference pg_data/base/16384/PG P00 DEBUG: Backup::Backup->processManifest: reference pg_data/base/1/PG_VERSION to [BACKUP-FULL-2] P00 DEBUG: Backup::Backup->processManifest: reference pg_data/PG_VERSION to [BACKUP-FULL-2] P00 DEBUG: Protocol::Local::Process->hostConnect: start local process: iHostConfigIdx = 1, iHostIdx = 0, iHostProcessIdx = 0, iProcessId = 1, strHostType = db -P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local, strId = 'local-1', strName = local +P00 DEBUG: Protocol::Local::Master->new(): iProcessIdx = 1, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = [BACKREST-BIN] --command=backup --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --host-id=1 --lock-path=[TEST_PATH]/backup/lock --log-path=[TEST_PATH]/backup/log --process=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --type=db local, strId = 'local-1', strName = local P00 DEBUG: Protocol::Local::Process->hostConnect=>: bResult = true P00 DEBUG: Protocol::Local::Process->init: init local process: iDirection = 1, iHostIdx = 0, iProcessId = 1, iQueueIdx = 0, iQueueLastIdx = 2 P00 DEBUG: Protocol::Local::Process->init=>: bResult = true @@ -2085,7 +2085,7 @@ P00 DEBUG: Storage::Local->openWrite(): bAtomic = , bPathCreate = pathSync(): bRecurse = , strPathExp = [TEST_PATH]/backup/repo/backup/db P00 DEBUG: Storage::Local->pathSync(): bRecurse = , strPathExp = P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=debug --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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-path=[TEST_PATH]/backup/repo --stanza=db P00 DEBUG: Backup::Info->new(): bIgnoreMissing = , bLoad = , bRequired = , bValidate = , oStorage = <[object]>, strBackupClusterPath = [TEST_PATH]/backup/repo/backup/db P00 DEBUG: Storage::Local->openRead(): bIgnoreMissing = true, rhyFilter = [undef], xFileExp = [TEST_PATH]/backup/repo/backup/db/backup.info P00 DEBUG: Backup::Info->reconstruct(): bRequired = , bSave = , iCatalogVersion = [undef], iControlVersion = [undef], strDbVersion = [undef], ullDbSysId = [undef] @@ -2285,7 +2285,7 @@ db-version="9.4" diff backup - cannot resume - new diff (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --process-max=1 --type=diff --stanza=db backup --test --test-delay=0.2 --test-point=backup-noresume=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-noresume=y --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-noresume=y --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 WARN: backup [BACKUP-INCR-2] missing manifest removed from backup.info @@ -2302,7 +2302,7 @@ P00 WARN: page misalignment in file db-master:[TEST_PATH]/db-master/db/base/pg P00 INFO: diff backup size = 29B P00 INFO: new backup label = [BACKUP-DIFF-1] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -2465,7 +2465,7 @@ db-version="9.4" diff backup - cannot resume - disabled / no repo link (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --no-resume --log-level-console=detail --process-max=1 --type=diff --stanza=db backup --test --test-delay=0.2 --test-point=backup-noresume=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --no-resume --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-noresume=y --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --no-resume --stanza=db --start-fast --test --test-delay=0.2 --test-point=backup-noresume=y --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 WARN: backup [BACKUP-DIFF-1] missing manifest removed from backup.info @@ -2482,7 +2482,7 @@ P00 WARN: page misalignment in file db-master:[TEST_PATH]/db-master/db/base/pg P00 INFO: diff backup size = 29B P00 INFO: new backup label = [BACKUP-DIFF-2] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -2645,7 +2645,7 @@ db-version="9.4" restore, backup '[BACKUP-DIFF-2]', expect exit 40 - fail on used path (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --set=[BACKUP-DIFF-2] --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --set=[BACKUP-DIFF-2] --stanza=db +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --set=[BACKUP-DIFF-2] --stanza=db P00 INFO: restore backup set [BACKUP-DIFF-2] P00 DETAIL: check [TEST_PATH]/db-master/db/base exists P00 ERROR: [040]: cannot restore to path '[TEST_PATH]/db-master/db/base' that contains files - try using --delta if this is what you intended @@ -2654,7 +2654,7 @@ P00 INFO: restore command end: aborted with exception [040] restore, backup '[BACKUP-DIFF-2]', remap - remap all paths (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --set=[BACKUP-DIFF-2] --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --set=[BACKUP-DIFF-2] --stanza=db --tablespace-map=1=[TEST_PATH]/db-master/db/tablespace/ts1-2 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base-2 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --set=[BACKUP-DIFF-2] --stanza=db --tablespace-map=1=[TEST_PATH]/db-master/db/tablespace/ts1-2 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 P00 INFO: restore backup set [BACKUP-DIFF-2] P00 INFO: remap $PGDATA directory to [TEST_PATH]/db-master/db/base-2 P00 INFO: remap tablespace pg_tblspc/1 directory to [TEST_PATH]/db-master/db/tablespace/ts1-2 @@ -2689,7 +2689,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf restore delta, backup '[BACKUP-DIFF-2]', remap - ensure file in tblspc root remains after --delta (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --set=[BACKUP-DIFF-2] --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --set=[BACKUP-DIFF-2] --stanza=db --tablespace-map=1=[TEST_PATH]/db-master/db/tablespace/ts1-2 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base-2 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --set=[BACKUP-DIFF-2] --stanza=db --tablespace-map=1=[TEST_PATH]/db-master/db/tablespace/ts1-2 --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 P00 INFO: restore backup set [BACKUP-DIFF-2] P00 INFO: remap $PGDATA directory to [TEST_PATH]/db-master/db/base-2 P00 INFO: remap tablespace pg_tblspc/1 directory to [TEST_PATH]/db-master/db/tablespace/ts1-2 @@ -2728,7 +2728,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf incr backup - add files and remove tablespace 2 (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --process-max=1 --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2 --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-DIFF-2], version = [VERSION-1] @@ -2740,7 +2740,7 @@ P00 WARN: page misalignment in file db-master:[TEST_PATH]/db-master/db/base-2/ P00 INFO: incr backup size = 13B P00 INFO: new backup label = [BACKUP-INCR-3] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -2904,7 +2904,7 @@ db-version="9.4" stanza-create db - create required data for stanza (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2 --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -2947,7 +2947,7 @@ db-version="9.4" incr backup - update files (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2 --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-INCR-3], version = [VERSION-1] @@ -2957,7 +2957,7 @@ P00 WARN: page misalignment in file db-master:[TEST_PATH]/db-master/db/base-2/ P00 INFO: incr backup size = 8B P00 INFO: new backup label = [BACKUP-INCR-4] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -3122,7 +3122,7 @@ db-version="9.4" diff backup - updates since last full (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --process-max=1 --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2 --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -3140,7 +3140,7 @@ P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/pg_tblspc/2/[T P00 INFO: diff backup size = 43B P00 INFO: new backup label = [BACKUP-DIFF-3] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -3306,7 +3306,7 @@ db-version="9.4" incr backup - remove files - but won't affect manifest (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --stanza=db backup --test --test-delay=1 --test-point=manifest-build=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=1 --test-point=manifest-build=y +P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2 --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=1 --test-point=manifest-build=y P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-DIFF-3], version = [VERSION-1] @@ -3316,7 +3316,7 @@ P00 TEST: PgBaCkReStTeSt-MANIFEST-BUILD-PgBaCkReStTeSt P00 INFO: incr backup size = 0B P00 INFO: new backup label = [BACKUP-INCR-5] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -3483,7 +3483,7 @@ db-version="9.4" diff backup - remove files during backup (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --process-max=1 --type=diff --stanza=db backup --test --test-delay=1 --test-point=manifest-build=y ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --db-user=[USER-1] --hardlink --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=1 --test-point=manifest-build=y --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2 --db1-user=[USER-1] --hardlink --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=1 --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --test --test-delay=1 --test-point=manifest-build=y --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-2], version = [VERSION-1] @@ -3501,7 +3501,7 @@ P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/pg_tblspc/2/[T P00 INFO: diff backup size = 35B P00 INFO: new backup label = [BACKUP-DIFF-4] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -3668,7 +3668,7 @@ db-version="9.4" full backup - update file (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --db-user=[USER-1] --hardlink --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2 --db1-user=[USER-1] --hardlink --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=full P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/base/32768/33001 (64KB, 44%) checksum 6bf316f11d28c28914ea9be92c00de9bea6d9a6b @@ -3690,7 +3690,7 @@ P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/pg_tblspc/2/[T P00 INFO: full backup size = 144KB P00 INFO: new backup label = [BACKUP-FULL-3] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -4201,7 +4201,7 @@ info db stanza - normal output (backup host) expire full=1 (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --log-level-console=detail --retention-full=1 --stanza=db expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --retention-full=1 --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --retention-full=1 --stanza=db P00 INFO: expire full backup set: [BACKUP-FULL-2], [BACKUP-DIFF-2], [BACKUP-INCR-3], [BACKUP-INCR-4], [BACKUP-DIFF-3], [BACKUP-INCR-5], [BACKUP-DIFF-4] P00 INFO: remove expired backup [BACKUP-DIFF-4] P00 INFO: remove expired backup [BACKUP-INCR-5] @@ -4215,7 +4215,7 @@ P00 INFO: expire command end: completed successfully diff backup - add file (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=detail --checksum-page --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --checksum-page --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --db-user=[USER-1] --hardlink --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --checksum-page --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2 --db1-user=[USER-1] --hardlink --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-3], version = [VERSION-1] @@ -4239,7 +4239,7 @@ P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/base/base2.txt P00 INFO: diff backup size = 9B P00 INFO: new backup label = [BACKUP-DIFF-5] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -4403,7 +4403,7 @@ db-version="9.4" restore delta, remap - selective restore 16384 (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --log-level-console=detail --db-include=16384 --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-include=16384=1 --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-include=16384=1 --db1-path=[TEST_PATH]/db-master/db/base-2 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 P00 INFO: restore backup set [BACKUP-DIFF-5] P00 INFO: remap tablespace pg_tblspc/2 directory to [TEST_PATH]/db-master/db/tablespace/ts2-2 P00 DETAIL: check [TEST_PATH]/db-master/db/base-2 exists @@ -4441,7 +4441,7 @@ restore_command = '[BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf restore delta, remap - selective restore 32768 (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --delta --log-level-console=detail --db-include=32768 --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-include=32768=1 --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-include=32768=1 --db1-path=[TEST_PATH]/db-master/db/base-2 --delta --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db --tablespace-map=2=[TEST_PATH]/db-master/db/tablespace/ts2-2 P00 INFO: restore backup set [BACKUP-DIFF-5] P00 INFO: remap tablespace pg_tblspc/2 directory to [TEST_PATH]/db-master/db/tablespace/ts2-2 P00 DETAIL: check [TEST_PATH]/db-master/db/base-2 exists @@ -4489,7 +4489,7 @@ P00 ERROR: [081]: system databases (template0, postgres, etc.) are included by restore, remap, expect exit 73 - no tablespace remap - error when tablespace dir does not exist (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --log-level-console=detail --tablespace-map-all=../../tablespace --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db --tablespace-map-all=../../tablespace +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base-2/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db --tablespace-map-all=../../tablespace P00 INFO: restore backup set [BACKUP-DIFF-5] P00 INFO: remap $PGDATA directory to [TEST_PATH]/db-master/db/base-2/base P00 INFO: remap tablespace pg_tblspc/2 directory to ../../tablespace/ts2 @@ -4501,7 +4501,7 @@ P00 INFO: restore command end: aborted with exception [073] restore - no tablespace remap (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --tablespace-map-all=../../tablespace --log-level-console=detail --stanza=db restore ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base-2/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db --tablespace-map-all=../../tablespace +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db1-path=[TEST_PATH]/db-master/db/base-2/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db --tablespace-map-all=../../tablespace P00 INFO: restore backup set [BACKUP-DIFF-5] P00 INFO: remap $PGDATA directory to [TEST_PATH]/db-master/db/base-2/base P00 INFO: remap tablespace pg_tblspc/2 directory to ../../tablespace/ts2 @@ -4683,7 +4683,7 @@ info bogus stanza - bogus stanza (db-master host) diff backup - config file not validated on remote (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=info --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2/base --db-timeout=45 --db-user=[USER-1] --hardlink --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2/base --db1-user=[USER-1] --hardlink --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-3], version = [VERSION-1] @@ -4691,7 +4691,7 @@ P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/base/base/base P00 INFO: diff backup size = 9B P00 INFO: new backup label = [BACKUP-DIFF-6] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -4855,7 +4855,7 @@ db-version="9.4" diff backup - option backup-standby reset - backup performed from master (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=info --backup-standby --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --backup-standby --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2/base --db-timeout=45 --db-user=[USER-1] --hardlink --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --backup-standby --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2/base --db1-user=[USER-1] --hardlink --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 WARN: option backup-standby is enabled but standby is not properly configured - backups will be performed from the master @@ -4864,7 +4864,7 @@ P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/base/base/base P00 INFO: diff backup size = 9B P00 INFO: new backup label = [BACKUP-DIFF-7] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: expire 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=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully diff --git a/test/expect/mock-all-003.log b/test/expect/mock-all-003.log index df44f37a2..8a7428910 100644 --- a/test/expect/mock-all-003.log +++ b/test/expect/mock-all-003.log @@ -14,7 +14,7 @@ info all stanzas - no stanzas exist (db-master host) stanza-create db - create required data for stanza (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -1386,7 +1386,7 @@ db-version="9.4" stanza-create db - create required data for stanza (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2 --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2 --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -2658,7 +2658,7 @@ info db stanza - normal output (backup host) expire full=1 (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --log-level-console=detail --retention-full=1 --stanza=db expire ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --retention-full=1 --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --retention-full=1 --stanza=db P00 INFO: expire full backup set: [BACKUP-FULL-2], [BACKUP-DIFF-2], [BACKUP-INCR-3], [BACKUP-INCR-4], [BACKUP-DIFF-3], [BACKUP-INCR-5], [BACKUP-DIFF-4] P00 INFO: remove expired backup [BACKUP-DIFF-4] P00 INFO: remove expired backup [BACKUP-DIFF-3] @@ -3016,7 +3016,7 @@ info bogus stanza - bogus stanza (db-master host) diff backup - config file not validated on remote (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=info --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=2 --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=2 --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 INFO: last backup label = [BACKUP-FULL-3], version = [VERSION-1] @@ -3024,7 +3024,7 @@ P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/base/base/base P00 INFO: diff backup size = 9B P00 INFO: new backup label = [BACKUP-DIFF-6] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: expire 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=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully @@ -3196,7 +3196,7 @@ db-version="9.4" diff backup - option backup-standby reset - backup performed from master (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --no-online --log-level-console=info --backup-standby --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --backup-standby --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base-2/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=2 --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --backup-standby --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base-2/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --process-max=2 --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db --start-fast --type=diff P00 WARN: option retention-full is not set, the repository may run out of space HINT: to retain full backups indefinitely (without warning), set option 'retention-full' to the maximum. P00 WARN: option backup-standby is enabled but standby is not properly configured - backups will be performed from the master @@ -3205,7 +3205,7 @@ P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base-2/base/base/base P00 INFO: diff backup size = 9B P00 INFO: new backup label = [BACKUP-DIFF-7] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --compress --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: expire 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=info --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: option 'retention-archive' is not set - archive logs will not be expired P00 INFO: expire command end: completed successfully diff --git a/test/expect/mock-archive-001.log b/test/expect/mock-archive-001.log index c6f113a23..d7af2ee77 100644 --- a/test/expect/mock-archive-001.log +++ b/test/expect/mock-archive-001.log @@ -3,7 +3,7 @@ run 001 - rmt 0, s3 0 > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 ERROR: [055]: unable to open [TEST_PATH]/db-master/repo/archive/db/archive.info or [TEST_PATH]/db-master/repo/archive/db/archive.info.copy P00 ERROR: [055]: archive.info does not exist but is required to push/get WAL segments HINT: is archive_command configured in postgresql.conf? @@ -13,7 +13,7 @@ P00 INFO: archive-push command end: aborted with exception [055] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get 000000010000000100000001 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 000000010000000100000001 P00 ERROR: [055]: unable to open [TEST_PATH]/db-master/repo/archive/db/archive.info or [TEST_PATH]/db-master/repo/archive/db/archive.info.copy P00 ERROR: [055]: archive.info does not exist but is required to push/get WAL segments @@ -25,7 +25,7 @@ P00 INFO: archive-get command end: aborted with exception [055] stanza-create db - stanza create (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -62,7 +62,7 @@ db-version="9.4" > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push --log-level-console=debug [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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: Archive::Push::File::archivePushFile(): bCompress = false, strWalFile = 000000010000000100000001, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -98,7 +98,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get --log-level-console=debug 000000010000000100000001 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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 000000010000000100000001 P00 DEBUG: Archive::Get::Get->get(): strDestinationFile = [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG, strSourceArchive = 000000010000000100000001 P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -132,20 +132,20 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push --compress --archive-async --process-max=2 [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --archive-async --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --process-max=2 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --spool-path=[TEST_PATH]/db-master/spool --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --archive-async --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --process-max=2 --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --spool-path=[TEST_PATH]/db-master/spool --stanza=db P00 INFO: pushed WAL segment 000000010000000100000002 asynchronously P00 INFO: archive-push command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 ERROR: [044]: WAL segment version 9.4 does not match archive version 8.0 HINT: are you archiving to the correct stanza? P00 INFO: archive-push command end: aborted with exception [044] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get 000000010000000100000001 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 000000010000000100000001 P00 ERROR: [044]: WAL segment version 9.4 does not match archive version 8.0 HINT: are you archiving to the correct stanza? @@ -153,14 +153,14 @@ P00 INFO: archive-get command end: aborted with exception [044] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 ERROR: [044]: WAL segment system-id 6353949018581704918 does not match archive system-id 5000900090001855000 HINT: are you archiving to the correct stanza? P00 INFO: archive-push command end: aborted with exception [044] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get 000000010000000100000001 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 000000010000000100000001 P00 ERROR: [044]: WAL segment system-id 6353949018581704918 does not match archive system-id 5000900090001855000 HINT: are you archiving to the correct stanza? @@ -174,13 +174,13 @@ P00 INFO: stop command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 ERROR: [062]: stop file exists for stanza db P00 INFO: archive-push command end: aborted with exception [062] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get 000000010000000100000001 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 000000010000000100000001 P00 ERROR: [062]: stop file exists for stanza db P00 INFO: archive-get command end: aborted with exception [062] @@ -193,7 +193,7 @@ P00 INFO: start command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 WARN: WAL segment 000000010000000100000002 already exists in the archive with the same checksum HINT: this is valid in some recovery scenarios but may also indicate a problem. P00 INFO: pushed WAL segment 000000010000000100000002 @@ -201,25 +201,25 @@ P00 INFO: archive-push command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 ERROR: [045]: WAL segment 000000010000000100000002 already exists in the archive P00 INFO: archive-push command end: aborted with exception [045] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get 000000010000000100000002 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-get command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: archive-get command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002.partial ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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: pushed WAL segment 000000010000000100000002.partial P00 INFO: archive-push command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002.partial ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 WARN: WAL segment 000000010000000100000002.partial already exists in the archive with the same checksum HINT: this is valid in some recovery scenarios but may also indicate a problem. P00 INFO: pushed WAL segment 000000010000000100000002.partial @@ -227,6 +227,6 @@ P00 INFO: archive-push command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002.partial ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 ERROR: [045]: WAL segment 000000010000000100000002.partial already exists in the archive P00 INFO: archive-push command end: aborted with exception [045] diff --git a/test/expect/mock-archive-002.log b/test/expect/mock-archive-002.log index d72310dd0..a32cfc669 100644 --- a/test/expect/mock-archive-002.log +++ b/test/expect/mock-archive-002.log @@ -3,7 +3,7 @@ run 002 - rmt 1, s3 0 > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db P00 ERROR: [055]: raised on 'backup remote' host: archive.info does not exist but is required to push/get WAL segments HINT: is archive_command configured in postgresql.conf? HINT: has a stanza-create been performed? @@ -12,7 +12,7 @@ P00 INFO: archive-push command end: aborted with exception [055] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get 000000010000000100000001 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 ERROR: [055]: raised on 'backup remote' host: archive.info does not exist but is required to push/get WAL segments HINT: is archive_command configured in postgresql.conf? @@ -23,7 +23,7 @@ P00 INFO: archive-get command end: aborted with exception [055] stanza-create db - stanza create (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-2] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-2] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -60,13 +60,13 @@ db-version="9.4" > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push --cmd-ssh=/usr/bin/ssh --log-level-console=debug [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 ------------------------------------------------------------------------------------------------------------------------------------ -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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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: 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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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: Archive::Push::File::archivePushFile(): bCompress = false, 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 -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=archive-push --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --stanza=db --type=backup remote, strCommandSSH = /usr/bin/ssh, strHost = backup, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = /usr/bin/ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no backrest@backup '[BACKREST-BIN] --buffer-size=4194304 --command=archive-push --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --stanza=db --type=backup remote', strId = 'backup remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=archive-push --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --stanza=db --type=backup remote, strCommandSSH = /usr/bin/ssh, strHost = backup, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = /usr/bin/ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no backrest@backup '[BACKREST-BIN] --buffer-size=4194304 --command=archive-push --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --stanza=db --type=backup remote', strId = 'backup remote', strName = remote P00 DEBUG: Protocol::Storage::Remote->new(): oProtocol = [object] P00 DEBUG: Archive::Common::walInfo(): strWalFile = [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 P00 DEBUG: Archive::Common::walInfo=>: strDbVersion = 9.4, ullDbSysId = 6353949018581704918 @@ -94,13 +94,13 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get --log-level-console=debug 000000010000000100000001 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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: 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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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: 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::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=archive-get --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --stanza=db --type=backup remote, strCommandSSH = ssh, strHost = backup, strUser = [USER-1] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no backrest@backup '[BACKREST-BIN] --buffer-size=4194304 --command=archive-get --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --stanza=db --type=backup remote', strId = 'backup remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=archive-get --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --stanza=db --type=backup remote, strCommandSSH = ssh, strHost = backup, strUser = [USER-1] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no backrest@backup '[BACKREST-BIN] --buffer-size=4194304 --command=archive-get --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --stanza=db --type=backup remote', strId = 'backup remote', strName = remote P00 DEBUG: Protocol::Storage::Remote->new(): oProtocol = [object] P00 DEBUG: Archive::Base->getCheck(): strDbVersion = [undef], strWalFile = 000000010000000100000001, ullDbSysId = [undef] P00 DEBUG: Db->new(): iRemoteIdx = 1 @@ -126,20 +126,20 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push --compress --archive-async --process-max=2 [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --archive-async --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-1] --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --process-max=2 --protocol-timeout=60 --spool-path=[TEST_PATH]/db-master/spool --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --archive-async --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-1] --compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --process-max=2 --protocol-timeout=60 --spool-path=[TEST_PATH]/db-master/spool --stanza=db P00 INFO: pushed WAL segment 000000010000000100000002 asynchronously P00 INFO: archive-push command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-1] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db P00 ERROR: [044]: raised on 'backup remote' host: WAL segment version 9.4 does not match archive version 8.0 HINT: are you archiving to the correct stanza? P00 INFO: archive-push command end: aborted with exception [044] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get 000000010000000100000001 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 ERROR: [044]: raised on 'backup remote' host: WAL segment version 9.4 does not match archive version 8.0 HINT: are you archiving to the correct stanza? @@ -147,14 +147,14 @@ P00 INFO: archive-get command end: aborted with exception [044] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-1] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db P00 ERROR: [044]: raised on 'backup remote' host: WAL segment system-id 6353949018581704918 does not match archive system-id 5000900090001855000 HINT: are you archiving to the correct stanza? P00 INFO: archive-push command end: aborted with exception [044] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get 000000010000000100000001 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 ERROR: [044]: raised on 'backup remote' host: WAL segment system-id 6353949018581704918 does not match archive system-id 5000900090001855000 HINT: are you archiving to the correct stanza? @@ -168,13 +168,13 @@ P00 INFO: stop command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-1] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db P00 ERROR: [062]: stop file exists for stanza db P00 INFO: archive-push command end: aborted with exception [062] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get 000000010000000100000001 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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 --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 ERROR: [062]: stop file exists for stanza db P00 INFO: archive-get command end: aborted with exception [062] @@ -187,7 +187,7 @@ P00 INFO: start command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-1] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db P00 WARN: WAL segment 000000010000000100000002 already exists in the archive with the same checksum HINT: this is valid in some recovery scenarios but may also indicate a problem. P00 INFO: pushed WAL segment 000000010000000100000002 @@ -195,25 +195,25 @@ P00 INFO: archive-push command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-1] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db P00 ERROR: [045]: WAL segment 000000010000000100000002 already exists in the archive P00 INFO: archive-push command end: aborted with exception [045] > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-get --cmd-ssh=/usr/bin/ssh 000000010000000100000002 [TEST_PATH]/db-master/db/base/pg_xlog/RECOVERYXLOG ------------------------------------------------------------------------------------------------------------------------------------ -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] --cmd-ssh=/usr/bin/ssh --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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] --cmd-ssh=/usr/bin/ssh --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 INFO: archive-get command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002.partial ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db P00 INFO: pushed WAL segment 000000010000000100000002.partial P00 INFO: archive-push command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002.partial ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db P00 WARN: WAL segment 000000010000000100000002.partial already exists in the archive with the same checksum HINT: this is valid in some recovery scenarios but may also indicate a problem. P00 INFO: pushed WAL segment 000000010000000100000002.partial @@ -221,6 +221,6 @@ P00 INFO: archive-push command end: completed successfully > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000002.partial ------------------------------------------------------------------------------------------------------------------------------------ -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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db +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] --no-compress --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --protocol-timeout=60 --stanza=db P00 ERROR: [045]: WAL segment 000000010000000100000002.partial already exists in the archive P00 INFO: archive-push command end: aborted with exception [045] diff --git a/test/expect/mock-archive-003.log b/test/expect/mock-archive-003.log index 771aab887..59027708d 100644 --- a/test/expect/mock-archive-003.log +++ b/test/expect/mock-archive-003.log @@ -18,7 +18,7 @@ P00 ERROR: [055]: raised on 'backup remote' host: archive.info does not exist b stanza-create db - stanza create (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info diff --git a/test/expect/mock-stanza-001.log b/test/expect/mock-stanza-001.log index f7a76475f..7e75b3272 100644 --- a/test/expect/mock-stanza-001.log +++ b/test/expect/mock-stanza-001.log @@ -4,14 +4,14 @@ run 001 - remote 0, s3 0 stanza-create db - fail on missing control file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 ERROR: [041]: unable to open [TEST_PATH]/db-master/db/base/global/pg_control P00 INFO: stanza-create command end: aborted with exception [041] stanza-upgrade db - fail on stanza not initialized since archive.info is missing (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 ERROR: [055]: archive.info does not exist but is required to push/get WAL segments HINT: is archive_command configured in postgresql.conf? HINT: has a stanza-create been performed? @@ -21,7 +21,7 @@ P00 INFO: stanza-upgrade command end: aborted with exception [055] stanza-create db - successfully create the stanza (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -59,7 +59,7 @@ db-version="9.3" stanza-create db - successful rerun of stanza-create (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -97,7 +97,7 @@ db-version="9.3" stanza-upgrade db - already up to date (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: the stanza data is already up to date P00 INFO: stanza-upgrade command end: completed successfully @@ -135,7 +135,7 @@ db-version="9.3" > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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: archive-push command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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: Archive::Push::File::archivePushFile(): bCompress = true, strWalFile = 000000010000000100000001, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = [TEST_PATH]/db-master/repo, strTempExtension = pgbackrest.tmp @@ -172,7 +172,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 stanza-create db - fail on archive info file missing from non-empty dir (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 ERROR: [055]: archive information missing HINT: use stanza-create --force to force the stanza data to be created. P00 INFO: stanza-create command end: aborted with exception [055] @@ -197,7 +197,7 @@ db-version="9.3" stanza-create db - gunzip fail on forced stanza-create (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 WARN: unable to create stanza 'db' P00 ERROR: [041]: unable to open '[TEST_PATH]/db-master/repo/archive/db/9.3-1/0000000100000001/000000010000000100000001-f5035e2c3b83a9c32660f959b23451e78f7438f7.gz': Permission denied P00 INFO: stanza-create command end: aborted with exception [041] @@ -222,7 +222,7 @@ db-version="9.3" stanza-create db - force create archive.info from gz file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -260,7 +260,7 @@ db-version="9.3" stanza-create db - repeat create (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -298,7 +298,7 @@ db-version="9.3" stanza-create db - hash check fails requiring force (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 WARN: unable to create stanza 'db' P00 ERROR: [028]: archive info file invalid HINT: use stanza-upgrade if the database has been upgraded or use --force @@ -339,7 +339,7 @@ db-version="8.0" stanza-create db - use force to overwrite the invalid file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -377,7 +377,7 @@ db-version="9.3" stanza-create db - fail on database mismatch without force option (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 WARN: unable to create stanza 'db' P00 ERROR: [028]: archive info file invalid HINT: use stanza-upgrade if the database has been upgraded or use --force @@ -418,7 +418,7 @@ db-version="9.3" stanza-create db - force create archive.info from uncompressed file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -456,7 +456,7 @@ db-version="9.3" stanza-create db - force with missing WAL archive file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -494,7 +494,7 @@ db-version="9.3" stanza-create db - force with missing WAL archive directory (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 WARN: found empty directory [TEST_PATH]/db-master/repo/archive/db/9.3-1 P00 INFO: stanza-create command end: completed successfully @@ -539,7 +539,7 @@ P00 ERROR: [044]: WAL segment version 9.4 does not match archive version 9.3 stanza-upgrade db - successful upgrade creates additional history (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-upgrade command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -582,7 +582,7 @@ db-version="9.4" stanza-create db - use force to recreate the stanza producing mismatched info history but same current db-id (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 WARN: found empty directory [TEST_PATH]/db-master/repo/archive/db/9.3-1 P00 INFO: stanza-create command end: completed successfully @@ -622,7 +622,7 @@ db-version="9.4" stanza-create db - use force to recreate the stanza producing mismatched db-id (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 WARN: found empty directory [TEST_PATH]/db-master/repo/archive/db/9.3-1 P00 INFO: stanza-create command end: completed successfully @@ -661,14 +661,14 @@ db-version="9.4" full backup - create first full backup (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --retention-full=2 --no-online --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --retention-full=2 --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --retention-full=2 --stanza=db --start-fast --type=full P01 INFO: backup file [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 (16MB, 99%) checksum 1e34fa1c833090d94b9bb14f2a8d3153dca6ea27 P01 INFO: backup file [TEST_PATH]/db-master/db/base/global/pg_control (8KB, 100%) checksum 89373d9f2973502940de06bc5212489df3f8a912 P01 INFO: backup file [TEST_PATH]/db-master/db/base/pg_xlog/archive_status/000000010000000100000001.ready (0B, 100%) P00 INFO: full backup size = 16MB P00 INFO: new backup label = [BACKUP-FULL-1] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=2 --retention-full=2 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=2 --retention-full=2 --stanza=db P00 INFO: remove archive path: [TEST_PATH]/db-master/repo/archive/db/9.3-1 P00 INFO: full backup total < 2 - using oldest full backup for 9.4-2 archive retention P00 INFO: expire command end: completed successfully @@ -696,7 +696,7 @@ start-fast=y stanza-create db - fail no force to recreate the stanza from backups (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 ERROR: [055]: backup information missing HINT: use stanza-create --force to force the stanza data to be created. P00 INFO: stanza-create command end: aborted with exception [055] @@ -719,7 +719,7 @@ db-version="9.4" stanza-create db - use force to recreate the stanza from backups (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -760,7 +760,7 @@ db-version="9.4" stanza-upgrade db - successfully upgrade with XX.Y-Z (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --stanza=db P00 INFO: stanza-upgrade command end: completed successfully + supplemental file: [TEST_PATH]/db-master/repo/backup/db/backup.info @@ -807,7 +807,7 @@ db-version="9.5" diff backup - diff changed to full backup (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --retention-full=2 --no-online --log-level-console=detail --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --retention-full=2 --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/db-master/repo --retention-full=2 --stanza=db --start-fast --type=diff P00 WARN: no prior backup exists, diff backup has been changed to full P01 INFO: backup file [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 (16MB, 99%) checksum 15b1a1a35c26b17570aca7920980f0ad11c6d858 P01 INFO: backup file [TEST_PATH]/db-master/db/base/global/pg_control (8KB, 100%) checksum e28bf39d0a56bf9fabd4049b329fcae8878bfec6 @@ -815,7 +815,7 @@ P01 INFO: backup file [TEST_PATH]/db-master/db/base/pg_xlog/archive_status/000 P00 INFO: full backup size = 16MB P00 INFO: new backup label = [BACKUP-FULL-2] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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 --retention-archive=2 --retention-full=2 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --repo-path=[TEST_PATH]/db-master/repo --retention-archive=2 --retention-full=2 --stanza=db P00 INFO: remove archive path: [TEST_PATH]/db-master/repo/archive/db/10.0-3 P00 INFO: expire command end: completed successfully diff --git a/test/expect/mock-stanza-002.log b/test/expect/mock-stanza-002.log index 6d2bf2913..2cee0dc07 100644 --- a/test/expect/mock-stanza-002.log +++ b/test/expect/mock-stanza-002.log @@ -4,14 +4,14 @@ run 002 - remote 1, s3 0 stanza-create db - fail on missing control file (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 ERROR: [041]: raised on 'db-master remote' host: unable to open [TEST_PATH]/db-master/db/base/global/pg_control P00 INFO: stanza-create command end: aborted with exception [041] stanza-upgrade db - fail on stanza not initialized since archive.info is missing (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 ERROR: [055]: archive.info does not exist but is required to push/get WAL segments HINT: is archive_command configured in postgresql.conf? HINT: has a stanza-create been performed? @@ -21,7 +21,7 @@ P00 INFO: stanza-upgrade command end: aborted with exception [055] stanza-create db - successfully create the stanza (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -59,7 +59,7 @@ db-version="9.3" stanza-create db - successful rerun of stanza-create (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -97,7 +97,7 @@ db-version="9.3" stanza-upgrade db - already up to date (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: the stanza data is already up to date P00 INFO: stanza-upgrade command end: completed successfully @@ -135,13 +135,13 @@ db-version="9.3" > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 ------------------------------------------------------------------------------------------------------------------------------------ -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] --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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: archive-push command begin [BACKREST-VERSION]: --backup-cmd=[BACKREST-BIN] --backup-config=[TEST_PATH]/backup/pgbackrest.conf --backup-host=backup --backup-user=[USER-2] --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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: Archive::Push::File::archivePushFile(): bCompress = true, 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 -P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=archive-push --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --stanza=db --type=backup remote, strCommandSSH = ssh, strHost = backup, strUser = [USER-2] -P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no backrest@backup '[BACKREST-BIN] --buffer-size=4194304 --command=archive-push --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --protocol-timeout=60 --stanza=db --type=backup remote', strId = 'backup remote', strName = remote +P00 DEBUG: Protocol::Remote::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, iSshPort = [undef], strCommand = [BACKREST-BIN] --buffer-size=4194304 --command=archive-push --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --stanza=db --type=backup remote, strCommandSSH = ssh, strHost = backup, strUser = [USER-2] +P00 DEBUG: Protocol::Command::Master->new(): iBufferMax = 4194304, iCompressLevel = 6, iCompressLevelNetwork = 3, iProtocolTimeout = 60, strCommand = ssh -o LogLevel=error -o Compression=no -o PasswordAuthentication=no backrest@backup '[BACKREST-BIN] --buffer-size=4194304 --command=archive-push --compress-level=6 --compress-level-network=3 --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --protocol-timeout=60 --stanza=db --type=backup remote', strId = 'backup remote', strName = remote P00 DEBUG: Protocol::Storage::Remote->new(): oProtocol = [object] P00 DEBUG: Archive::Common::walInfo(): strWalFile = [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 P00 DEBUG: Archive::Common::walInfo=>: strDbVersion = 9.3, ullDbSysId = 6395542721432104958 @@ -170,7 +170,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 stanza-create db - fail on archive info file missing from non-empty dir (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 ERROR: [055]: archive information missing HINT: use stanza-create --force to force the stanza data to be created. P00 INFO: stanza-create command end: aborted with exception [055] @@ -195,7 +195,7 @@ db-version="9.3" stanza-create db - gunzip fail on forced stanza-create (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 WARN: unable to create stanza 'db' P00 ERROR: [041]: unable to open '[TEST_PATH]/backup/repo/archive/db/9.3-1/0000000100000001/000000010000000100000001-f5035e2c3b83a9c32660f959b23451e78f7438f7.gz': Permission denied P00 INFO: stanza-create command end: aborted with exception [041] @@ -220,7 +220,7 @@ db-version="9.3" stanza-create db - force create archive.info from gz file (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -258,7 +258,7 @@ db-version="9.3" stanza-create db - repeat create (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -296,7 +296,7 @@ db-version="9.3" stanza-create db - hash check fails requiring force (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 WARN: unable to create stanza 'db' P00 ERROR: [028]: archive info file invalid HINT: use stanza-upgrade if the database has been upgraded or use --force @@ -337,7 +337,7 @@ db-version="8.0" stanza-create db - use force to overwrite the invalid file (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -375,7 +375,7 @@ db-version="9.3" stanza-create db - fail on database mismatch without force option (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 WARN: unable to create stanza 'db' P00 ERROR: [028]: archive info file invalid HINT: use stanza-upgrade if the database has been upgraded or use --force @@ -416,7 +416,7 @@ db-version="9.3" stanza-create db - force create archive.info from uncompressed file (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -454,7 +454,7 @@ db-version="9.3" stanza-create db - force with missing WAL archive file (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -492,7 +492,7 @@ db-version="9.3" stanza-create db - force with missing WAL archive directory (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 WARN: found empty directory [TEST_PATH]/backup/repo/archive/db/9.3-1 P00 INFO: stanza-create command end: completed successfully @@ -537,7 +537,7 @@ P00 ERROR: [044]: raised on 'backup remote' host: WAL segment version 9.4 does stanza-upgrade db - successful upgrade creates additional history (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-upgrade command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -580,7 +580,7 @@ db-version="9.4" stanza-create db - use force to recreate the stanza producing mismatched info history but same current db-id (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 WARN: found empty directory [TEST_PATH]/backup/repo/archive/db/9.3-1 P00 INFO: stanza-create command end: completed successfully @@ -620,7 +620,7 @@ db-version="9.4" stanza-create db - use force to recreate the stanza producing mismatched db-id (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 WARN: found empty directory [TEST_PATH]/backup/repo/archive/db/9.3-1 P00 INFO: stanza-create command end: completed successfully @@ -659,14 +659,14 @@ db-version="9.4" full backup - create first full backup (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --retention-full=2 --no-online --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --retention-full=2 --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --retention-full=2 --stanza=db --start-fast --type=full P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 (16MB, 99%) checksum 1e34fa1c833090d94b9bb14f2a8d3153dca6ea27 P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base/global/pg_control (8KB, 100%) checksum 89373d9f2973502940de06bc5212489df3f8a912 P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base/pg_xlog/archive_status/000000010000000100000001.ready (0B, 100%) P00 INFO: full backup size = 16MB P00 INFO: new backup label = [BACKUP-FULL-1] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --retention-archive=2 --retention-full=2 --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --retention-archive=2 --retention-full=2 --stanza=db P00 INFO: remove archive path: [TEST_PATH]/backup/repo/archive/db/9.3-1 P00 INFO: full backup total < 2 - using oldest full backup for 9.4-2 archive retention P00 INFO: expire command end: completed successfully @@ -716,7 +716,7 @@ start-fast=y stanza-create db - fail no force to recreate the stanza from backups (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 ERROR: [055]: backup information missing HINT: use stanza-create --force to force the stanza data to be created. P00 INFO: stanza-create command end: aborted with exception [055] @@ -739,7 +739,7 @@ db-version="9.4" stanza-create db - use force to recreate the stanza from backups (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --force --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -780,7 +780,7 @@ db-version="9.4" stanza-upgrade db - successfully upgrade with XX.Y-Z (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --stanza=db P00 INFO: stanza-upgrade command end: completed successfully + supplemental file: [TEST_PATH]/backup/repo/backup/db/backup.info @@ -827,7 +827,7 @@ db-version="9.5" diff backup - diff changed to full backup (backup host) > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --retention-full=2 --no-online --log-level-console=detail --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --db-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --retention-full=2 --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-timeout=45 --db1-cmd=[BACKREST-BIN] --db1-config=[TEST_PATH]/db-master/pgbackrest.conf --db1-host=db-master --db1-path=[TEST_PATH]/db-master/db/base --db1-user=[USER-1] --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --no-online --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --retention-full=2 --stanza=db --start-fast --type=diff P00 WARN: no prior backup exists, diff backup has been changed to full P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 (16MB, 99%) checksum 15b1a1a35c26b17570aca7920980f0ad11c6d858 P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base/global/pg_control (8KB, 100%) checksum e28bf39d0a56bf9fabd4049b329fcae8878bfec6 @@ -835,7 +835,7 @@ P01 INFO: backup file db-master:[TEST_PATH]/db-master/db/base/pg_xlog/archive_ P00 INFO: full backup size = 16MB P00 INFO: new backup label = [BACKUP-FULL-2] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/backup/pgbackrest.conf --db-cmd=[BACKREST-BIN] --db-config=[TEST_PATH]/db-master/pgbackrest.conf --db-host=db-master --db-timeout=45 --lock-path=[TEST_PATH]/backup/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --protocol-timeout=60 --repo-path=[TEST_PATH]/backup/repo --retention-archive=2 --retention-full=2 --stanza=db +P00 INFO: expire 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=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/backup/log --repo-path=[TEST_PATH]/backup/repo --retention-archive=2 --retention-full=2 --stanza=db P00 INFO: remove archive path: [TEST_PATH]/backup/repo/archive/db/10.0-3 P00 INFO: expire command end: completed successfully diff --git a/test/expect/mock-stanza-003.log b/test/expect/mock-stanza-003.log index facc60bbd..a91f49479 100644 --- a/test/expect/mock-stanza-003.log +++ b/test/expect/mock-stanza-003.log @@ -4,14 +4,14 @@ run 003 - remote 0, s3 1 stanza-create db - fail on missing control file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 ERROR: [041]: unable to open [TEST_PATH]/db-master/db/base/global/pg_control P00 INFO: stanza-create command end: aborted with exception [041] stanza-upgrade db - fail on stanza not initialized since archive.info is missing (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 ERROR: [055]: archive.info does not exist but is required to push/get WAL segments HINT: is archive_command configured in postgresql.conf? HINT: has a stanza-create been performed? @@ -21,7 +21,7 @@ P00 INFO: stanza-upgrade command end: aborted with exception [055] stanza-create db - successfully create the stanza (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -59,7 +59,7 @@ db-version="9.3" stanza-create db - successful rerun of stanza-create (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -97,7 +97,7 @@ db-version="9.3" stanza-upgrade db - already up to date (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: the stanza data is already up to date P00 INFO: stanza-upgrade command end: completed successfully @@ -135,7 +135,7 @@ db-version="9.3" > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db archive-push [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: archive-push command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: archive-push command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --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-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: Archive::Push::File::archivePushFile(): bCompress = true, strWalFile = 000000010000000100000001, strWalPath = [TEST_PATH]/db-master/db/base/pg_xlog P00 DEBUG: Storage::Local->new(): bAllowTemp = , hRule = [hash], lBufferMax = 4194304, oDriver = [object], strDefaultFileMode = <0640>, strDefaultPathMode = <0750>, strPathBase = /, strTempExtension = pgbackrest.tmp @@ -172,7 +172,7 @@ P00 DEBUG: Common::Exit::exitSafe=>: iExitCode = 0 stanza-create db - fail on archive info file missing from non-empty dir (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 ERROR: [055]: archive information missing HINT: use stanza-create --force to force the stanza data to be created. P00 INFO: stanza-create command end: aborted with exception [055] @@ -197,7 +197,7 @@ db-version="9.3" stanza-create db - force create archive.info from gz file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -235,7 +235,7 @@ db-version="9.3" stanza-create db - repeat create (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -273,7 +273,7 @@ db-version="9.3" stanza-create db - hash check fails requiring force (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 WARN: unable to create stanza 'db' P00 ERROR: [028]: archive info file invalid HINT: use stanza-upgrade if the database has been upgraded or use --force @@ -314,7 +314,7 @@ db-version="8.0" stanza-create db - use force to overwrite the invalid file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -352,7 +352,7 @@ db-version="9.3" stanza-create db - fail on database mismatch without force option (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 WARN: unable to create stanza 'db' P00 ERROR: [028]: archive info file invalid HINT: use stanza-upgrade if the database has been upgraded or use --force @@ -393,7 +393,7 @@ db-version="9.3" stanza-create db - force create archive.info from uncompressed file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -431,7 +431,7 @@ db-version="9.3" stanza-create db - force with missing WAL archive file (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -469,7 +469,7 @@ db-version="9.3" stanza-create db - force with missing WAL archive directory (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -513,7 +513,7 @@ P00 ERROR: [044]: WAL segment version 9.4 does not match archive version 9.3 stanza-upgrade db - successful upgrade creates additional history (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-upgrade command end: completed successfully + supplemental file: /backup/db/backup.info @@ -556,7 +556,7 @@ db-version="9.4" stanza-create db - use force to recreate the stanza producing mismatched info history but same current db-id (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -595,7 +595,7 @@ db-version="9.4" stanza-create db - use force to recreate the stanza producing mismatched db-id (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -633,14 +633,14 @@ db-version="9.4" full backup - create first full backup (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --retention-full=2 --no-online --log-level-console=detail --type=full --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --retention-full=2 --stanza=db --start-fast --type=full +P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --retention-full=2 --stanza=db --start-fast --type=full P01 INFO: backup file [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 (16MB, 99%) checksum 1e34fa1c833090d94b9bb14f2a8d3153dca6ea27 P01 INFO: backup file [TEST_PATH]/db-master/db/base/global/pg_control (8KB, 100%) checksum 89373d9f2973502940de06bc5212489df3f8a912 P01 INFO: backup file [TEST_PATH]/db-master/db/base/pg_xlog/archive_status/000000010000000100000001.ready (0B, 100%) P00 INFO: full backup size = 16MB P00 INFO: new backup label = [BACKUP-FULL-1] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --retention-archive=2 --retention-full=2 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --retention-archive=2 --retention-full=2 --stanza=db P00 INFO: full backup total < 2 - using oldest full backup for 9.4-2 archive retention P00 INFO: expire command end: completed successfully @@ -674,7 +674,7 @@ start-fast=y stanza-create db - fail no force to recreate the stanza from backups (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 ERROR: [055]: backup information missing HINT: use stanza-create --force to force the stanza data to be created. P00 INFO: stanza-create command end: aborted with exception [055] @@ -697,7 +697,7 @@ db-version="9.4" stanza-create db - use force to recreate the stanza from backups (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online --force stanza-create ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-create command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --force --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-create command end: completed successfully + supplemental file: /backup/db/backup.info @@ -738,7 +738,7 @@ db-version="9.4" stanza-upgrade db - successfully upgrade with XX.Y-Z (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --stanza=db --log-level-console=detail --no-online stanza-upgrade ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-path=[TEST_PATH]/db-master/db/base --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db +P00 INFO: stanza-upgrade command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --stanza=db P00 INFO: stanza-upgrade command end: completed successfully + supplemental file: /backup/db/backup.info @@ -785,7 +785,7 @@ db-version="9.5" diff backup - diff changed to full backup (db-master host) > [CONTAINER-EXEC] db-master [BACKREST-BIN] --config=[TEST_PATH]/db-master/pgbackrest.conf --retention-full=2 --no-online --log-level-console=detail --type=diff --stanza=db backup ------------------------------------------------------------------------------------------------------------------------------------ -P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-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-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --retention-full=2 --stanza=db --start-fast --type=diff +P00 INFO: backup command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --db1-path=[TEST_PATH]/db-master/db/base --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --log-level-file=trace --log-level-stderr=off --log-path=[TEST_PATH]/db-master/log --no-online --protocol-timeout=60 --repo-path=/ --repo-s3-bucket=pgbackrest-dev --repo-s3-endpoint=s3.amazonaws.com --repo-s3-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --retention-full=2 --stanza=db --start-fast --type=diff P00 WARN: no prior backup exists, diff backup has been changed to full P01 INFO: backup file [TEST_PATH]/db-master/db/base/pg_xlog/000000010000000100000001 (16MB, 99%) checksum 15b1a1a35c26b17570aca7920980f0ad11c6d858 P01 INFO: backup file [TEST_PATH]/db-master/db/base/global/pg_control (8KB, 100%) checksum e28bf39d0a56bf9fabd4049b329fcae8878bfec6 @@ -793,7 +793,7 @@ P01 INFO: backup file [TEST_PATH]/db-master/db/base/pg_xlog/archive_status/000 P00 INFO: full backup size = 16MB P00 INFO: new backup label = [BACKUP-FULL-2] P00 INFO: backup command end: completed successfully -P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --db-timeout=45 --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --retention-archive=2 --retention-full=2 --stanza=db +P00 INFO: expire command begin [BACKREST-VERSION]: --config=[TEST_PATH]/db-master/pgbackrest.conf --lock-path=[TEST_PATH]/db-master/lock --log-level-console=detail --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-region=us-east-1 --no-repo-s3-verify-ssl --repo-type=s3 --retention-archive=2 --retention-full=2 --stanza=db P00 INFO: remove archive path: /archive/db/10.0-3 P00 INFO: expire command end: completed successfully diff --git a/test/lib/pgBackRestTest/Common/JobTest.pm b/test/lib/pgBackRestTest/Common/JobTest.pm index bce553dd1..899e896c1 100644 --- a/test/lib/pgBackRestTest/Common/JobTest.pm +++ b/test/lib/pgBackRestTest/Common/JobTest.pm @@ -151,6 +151,21 @@ sub run containerRepo() . ':' . $self->{oTest}->{&TEST_VM} . "-test", {bSuppressStdErr => true}); + + # Install Perl C Library + # my $oVm = vmGet(); + # my $strOS = $self->{oTest}->{&TEST_VM}; + # my $strBuildPath = $self->{strBackRestBase} . "/test/.vagrant/libc/$strOS/libc/"; + # my $strPerlAutoPath = $$oVm{$strOS}{&VMDEF_PERL_ARCH_PATH} . '/auto/pgBackRest/LibC'; + # my $strPerlModulePath = $$oVm{$strOS}{&VMDEF_PERL_ARCH_PATH} . '/pgBackRest'; + # + # executeTest( + # "docker exec -i -u root ${strImage} bash -c '" . + # "mkdir -p -m 755 ${strPerlAutoPath} && " . + # "cp ${strBuildPath}/blib/arch/auto/pgBackRest/LibC/LibC.so ${strPerlAutoPath} && " . + # "cp ${strBuildPath}/blib/lib/auto/pgBackRest/LibC/autosplit.ix ${strPerlAutoPath} && " . + # "mkdir -p -m 755 ${strPerlModulePath} && " . + # "cp ${strBuildPath}/blib/lib/pgBackRest/LibC.pm ${strPerlModulePath}'"); } } diff --git a/test/lib/pgBackRestTest/Common/RunTest.pm b/test/lib/pgBackRestTest/Common/RunTest.pm index d14d56ebc..29ae284cd 100644 --- a/test/lib/pgBackRestTest/Common/RunTest.pm +++ b/test/lib/pgBackRestTest/Common/RunTest.pm @@ -19,7 +19,6 @@ use pgBackRest::Common::Exception; use pgBackRest::Common::Log; use pgBackRest::Common::String; use pgBackRest::Common::Wait; -use pgBackRest::Config::Config; use pgBackRest::Storage::Posix::Driver; use pgBackRest::Storage::Local; diff --git a/test/lib/pgBackRestTest/Env/ConfigEnvTest.pm b/test/lib/pgBackRestTest/Env/ConfigEnvTest.pm index 122493e91..62a580d6c 100644 --- a/test/lib/pgBackRestTest/Env/ConfigEnvTest.pm +++ b/test/lib/pgBackRestTest/Env/ConfigEnvTest.pm @@ -15,107 +15,130 @@ use English '-no_match_vars'; use pgBackRest::Common::Exception; use pgBackRest::Common::Log; use pgBackRest::Config::Config; +use pgBackRest::Config::Data; -sub optionSetTest +use constant CONFIGENVTEST => 'ConfigEnvTest'; + +sub optionTestSet { my $self = shift; - my $oOption = shift; - my $strKey = shift; + my $iOptionId = shift; my $strValue = shift; - $$oOption{option}{$strKey} = $strValue; + $self->{&CONFIGENVTEST}{option}{cfgOptionName($iOptionId)} = $strValue; } -sub optionBoolSetTest +sub optionTestSetBool { my $self = shift; - my $oOption = shift; - my $strKey = shift; + my $iOptionId = shift; my $bValue = shift; - $$oOption{boolean}{$strKey} = defined($bValue) ? $bValue : true; + $self->{&CONFIGENVTEST}{boolean}{cfgOptionName($iOptionId)} = defined($bValue) ? $bValue : true; } -sub commandSetTest +sub optionTestClear +{ + my $self = shift; + my $iOptionId = shift; + + delete($self->{&CONFIGENVTEST}{option}{cfgOptionName($iOptionId)}); + delete($self->{&CONFIGENVTEST}{boolean}{cfgOptionName($iOptionId)}); +} + +sub configTestClear +{ + my $self = shift; + + my $rhConfig = $self->{&CONFIGENVTEST}; + + delete($self->{&CONFIGENVTEST}); + + return $rhConfig; +} + +sub configTestSet +{ + my $self = shift; + my $rhConfig = shift; + + $self->{&CONFIGENVTEST} = $rhConfig; +} + +sub commandTestWrite { my $self = shift; - my $oOption = shift; my $strCommand = shift; + my $rhConfig = shift; - $$oOption{command} = $strCommand; -} + my @szyParam = (); -sub optionReset -{ - my $self = shift; - my $oOption = shift; - my $strKey = shift; - - delete($$oOption{option}{$strKey}); - delete($$oOption{boolean}{$strKey}); -} - -# sub optionRemoveTest -# { -# my $self = shift; -# my $oOption = shift; -# my $strKey = shift; -# -# delete($$oOption{option}{$strKey}); -# delete($$oOption{boolean}{$strKey}); -# } - -sub argvWriteTest -{ - my $self = shift; - my $oOption = shift; - - @ARGV = (); - - if (defined($$oOption{boolean})) + if (defined($rhConfig->{boolean})) { - foreach my $strKey (keys(%{$$oOption{boolean}})) + foreach my $strOption (sort(keys(%{$rhConfig->{boolean}}))) { - if ($$oOption{boolean}{$strKey}) + if ($rhConfig->{boolean}{$strOption}) { - $ARGV[@ARGV] = "--${strKey}"; + push(@szyParam, "--${strOption}"); } else { - $ARGV[@ARGV] = "--no-${strKey}"; + push(@szyParam, "--no-${strOption}"); } } } - if (defined($$oOption{option})) + if (defined($rhConfig->{option})) { - foreach my $strKey (keys(%{$$oOption{option}})) + foreach my $strOption (sort(keys(%{$rhConfig->{option}}))) { - $ARGV[@ARGV] = "--${strKey}=$$oOption{option}{$strKey}"; + push(@szyParam, "--${strOption}=$rhConfig->{option}{$strOption}"); } } - $ARGV[@ARGV] = $$oOption{command}; + push(@szyParam, $strCommand); - &log(INFO, " command line: " . join(" ", @ARGV)); - - %$oOption = (); + return @szyParam; } -sub configLoadExpect +sub configTestLoad +{ + my $self = shift; + my $iCommandId = shift; + + @ARGV = $self->commandTestWrite(cfgCommandName($iCommandId), $self->{&CONFIGENVTEST}); + $self->testResult(sub {configLoad(false)}, true, 'config load: ' . join(" ", @ARGV)); +} + +#################################################################################################################################### +# optionTestSetByName - used only by config unit tests, general option set should be done with optionTestSet +#################################################################################################################################### +sub optionTestSetByName +{ + my $self = shift; + my $strOption = shift; + my $strValue = shift; + + $self->{&CONFIGENVTEST}{option}{$strOption} = $strValue; +} + +#################################################################################################################################### +# configTestLoadExpect - used only by config unit tests, for general config load use configTestLoad() +#################################################################################################################################### +sub configTestLoadExpect { my $self = shift; - my $oOption = shift; my $strCommand = shift; my $iExpectedError = shift; my $strErrorParam1 = shift; my $strErrorParam2 = shift; my $strErrorParam3 = shift; - my $oOptionRuleExpected = optionRuleGet(); + my $oOptionRuleExpected = cfgdefRuleIndex(); - $self->commandSetTest($oOption, $strCommand); - $self->argvWriteTest($oOption); + @ARGV = $self->commandTestWrite($strCommand, $self->{&CONFIGENVTEST}); + $self->configTestClear(); + &log(INFO, " command line: " . join(" ", @ARGV)); my $bErrorFound = false; @@ -216,16 +239,21 @@ sub configLoadExpect } } +#################################################################################################################################### +# configTestExpect - used only by config unit tests +#################################################################################################################################### sub optionTestExpect { my $self = shift; - my $strOption = shift; + my $iOptionId = shift; my $strExpectedValue = shift; my $strExpectedKey = shift; + my $strOption = cfgOptionName($iOptionId); + if (defined($strExpectedValue)) { - my $strActualValue = optionGet($strOption); + my $strActualValue = cfgOption($iOptionId); if (defined($strExpectedKey)) { @@ -240,9 +268,9 @@ sub optionTestExpect $strActualValue eq $strExpectedValue or confess "expected option ${strOption} to have value ${strExpectedValue} but ${strActualValue} found instead"; } - elsif (optionTest($strOption)) + elsif (cfgOptionTest(cfgOptionId($strOption))) { - confess "expected option ${strOption} to be [undef], but " . optionGet($strOption) . ' found instead'; + confess "expected option ${strOption} to be [undef], but " . cfgOption(cfgOptionId($strOption)) . ' found instead'; } } diff --git a/test/lib/pgBackRestTest/Env/ExpireEnvTest.pm b/test/lib/pgBackRestTest/Env/ExpireEnvTest.pm index 63eb9671e..6d49746aa 100644 --- a/test/lib/pgBackRestTest/Env/ExpireEnvTest.pm +++ b/test/lib/pgBackRestTest/Env/ExpireEnvTest.pm @@ -159,7 +159,7 @@ sub stanzaCreate my $strDbVersionTemp = $strDbVersion; $strDbVersionTemp =~ s/\.//; - my $strDbPath = optionGet(OPTION_DB_PATH); + my $strDbPath = cfgOption(CFGOPT_DB_PATH); # Create the test path for pg_control storageTest()->pathCreate(($strDbPath . '/' . DB_PATH_GLOBAL), {bIgnoreExists => true}); @@ -202,13 +202,13 @@ sub stanzaUpgrade $strDbVersionTemp =~ s/\.//; # Remove pg_control - storageTest()->remove(optionGet(OPTION_DB_PATH) . '/' . DB_FILE_PGCONTROL); + storageTest()->remove(cfgOption(CFGOPT_DB_PATH) . '/' . DB_FILE_PGCONTROL); # Copy pg_control for stanza-upgrade executeTest( - 'cp ' . $self->{oRunTest}->dataPath() . '/backup.pg_control_' . $strDbVersionTemp . '.bin ' . optionGet(OPTION_DB_PATH) . + 'cp ' . $self->{oRunTest}->dataPath() . '/backup.pg_control_' . $strDbVersionTemp . '.bin ' . cfgOption(CFGOPT_DB_PATH) . '/' . DB_FILE_PGCONTROL); - executeTest('sudo chmod 600 ' . optionGet(OPTION_DB_PATH) . '/' . DB_FILE_PGCONTROL); + executeTest('sudo chmod 600 ' . cfgOption(CFGOPT_DB_PATH) . '/' . DB_FILE_PGCONTROL); $self->stanzaSet($strStanza, $strDbVersion, true); @@ -252,7 +252,7 @@ sub backupCreate } # Create the manifest - my $oLastManifest = $strType ne BACKUP_TYPE_FULL ? $$oStanza{oManifest} : undef; + my $oLastManifest = $strType ne CFGOPTVAL_BACKUP_TYPE_FULL ? $$oStanza{oManifest} : undef; my $strBackupLabel = backupLabelFormat($strType, @@ -284,7 +284,7 @@ sub backupCreate $oManifest->set(MANIFEST_SECTION_BACKUP, MANIFEST_KEY_TYPE, undef, $strType); $oManifest->set(INI_SECTION_BACKREST, INI_KEY_VERSION, undef, BACKREST_VERSION); - if ($strType ne BACKUP_TYPE_FULL) + if ($strType ne CFGOPTVAL_BACKUP_TYPE_FULL) { if (!defined($oLastManifest)) { @@ -526,9 +526,9 @@ sub process undef($$oStanza{strBackupDescription}); my $strCommand = $self->{strBackRestExe} . - ' --' . OPTION_CONFIG . '="' . $self->{oHostBackup}->backrestConfig() . '"' . - ' --' . OPTION_STANZA . '=' . $strStanza . - ' --' . OPTION_LOG_LEVEL_CONSOLE . '=' . lc(DETAIL); + ' --' . cfgOptionName(CFGOPT_CONFIG) . '="' . $self->{oHostBackup}->backrestConfig() . '"' . + ' --' . cfgOptionName(CFGOPT_STANZA) . '=' . $strStanza . + ' --' . cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE) . '=' . lc(DETAIL); if (defined($iExpireFull)) { diff --git a/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm b/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm index e644af263..a7c7c1844 100644 --- a/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm +++ b/test/lib/pgBackRestTest/Env/Host/HostBackupTest.pm @@ -250,7 +250,7 @@ sub backupEnd } # Make sure tablespace links are correct - if (($strType eq BACKUP_TYPE_FULL || $self->hardLink()) && $self->hasLink()) + if (($strType eq CFGOPTVAL_BACKUP_TYPE_FULL || $self->hardLink()) && $self->hasLink()) { my $hTablespaceManifest = storageRepo()->manifest( STORAGE_REPO_BACKUP . "/${strBackup}/" . MANIFEST_TARGET_PGDATA . '/' . DB_PATH_PGTBLSPC); @@ -314,7 +314,7 @@ sub backupEnd my $strLatestLink = storageRepo()->pathGet(STORAGE_REPO_BACKUP . qw{/} . LINK_LATEST); my $bLatestLinkExists = storageRepo()->exists($strLatestLink); - if ((!defined($oParam->{strRepoType}) || $oParam->{strRepoType} eq REPO_TYPE_POSIX) && $self->hasLink()) + if ((!defined($oParam->{strRepoType}) || $oParam->{strRepoType} eq CFGOPTVAL_REPO_TYPE_POSIX) && $self->hasLink()) { my $strLatestLinkDestination = readlink($strLatestLink); @@ -896,6 +896,37 @@ sub stop return logDebugReturn($strOperation); } + +#################################################################################################################################### +# optionIndexName - return name for options that can be indexed (e.g. db1-host, db2-host) +# +# This differs from cfgOptionIndex because it allows the index number for index 1 to be ommitted for testing. +#################################################################################################################################### +sub optionIndexName +{ + my $self = shift; + my $iOptionId = shift; + my $iIndex = shift; + my $bForce = shift; + + # If the option doesn't have a prefix it can't be indexed + $iIndex = defined($iIndex) ? $iIndex : 1; + my $strPrefix = cfgRuleOptionPrefix($iOptionId); + + if (!defined($strPrefix) && $iIndex > 1) + { + confess &log(ASSERT, "'" . cfgOptionName($iOptionId) . "' option does not allow indexing"); + } + + # Index 1 is the same name as the option unless forced to include the index + if ($iIndex == 1 && (!defined($bForce) || !$bForce)) + { + return $strPrefix . substr(cfgOptionName($iOptionId), index(cfgOptionName($iOptionId), '-')); + } + + return "${strPrefix}${iIndex}" . substr(cfgOptionName($iOptionId), index(cfgOptionName($iOptionId), '-')); +} + #################################################################################################################################### # configCreate #################################################################################################################################### @@ -926,45 +957,45 @@ sub configCreate # General options # ------------------------------------------------------------------------------------------------------------------------------ - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_LEVEL_CONSOLE} = lc(DEBUG); - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_LEVEL_FILE} = lc(TRACE); - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_LEVEL_STDERR} = lc(OFF); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE)} = lc(DEBUG); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOG_LEVEL_FILE)} = lc(TRACE); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOG_LEVEL_STDERR)} = lc(OFF); - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_PATH} = $self->logPath(); - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_LOCK_PATH} = $self->lockPath(); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOG_PATH)} = $self->logPath(); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOCK_PATH)} = $self->lockPath(); - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_PROTOCOL_TIMEOUT} = 60; - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_DB_TIMEOUT} = 45; + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_PROTOCOL_TIMEOUT)} = 60; + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_DB_TIMEOUT)} = 45; if (defined($$oParam{bCompress}) && !$$oParam{bCompress}) { - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_COMPRESS} = 'n'; + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_COMPRESS)} = 'n'; } if ($self->isHostBackup()) { - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_PATH} = $self->repoPath(); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_REPO_PATH)} = $self->repoPath(); # S3 settings if ($oParam->{bS3}) { - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_TYPE} = REPO_TYPE_S3; - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_S3_KEY} = HOST_S3_ACCESS_KEY; - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_S3_KEY_SECRET} = HOST_S3_ACCESS_SECRET_KEY; - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_S3_BUCKET} = HOST_S3_BUCKET; - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_S3_ENDPOINT} = HOST_S3_ENDPOINT; - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_S3_REGION} = HOST_S3_REGION; - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_S3_VERIFY_SSL} = 'n'; + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_REPO_TYPE)} = CFGOPTVAL_REPO_TYPE_S3; + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_REPO_S3_KEY)} = HOST_S3_ACCESS_KEY; + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_REPO_S3_KEY_SECRET)} = HOST_S3_ACCESS_SECRET_KEY; + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_REPO_S3_BUCKET)} = HOST_S3_BUCKET; + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_REPO_S3_ENDPOINT)} = HOST_S3_ENDPOINT; + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_REPO_S3_REGION)} = HOST_S3_REGION; + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_REPO_S3_VERIFY_SSL)} = 'n'; } if (defined($$oParam{bHardlink}) && $$oParam{bHardlink}) { $self->{bHardLink} = true; - $oParamHash{&CONFIG_SECTION_GLOBAL . ':' . &CMD_BACKUP}{&OPTION_HARDLINK} = 'y'; + $oParamHash{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_BACKUP)}{cfgOptionName(CFGOPT_HARDLINK)} = 'y'; } - $oParamHash{&CONFIG_SECTION_GLOBAL . ':' . &CMD_BACKUP}{&OPTION_BACKUP_ARCHIVE_COPY} = 'y'; - $oParamHash{&CONFIG_SECTION_GLOBAL . ':' . &CMD_BACKUP}{&OPTION_START_FAST} = 'y'; + $oParamHash{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_BACKUP)}{cfgOptionName(CFGOPT_ARCHIVE_COPY)} = 'y'; + $oParamHash{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_BACKUP)}{cfgOptionName(CFGOPT_START_FAST)} = 'y'; } # Host specific options @@ -989,32 +1020,32 @@ sub configCreate if ($self->nameTest(HOST_BACKUP)) { - $oParamHash{$strStanza}{optionIndex(OPTION_DB_HOST, 1, $bForce)} = $oHostDb1->nameGet(); - $oParamHash{$strStanza}{optionIndex(OPTION_DB_USER, 1, $bForce)} = $oHostDb1->userGet(); - $oParamHash{$strStanza}{optionIndex(OPTION_DB_CMD, 1, $bForce)} = $oHostDb1->backrestExe(); - $oParamHash{$strStanza}{optionIndex(OPTION_DB_CONFIG, 1, $bForce)} = $oHostDb1->backrestConfig(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_HOST, 1, $bForce)} = $oHostDb1->nameGet(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_USER, 1, $bForce)} = $oHostDb1->userGet(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_CMD, 1, $bForce)} = $oHostDb1->backrestExe(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_CONFIG, 1, $bForce)} = $oHostDb1->backrestConfig(); # Port can't be configured for a synthetic host if (!$self->synthetic()) { - $oParamHash{$strStanza}{optionIndex(OPTION_DB_PORT, 1, $bForce)} = $oHostDb1->pgPort(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PORT, 1, $bForce)} = $oHostDb1->pgPort(); } } - $oParamHash{$strStanza}{optionIndex(OPTION_DB_PATH, 1, $bForce)} = $oHostDb1->dbBasePath(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PATH, 1, $bForce)} = $oHostDb1->dbBasePath(); if (defined($oHostDb2)) { - $oParamHash{$strStanza}{optionIndex(OPTION_DB_HOST, 2)} = $oHostDb2->nameGet(); - $oParamHash{$strStanza}{optionIndex(OPTION_DB_USER, 2)} = $oHostDb2->userGet(); - $oParamHash{$strStanza}{optionIndex(OPTION_DB_CMD, 2)} = $oHostDb2->backrestExe(); - $oParamHash{$strStanza}{optionIndex(OPTION_DB_CONFIG, 2)} = $oHostDb2->backrestConfig(); - $oParamHash{$strStanza}{optionIndex(OPTION_DB_PATH, 2)} = $oHostDb2->dbBasePath(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_HOST, 2)} = $oHostDb2->nameGet(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_USER, 2)} = $oHostDb2->userGet(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_CMD, 2)} = $oHostDb2->backrestExe(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_CONFIG, 2)} = $oHostDb2->backrestConfig(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PATH, 2)} = $oHostDb2->dbBasePath(); # Only test explicit ports on the backup server. This is so locally configured ports are also tested. if (!$self->synthetic() && $self->nameTest(HOST_BACKUP)) { - $oParamHash{$strStanza}{optionIndex(OPTION_DB_PORT, 2)} = $oHostDb2->pgPort(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PORT, 2)} = $oHostDb2->pgPort(); } } } @@ -1022,31 +1053,32 @@ sub configCreate # If this is a database host if ($self->isHostDb()) { - $oParamHash{$strStanza}{&OPTION_DB_PATH} = $self->dbBasePath(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PATH)} = $self->dbBasePath(); if (!$self->synthetic()) { - $oParamHash{$strStanza}{&OPTION_DB_SOCKET_PATH} = $self->pgSocketPath(); - $oParamHash{$strStanza}{&OPTION_DB_PORT} = $self->pgPort(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_SOCKET_PATH)} = $self->pgSocketPath(); + $oParamHash{$strStanza}{$self->optionIndexName(CFGOPT_DB_PORT)} = $self->pgPort(); } if ($bArchiveAsync) { - $oParamHash{&CONFIG_SECTION_GLOBAL . ':' . &CMD_ARCHIVE_PUSH}{&OPTION_ARCHIVE_ASYNC} = 'y'; + $oParamHash{&CFGDEF_SECTION_GLOBAL . ':' . + cfgCommandName(CFGCMD_ARCHIVE_PUSH)}{cfgOptionName(CFGOPT_ARCHIVE_ASYNC)} = 'y'; } - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_SPOOL_PATH} = $self->spoolPath(); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_SPOOL_PATH)} = $self->spoolPath(); # If the the backup host is remote if (!$self->isHostBackup()) { - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_BACKUP_HOST} = $oHostBackup->nameGet(); - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_BACKUP_USER} = $oHostBackup->userGet(); - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_BACKUP_CMD} = $oHostBackup->backrestExe(); - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_BACKUP_CONFIG} = $oHostBackup->backrestConfig(); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_BACKUP_HOST)} = $oHostBackup->nameGet(); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_BACKUP_USER)} = $oHostBackup->userGet(); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_BACKUP_CMD)} = $oHostBackup->backrestExe(); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_BACKUP_CONFIG)} = $oHostBackup->backrestConfig(); - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_PATH} = $self->logPath(); - $oParamHash{&CONFIG_SECTION_GLOBAL}{&OPTION_LOCK_PATH} = $self->lockPath(); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOG_PATH)} = $self->logPath(); + $oParamHash{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOCK_PATH)} = $self->lockPath(); } } diff --git a/test/lib/pgBackRestTest/Env/Host/HostDbCommonTest.pm b/test/lib/pgBackRestTest/Env/Host/HostDbCommonTest.pm index 5062248af..42d40a9d6 100644 --- a/test/lib/pgBackRestTest/Env/Host/HostDbCommonTest.pm +++ b/test/lib/pgBackRestTest/Env/Host/HostDbCommonTest.pm @@ -179,7 +179,7 @@ sub configRecovery if (@stryRecoveryOption) { - $oConfig->{$strStanza}{&OPTION_RESTORE_RECOVERY_OPTION} = \@stryRecoveryOption; + $oConfig->{$strStanza}{cfgOptionName(CFGOPT_RECOVERY_OPTION)} = \@stryRecoveryOption; } # Save db config file @@ -213,7 +213,7 @@ sub configRemap } # Rewrite recovery section - delete($oConfig->{"${strStanza}:restore"}{&OPTION_TABLESPACE_MAP}); + delete($oConfig->{"${strStanza}:restore"}{cfgOptionName(CFGOPT_TABLESPACE_MAP)}); my @stryTablespaceMap; foreach my $strRemap (sort(keys(%$oRemapHashRef))) @@ -222,13 +222,14 @@ sub configRemap if ($strRemap eq MANIFEST_TARGET_PGDATA) { - $oConfig->{$strStanza}{&OPTION_DB_PATH} = $strRemapPath; + $oConfig->{$strStanza}{$self->optionIndexName(CFGOPT_DB_PATH, 1)} = $strRemapPath; + ${$oManifestRef}{&MANIFEST_SECTION_BACKUP_TARGET}{&MANIFEST_TARGET_PGDATA}{&MANIFEST_SUBKEY_PATH} = $strRemapPath; if (defined($oHostBackup)) { my $bForce = $oHostBackup->nameTest(HOST_BACKUP) && defined(hostGroupGet()->hostGet(HOST_DB_STANDBY, true)); - $oRemoteConfig->{$strStanza}{optionIndex(OPTION_DB_PATH, 1, $bForce)} = $strRemapPath; + $oRemoteConfig->{$strStanza}{$self->optionIndexName(CFGOPT_DB_PATH, 1, $bForce)} = $strRemapPath; } } else @@ -243,7 +244,7 @@ sub configRemap if (@stryTablespaceMap) { - $oConfig->{"${strStanza}:restore"}{&OPTION_TABLESPACE_MAP} = \@stryTablespaceMap; + $oConfig->{"${strStanza}:restore"}{cfgOptionName(CFGOPT_TABLESPACE_MAP)} = \@stryTablespaceMap; } # Save db config file @@ -330,13 +331,13 @@ sub restore $strComment = 'restore' . ($bDelta ? ' delta' : '') . ($bForce ? ', force' : '') . - ($strBackup ne OPTION_DEFAULT_RESTORE_SET ? ", backup '${strBackup}'" : '') . + ($strBackup ne cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET) ? ", backup '${strBackup}'" : '') . ($strType ? ", type '${strType}'" : '') . ($strTarget ? ", target '${strTarget}'" : '') . ($strTargetTimeline ? ", timeline '${strTargetTimeline}'" : '') . (defined($bTargetExclusive) && $bTargetExclusive ? ', exclusive' : '') . - (defined($strTargetAction) && $strTargetAction ne OPTION_DEFAULT_RESTORE_TARGET_ACTION - ? ', ' . OPTION_TARGET_ACTION . "=${strTargetAction}" : '') . + (defined($strTargetAction) && $strTargetAction ne cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_TARGET_ACTION) + ? ', ' . cfgOptionName(CFGOPT_TARGET_ACTION) . "=${strTargetAction}" : '') . (defined($oRemapHashRef) ? ', remap' : '') . (defined($iExpectedExitStatus) ? ", expect exit ${iExpectedExitStatus}" : '') . (defined($strComment) ? " - ${strComment}" : '') . @@ -416,16 +417,16 @@ sub restore ' --config=' . $self->backrestConfig() . (defined($bDelta) && $bDelta ? ' --delta' : '') . (defined($bForce) && $bForce ? ' --force' : '') . - ($strBackup ne OPTION_DEFAULT_RESTORE_SET ? " --set=${strBackup}" : '') . + ($strBackup ne cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET) ? " --set=${strBackup}" : '') . (defined($strOptionalParam) ? " ${strOptionalParam} " : '') . - (defined($strType) && $strType ne RECOVERY_TYPE_DEFAULT ? " --type=${strType}" : '') . + (defined($strType) && $strType ne CFGOPTVAL_RESTORE_TYPE_DEFAULT ? " --type=${strType}" : '') . (defined($strTarget) ? " --target=\"${strTarget}\"" : '') . (defined($strTargetTimeline) ? " --target-timeline=\"${strTargetTimeline}\"" : '') . (defined($bTargetExclusive) && $bTargetExclusive ? ' --target-exclusive' : '') . (defined($strLinkMap) ? $strLinkMap : '') . ($self->synthetic() ? '' : ' --link-all') . - (defined($strTargetAction) && $strTargetAction ne OPTION_DEFAULT_RESTORE_TARGET_ACTION - ? ' --' . OPTION_TARGET_ACTION . "=${strTargetAction}" : '') . + (defined($strTargetAction) && $strTargetAction ne cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_TARGET_ACTION) + ? ' --' . cfgOptionName(CFGOPT_TARGET_ACTION) . "=${strTargetAction}" : '') . ' --stanza=' . $self->stanza() . ' restore', {strComment => $strComment, iExpectedExitStatus => $iExpectedExitStatus, oLogTest => $self->{oLogTest}, bLogOutput => $self->synthetic()}, diff --git a/test/lib/pgBackRestTest/Env/HostEnvTest.pm b/test/lib/pgBackRestTest/Env/HostEnvTest.pm index 5ae439334..765c8f083 100644 --- a/test/lib/pgBackRestTest/Env/HostEnvTest.pm +++ b/test/lib/pgBackRestTest/Env/HostEnvTest.pm @@ -164,25 +164,24 @@ sub setup } # Set options needed for storage helper - my $oOption = {}; - $self->optionSetTest($oOption, OPTION_DB_PATH, $oHostDbMaster->dbBasePath()); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $oHostBackup->repoPath()); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, $oHostDbMaster->dbBasePath()); + $self->optionTestSet(CFGOPT_REPO_PATH, $oHostBackup->repoPath()); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); # Set S3 options if (defined($oHostS3)) { - $self->optionSetTest($oOption, OPTION_REPO_TYPE, REPO_TYPE_S3); - $self->optionSetTest($oOption, OPTION_REPO_S3_KEY, HOST_S3_ACCESS_KEY); - $self->optionSetTest($oOption, OPTION_REPO_S3_KEY_SECRET, HOST_S3_ACCESS_SECRET_KEY); - $self->optionSetTest($oOption, OPTION_REPO_S3_BUCKET, HOST_S3_BUCKET); - $self->optionSetTest($oOption, OPTION_REPO_S3_ENDPOINT, HOST_S3_ENDPOINT); - $self->optionSetTest($oOption, OPTION_REPO_S3_REGION, HOST_S3_REGION); - $self->optionSetTest($oOption, OPTION_REPO_S3_HOST, $oHostS3->ipGet()); - $self->optionBoolSetTest($oOption, OPTION_REPO_S3_VERIFY_SSL, false); + $self->optionTestSet(CFGOPT_REPO_TYPE, CFGOPTVAL_REPO_TYPE_S3); + $self->optionTestSet(CFGOPT_REPO_S3_KEY, HOST_S3_ACCESS_KEY); + $self->optionTestSet(CFGOPT_REPO_S3_KEY_SECRET, HOST_S3_ACCESS_SECRET_KEY); + $self->optionTestSet(CFGOPT_REPO_S3_BUCKET, HOST_S3_BUCKET); + $self->optionTestSet(CFGOPT_REPO_S3_ENDPOINT, HOST_S3_ENDPOINT); + $self->optionTestSet(CFGOPT_REPO_S3_REGION, HOST_S3_REGION); + $self->optionTestSet(CFGOPT_REPO_S3_HOST, $oHostS3->ipGet()); + $self->optionTestSetBool(CFGOPT_REPO_S3_VERIFY_SSL, false); } - $self->testResult(sub {$self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH)}, '', 'config load'); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); return $oHostDbMaster, $oHostDbStandby, $oHostBackup, $oHostS3; } diff --git a/test/lib/pgBackRestTest/Module/Archive/ArchiveCommonTest.pm b/test/lib/pgBackRestTest/Module/Archive/ArchiveCommonTest.pm index df84130a1..a536e5822 100644 --- a/test/lib/pgBackRestTest/Module/Archive/ArchiveCommonTest.pm +++ b/test/lib/pgBackRestTest/Module/Archive/ArchiveCommonTest.pm @@ -38,23 +38,24 @@ sub run #--------------------------------------------------------------------------------------------------------------------------- $self->testException( - sub {walPath($strWalFileRelative, undef, CMD_ARCHIVE_GET)}, ERROR_OPTION_REQUIRED, - "option '" . OPTION_DB_PATH . "' must be specified when relative xlog paths are used\n" . - "HINT: Is \%f passed to " . CMD_ARCHIVE_GET . " instead of \%p?\n" . + sub {walPath($strWalFileRelative, undef, cfgCommandName(CFGCMD_ARCHIVE_GET))}, ERROR_OPTION_REQUIRED, + "option 'db-path' must be specified when relative xlog paths are used\n" . + "HINT: Is \%f passed to " . cfgCommandName(CFGCMD_ARCHIVE_GET) . " instead of \%p?\n" . "HINT: PostgreSQL may pass relative paths even with \%p depending on the environment."); #--------------------------------------------------------------------------------------------------------------------------- $self->testResult( - sub {walPath($strWalFileRelative, $strDbPath, CMD_ARCHIVE_PUSH)}, $strWalFileAbsolute, 'relative path is contructed'); + sub {walPath($strWalFileRelative, $strDbPath, cfgCommandName(CFGCMD_ARCHIVE_PUSH))}, $strWalFileAbsolute, + 'relative path is contructed'); #--------------------------------------------------------------------------------------------------------------------------- $self->testResult( - sub {walPath($strWalFileAbsolute, $strDbPath, CMD_ARCHIVE_PUSH)}, $strWalFileAbsolute, + sub {walPath($strWalFileAbsolute, $strDbPath, cfgCommandName(CFGCMD_ARCHIVE_PUSH))}, $strWalFileAbsolute, 'path is not relative and db-path is still specified'); #--------------------------------------------------------------------------------------------------------------------------- $self->testResult( - sub {walPath($strWalFileAbsolute, $strDbPath, CMD_ARCHIVE_PUSH)}, $strWalFileAbsolute, + sub {walPath($strWalFileAbsolute, $strDbPath, cfgCommandName(CFGCMD_ARCHIVE_PUSH))}, $strWalFileAbsolute, 'path is not relative and db-path is undef'); } @@ -94,10 +95,9 @@ sub run ################################################################################################################################ if ($self->begin("${strModule}::walSegmentFind()")) { - my $oOption = {}; - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $self->testPath()); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_REPO_PATH, $self->testPath()); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); my $strArchiveId = '9.4-1'; my $strArchivePath = storageRepo()->pathGet(STORAGE_REPO_ARCHIVE . "/${strArchiveId}"); diff --git a/test/lib/pgBackRestTest/Module/Archive/ArchivePushTest.pm b/test/lib/pgBackRestTest/Module/Archive/ArchivePushTest.pm index 7b694b03b..e8d82194d 100644 --- a/test/lib/pgBackRestTest/Module/Archive/ArchivePushTest.pm +++ b/test/lib/pgBackRestTest/Module/Archive/ArchivePushTest.pm @@ -62,8 +62,9 @@ sub initTest # Create archive info storageTest()->pathCreate($self->{strArchivePath}, {bIgnoreExists => true, bCreateParent => true}); - my $oOption = $self->initOption(); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->initOption(); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); + my $oArchiveInfo = new pgBackRest::Archive::Info($self->{strArchivePath}, false, {bIgnoreMissing => true}); $oArchiveInfo->create(PG_VERSION_94, WAL_VERSION_94_SYS_ID, true); @@ -77,19 +78,15 @@ sub initOption { my $self = shift; - my $oOption = {}; + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, $self->{strDbPath}); + $self->optionTestSet(CFGOPT_REPO_PATH, $self->{strRepoPath}); + $self->optionTestSet(CFGOPT_LOG_PATH, $self->testPath()); + $self->optionTestSetBool(CFGOPT_COMPRESS, false); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, $self->{strDbPath}); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $self->{strRepoPath}); - $self->optionSetTest($oOption, OPTION_LOG_PATH, $self->testPath()); - $self->optionBoolSetTest($oOption, OPTION_COMPRESS, false); - - $self->optionSetTest($oOption, OPTION_DB_TIMEOUT, 5); - $self->optionSetTest($oOption, OPTION_PROTOCOL_TIMEOUT, 6); - $self->optionSetTest($oOption, OPTION_ARCHIVE_TIMEOUT, 3); - - return $oOption; + $self->optionTestSet(CFGOPT_DB_TIMEOUT, 5); + $self->optionTestSet(CFGOPT_PROTOCOL_TIMEOUT, 6); + $self->optionTestSet(CFGOPT_ARCHIVE_TIMEOUT, 3); } #################################################################################################################################### @@ -99,12 +96,10 @@ sub run { my $self = shift; - my $oOption = $self->initOption(); - ################################################################################################################################ if ($self->begin("ArchivePushFile::archivePushCheck")) { - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); #--------------------------------------------------------------------------------------------------------------------------- my $strWalSegment = '000000010000000100000001'; @@ -188,11 +183,11 @@ sub run my $iWalMajor = 1; my $iWalMinor = 1; - $self->optionSetTest($oOption, OPTION_BACKUP_HOST, 'localhost'); - $self->optionSetTest($oOption, OPTION_BACKUP_USER, $self->pgUser()); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_BACKUP_HOST, 'localhost'); + $self->optionTestSet(CFGOPT_BACKUP_USER, $self->pgUser()); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); - protocolGet(BACKUP, undef, {strBackRestBin => $self->backrestExe()}); + protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP, undef, {strBackRestBin => $self->backrestExe()}); # Generate a normal segment my $strSegment = $self->walSegment($iWalTimeline, $iWalMajor, $iWalMinor++); @@ -211,18 +206,18 @@ sub run # Destroy protocol object protocolDestroy(); - $self->optionReset($oOption, OPTION_BACKUP_HOST); - $self->optionReset($oOption, OPTION_BACKUP_USER); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestClear(CFGOPT_BACKUP_HOST); + $self->optionTestClear(CFGOPT_BACKUP_USER); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); } ################################################################################################################################ if ($self->begin("ArchivePush->readyList()")) { my $oPushAsync = new pgBackRest::Archive::Push::Async($self->{strWalPath}, $self->{strSpoolPath}); - $self->optionBoolSetTest($oOption, OPTION_ARCHIVE_ASYNC, true); - $self->optionSetTest($oOption, OPTION_SPOOL_PATH, $self->{strRepoPath}); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSetBool(CFGOPT_ARCHIVE_ASYNC, true); + $self->optionTestSet(CFGOPT_SPOOL_PATH, $self->{strRepoPath}); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $oPushAsync->initServer(); my $iWalTimeline = 1; @@ -298,8 +293,8 @@ sub run if ($self->begin("ArchivePush->dropList()")) { my $oPushAsync = new pgBackRest::Archive::Push::Async($self->{strWalPath}, $self->{strSpoolPath}); - $self->optionSetTest($oOption, OPTION_ARCHIVE_QUEUE_MAX, PG_WAL_SIZE * 4); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_ARCHIVE_QUEUE_MAX, PG_WAL_SIZE * 4); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); my $iWalTimeline = 1; my $iWalMajor = 1; @@ -315,16 +310,16 @@ sub run 'WAL files not dropped'); #--------------------------------------------------------------------------------------------------------------------------- - $self->optionSetTest($oOption, OPTION_ARCHIVE_QUEUE_MAX, PG_WAL_SIZE * 2); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_ARCHIVE_QUEUE_MAX, PG_WAL_SIZE * 2); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $self->testResult( sub {$oPushAsync->dropList($oPushAsync->readyList())}, '(000000010000000100000001, 000000010000000100000002, 000000010000000100000003)', 'WAL files that exceed queue max'); # Reset queue max - $self->optionReset($oOption, OPTION_ARCHIVE_QUEUE_MAX); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestClear(CFGOPT_ARCHIVE_QUEUE_MAX); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); } ################################################################################################################################ @@ -333,7 +328,7 @@ sub run my $oPush = new pgBackRest::Archive::Push::Push(); my $oPushAsync = new pgBackRest::Archive::Push::Async($self->{strWalPath}, $self->{strSpoolPath}); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $oPushAsync->initServer(); my $iWalTimeline = 1; @@ -436,9 +431,9 @@ sub run my $oPushAsync = new pgBackRest::Archive::Push::Async( $self->{strWalPath}, $self->{strSpoolPath}, $self->backrestExe()); - $self->optionBoolSetTest($oOption, OPTION_ARCHIVE_ASYNC, true); - $self->optionSetTest($oOption, OPTION_SPOOL_PATH, $self->{strRepoPath}); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSetBool(CFGOPT_ARCHIVE_ASYNC, true); + $self->optionTestSet(CFGOPT_SPOOL_PATH, $self->{strRepoPath}); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $oPushAsync->initServer(); @@ -498,8 +493,8 @@ sub run #--------------------------------------------------------------------------------------------------------------------------- # Enable compression - $self->optionBoolSetTest($oOption, OPTION_COMPRESS, true); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSetBool(CFGOPT_COMPRESS, true); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); # Create history file my $strHistoryFile = "00000001.history"; @@ -575,12 +570,12 @@ sub run $self->walRemove($self->{strWalPath}, $strSegment); # Disable compression - $self->optionBoolSetTest($oOption, OPTION_COMPRESS, false); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSetBool(CFGOPT_COMPRESS, false); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); #--------------------------------------------------------------------------------------------------------------------------- - $self->optionSetTest($oOption, OPTION_ARCHIVE_QUEUE_MAX, PG_WAL_SIZE * 2); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_ARCHIVE_QUEUE_MAX, PG_WAL_SIZE * 2); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); # Generate WAL to test queue limits my @strySegment = @@ -607,15 +602,15 @@ sub run $self->testResult( sub {${storageSpool()->get("$self->{strSpoolPath}/${strSegment}.ok")}}, $strSegment eq $strySegment[0] ? undef : - "0\ndropped WAL file ${strSegment} because archive queue exceeded " . optionGet(OPTION_ARCHIVE_QUEUE_MAX) . + "0\ndropped WAL file ${strSegment} because archive queue exceeded " . cfgOption(CFGOPT_ARCHIVE_QUEUE_MAX) . ' bytes', "verify ${strSegment} status"); $self->walRemove($self->{strWalPath}, $strSegment); } - $self->optionReset($oOption, OPTION_ARCHIVE_QUEUE_MAX); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestClear(CFGOPT_ARCHIVE_QUEUE_MAX); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); #--------------------------------------------------------------------------------------------------------------------------- $self->testResult(sub {$oPushAsync->processQueue()}, '(0, 0, 0, 0)', "final process to remove ok files"); @@ -628,9 +623,9 @@ sub run { my $oPush = new pgBackRest::Archive::Push::Push($self->backrestExe()); - $self->optionReset($oOption, OPTION_ARCHIVE_ASYNC); - $self->optionReset($oOption, OPTION_SPOOL_PATH); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestClear(CFGOPT_ARCHIVE_ASYNC); + $self->optionTestClear(CFGOPT_SPOOL_PATH); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); my $iWalTimeline = 1; my $iWalMajor = 1; @@ -640,15 +635,15 @@ sub run #--------------------------------------------------------------------------------------------------------------------------- # Set db-host to trick archive-push into thinking it is running on the backup server - $self->optionSetTest($oOption, OPTION_DB_HOST, BOGUS); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_DB_HOST, BOGUS); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $self->testException(sub {$oPush->process(undef)}, ERROR_HOST_INVALID, 'archive-push operation must run on db host'); #--------------------------------------------------------------------------------------------------------------------------- # Reset db-host - $self->optionReset($oOption, OPTION_DB_HOST); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestClear(CFGOPT_DB_HOST); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $self->testException(sub {$oPush->process(undef)}, ERROR_PARAM_REQUIRED, 'WAL file to push required'); @@ -666,8 +661,8 @@ sub run #--------------------------------------------------------------------------------------------------------------------------- # Set unrealistic queue max to make synchronous push drop a WAL - $self->optionSetTest($oOption, OPTION_ARCHIVE_QUEUE_MAX, 0); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_ARCHIVE_QUEUE_MAX, 0); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $strSegment = $self->walSegment($iWalTimeline, $iWalMajor, $iWalMinor++); $self->walGenerate($self->{strWalPath}, WAL_VERSION_94, 1, $strSegment); @@ -678,8 +673,8 @@ sub run "${strSegment} WAL in archive"); # Set more realistic queue max and allow segment to push - $self->optionSetTest($oOption, OPTION_ARCHIVE_QUEUE_MAX, PG_WAL_SIZE * 4); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_ARCHIVE_QUEUE_MAX, PG_WAL_SIZE * 4); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $self->testResult(sub {$oPush->process("$self->{strWalPath}/${strSegment}")}, 0, "${strSegment} WAL pushed"); $self->testResult( @@ -689,14 +684,14 @@ sub run $self->walRemove($self->{strWalPath}, $strSegment); # Reset queue max - $self->optionReset($oOption, OPTION_ARCHIVE_QUEUE_MAX); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestClear(CFGOPT_ARCHIVE_QUEUE_MAX); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); #--------------------------------------------------------------------------------------------------------------------------- # Enable async archiving - $self->optionBoolSetTest($oOption, OPTION_ARCHIVE_ASYNC, true); - $self->optionSetTest($oOption, OPTION_SPOOL_PATH, $self->{strRepoPath}); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSetBool(CFGOPT_ARCHIVE_ASYNC, true); + $self->optionTestSet(CFGOPT_SPOOL_PATH, $self->{strRepoPath}); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); # Write an error file and verify that it doesn't error the first time around $strSegment = $self->walSegment($iWalTimeline, $iWalMajor, $iWalMinor++); @@ -742,8 +737,8 @@ sub run #--------------------------------------------------------------------------------------------------------------------------- $strSegment = $self->walSegment($iWalTimeline, $iWalMajor, $iWalMinor++); - $self->optionSetTest($oOption, OPTION_ARCHIVE_TIMEOUT, 1); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_ARCHIVE_TIMEOUT, 1); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $self->testException( sub {$oPush->process("$self->{strWalPath}/${strSegment}")}, ERROR_ARCHIVE_TIMEOUT, @@ -754,10 +749,10 @@ sub run $strSegment = $self->walSegment($iWalTimeline, $iWalMajor, $iWalMinor++); $self->walGenerate($self->{strWalPath}, WAL_VERSION_94, 1, $strSegment); - $self->optionSetTest($oOption, OPTION_BACKUP_HOST, BOGUS); - $self->optionSetTest($oOption, OPTION_PROTOCOL_TIMEOUT, 60); - $self->optionSetTest($oOption, OPTION_ARCHIVE_TIMEOUT, 5); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_BACKUP_HOST, BOGUS); + $self->optionTestSet(CFGOPT_PROTOCOL_TIMEOUT, 60); + $self->optionTestSet(CFGOPT_ARCHIVE_TIMEOUT, 5); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $self->testException( sub {$oPush->process("$self->{strWalPath}/${strSegment}")}, ERROR_FILE_READ, @@ -765,9 +760,9 @@ sub run exit if ($iProcessId != $PID); # Disable async archiving - $self->optionReset($oOption, OPTION_ARCHIVE_ASYNC); - $self->optionReset($oOption, OPTION_SPOOL_PATH); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestClear(CFGOPT_ARCHIVE_ASYNC); + $self->optionTestClear(CFGOPT_SPOOL_PATH); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); } } diff --git a/test/lib/pgBackRestTest/Module/Archive/ArchiveStopTest.pm b/test/lib/pgBackRestTest/Module/Archive/ArchiveStopTest.pm index c822474f3..2641be344 100644 --- a/test/lib/pgBackRestTest/Module/Archive/ArchiveStopTest.pm +++ b/test/lib/pgBackRestTest/Module/Archive/ArchiveStopTest.pm @@ -69,7 +69,7 @@ sub run $oHostDbMaster->dbBasePath() . '/' . DB_FILE_PGCONTROL); # Create the archive info file - $oHostBackup->stanzaCreate('create required data for stanza', {strOptionalParam => '--no-' . OPTION_ONLINE}); + $oHostBackup->stanzaCreate('create required data for stanza', {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Push a WAL segment $oHostDbMaster->archivePush($strXlogPath, $strArchiveTestFile, 1); diff --git a/test/lib/pgBackRestTest/Module/Backup/BackupInfoUnitTest.pm b/test/lib/pgBackRestTest/Module/Backup/BackupInfoUnitTest.pm index 84a077a70..7dd351dfc 100644 --- a/test/lib/pgBackRestTest/Module/Backup/BackupInfoUnitTest.pm +++ b/test/lib/pgBackRestTest/Module/Backup/BackupInfoUnitTest.pm @@ -2,7 +2,7 @@ # BackupInfoUnitTest.pm - Unit tests for BackupInfo #################################################################################################################################### package pgBackRestTest::Module::Backup::BackupInfoUnitTest; -use parent 'pgBackRestTest::Env::HostEnvTest'; +use parent 'pgBackRestTest::Env::ConfigEnvTest'; #################################################################################################################################### # Perl includes @@ -28,7 +28,6 @@ use pgBackRest::Protocol::Storage::Helper; use pgBackRestTest::Env::HostEnvTest; use pgBackRestTest::Common::ExecuteTest; -use pgBackRestTest::Env::Host::HostBackupTest; use pgBackRestTest::Common::RunTest; #################################################################################################################################### @@ -49,10 +48,10 @@ sub initTest my $self = shift; # Load options - my $oOption = {}; - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $self->testPath() . '/repo'); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->configTestClear(); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_REPO_PATH, $self->testPath() . '/repo'); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); # Create the local file object $self->{oStorage} = storageRepo(); diff --git a/test/lib/pgBackRestTest/Module/Backup/BackupUnitTest.pm b/test/lib/pgBackRestTest/Module/Backup/BackupUnitTest.pm index 07e083009..c5eba1b35 100644 --- a/test/lib/pgBackRestTest/Module/Backup/BackupUnitTest.pm +++ b/test/lib/pgBackRestTest/Module/Backup/BackupUnitTest.pm @@ -89,26 +89,28 @@ sub run if ($self->begin('backupLabelFormat()')) { my $strBackupLabelFull = timestampFileFormat(undef, 1482000000) . 'F'; - $self->testResult(sub {backupLabelFormat(BACKUP_TYPE_FULL, undef, 1482000000)}, $strBackupLabelFull, 'full backup label'); + $self->testResult(sub {backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_FULL, undef, 1482000000)}, $strBackupLabelFull, + 'full backup label'); #--------------------------------------------------------------------------------------------------------------------------- $self->testException( - sub {backupLabelFormat(BACKUP_TYPE_FULL, $strBackupLabelFull, 1482000000)}, + sub {backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_FULL, $strBackupLabelFull, 1482000000)}, ERROR_ASSERT, "strBackupLabelLast must not be defined when strType = 'full'"); #--------------------------------------------------------------------------------------------------------------------------- my $strBackupLabelDiff = "${strBackupLabelFull}_" . timestampFileFormat(undef, 1482000400) . 'D'; $self->testResult( - sub {backupLabelFormat(BACKUP_TYPE_DIFF, $strBackupLabelFull, 1482000400)}, $strBackupLabelDiff, 'diff backup label'); + sub {backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_DIFF, $strBackupLabelFull, 1482000400)}, $strBackupLabelDiff, + 'diff backup label'); #--------------------------------------------------------------------------------------------------------------------------- $self->testException( - sub {backupLabelFormat(BACKUP_TYPE_DIFF, undef, 1482000400)}, + sub {backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_DIFF, undef, 1482000400)}, ERROR_ASSERT, "strBackupLabelLast must be defined when strType = 'diff'"); #--------------------------------------------------------------------------------------------------------------------------- $self->testResult( - sub {backupLabelFormat(BACKUP_TYPE_INCR, $strBackupLabelDiff, 1482000800)}, + sub {backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_INCR, $strBackupLabelDiff, 1482000800)}, "${strBackupLabelFull}_" . timestampFileFormat(undef, 1482000800) . 'I', 'incremental backup label'); } @@ -116,18 +118,17 @@ sub run ################################################################################################################################ if ($self->begin('backupLabel()')) { - my $oOption = {}; - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $self->testPath() . '/repo'); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_REPO_PATH, $self->testPath() . '/repo'); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); #--------------------------------------------------------------------------------------------------------------------------- my $lTime = time(); - my $strFullLabel = backupLabelFormat(BACKUP_TYPE_FULL, undef, $lTime); + my $strFullLabel = backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_FULL, undef, $lTime); storageRepo()->pathCreate(STORAGE_REPO_BACKUP . "/${strFullLabel}", {bCreateParent => true}); - my $strNewFullLabel = backupLabel(storageRepo(), BACKUP_TYPE_FULL, undef, $lTime); + my $strNewFullLabel = backupLabel(storageRepo(), CFGOPTVAL_BACKUP_TYPE_FULL, undef, $lTime); $self->testResult(sub {$strFullLabel ne $strNewFullLabel}, true, 'new full label <> existing full backup dir'); @@ -140,26 +141,26 @@ sub run STORAGE_REPO_BACKUP . qw{/} . PATH_BACKUP_HISTORY . '/' . timestampFormat('%4d', $lTime) . "/${strFullLabel}.manifest." . COMPRESS_EXT); - $strNewFullLabel = backupLabel(storageRepo(), BACKUP_TYPE_FULL, undef, $lTime); + $strNewFullLabel = backupLabel(storageRepo(), CFGOPTVAL_BACKUP_TYPE_FULL, undef, $lTime); $self->testResult(sub {$strFullLabel ne $strNewFullLabel}, true, 'new full label <> existing full history file'); #--------------------------------------------------------------------------------------------------------------------------- $lTime = time() + 1000; - $strFullLabel = backupLabelFormat(BACKUP_TYPE_FULL, undef, $lTime); + $strFullLabel = backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_FULL, undef, $lTime); - $strNewFullLabel = backupLabel(storageRepo(), BACKUP_TYPE_FULL, undef, $lTime); + $strNewFullLabel = backupLabel(storageRepo(), CFGOPTVAL_BACKUP_TYPE_FULL, undef, $lTime); $self->testResult(sub {$strFullLabel eq $strNewFullLabel}, true, 'new full label in future'); #--------------------------------------------------------------------------------------------------------------------------- $lTime = time(); - $strFullLabel = backupLabelFormat(BACKUP_TYPE_FULL, undef, $lTime); - my $strDiffLabel = backupLabelFormat(BACKUP_TYPE_DIFF, $strFullLabel, $lTime); + $strFullLabel = backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_FULL, undef, $lTime); + my $strDiffLabel = backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_DIFF, $strFullLabel, $lTime); storageRepo()->pathCreate(STORAGE_REPO_BACKUP . "/${strDiffLabel}", {bCreateParent => true}); - my $strNewDiffLabel = backupLabel(storageRepo(), BACKUP_TYPE_DIFF, $strFullLabel, $lTime); + my $strNewDiffLabel = backupLabel(storageRepo(), CFGOPTVAL_BACKUP_TYPE_DIFF, $strFullLabel, $lTime); $self->testResult(sub {$strDiffLabel ne $strNewDiffLabel}, true, 'new diff label <> existing diff backup dir'); @@ -173,15 +174,15 @@ sub run STORAGE_REPO_BACKUP . qw{/} . PATH_BACKUP_HISTORY . '/' . timestampFormat('%4d', $lTime) . "/${strDiffLabel}.manifest." . COMPRESS_EXT); - $strNewDiffLabel = backupLabel(storageRepo(), BACKUP_TYPE_DIFF, $strFullLabel, $lTime); + $strNewDiffLabel = backupLabel(storageRepo(), CFGOPTVAL_BACKUP_TYPE_DIFF, $strFullLabel, $lTime); $self->testResult(sub {$strDiffLabel ne $strNewDiffLabel}, true, 'new full label <> existing diff history file'); #--------------------------------------------------------------------------------------------------------------------------- $lTime = time() + 1000; - $strDiffLabel = backupLabelFormat(BACKUP_TYPE_DIFF, $strFullLabel, $lTime); + $strDiffLabel = backupLabelFormat(CFGOPTVAL_BACKUP_TYPE_DIFF, $strFullLabel, $lTime); - $strNewDiffLabel = backupLabel(storageRepo(), BACKUP_TYPE_DIFF, $strFullLabel, $lTime); + $strNewDiffLabel = backupLabel(storageRepo(), CFGOPTVAL_BACKUP_TYPE_DIFF, $strFullLabel, $lTime); $self->testResult(sub {$strDiffLabel eq $strNewDiffLabel}, true, 'new diff label in future'); } diff --git a/test/lib/pgBackRestTest/Module/Config/ConfigConfigTest.pm b/test/lib/pgBackRestTest/Module/Config/ConfigConfigTest.pm index e033f1af4..f8af47b3c 100644 --- a/test/lib/pgBackRestTest/Module/Config/ConfigConfigTest.pm +++ b/test/lib/pgBackRestTest/Module/Config/ConfigConfigTest.pm @@ -25,328 +25,331 @@ sub run { my $self = shift; - my $oOption = {}; my $oConfig = {}; my $strConfigFile = $self->testPath() . '/pgbackrest.conf'; - if ($self->begin('set and negate option ' . OPTION_CONFIG)) + if ($self->begin('set and negate option ' . cfgOptionName(CFGOPT_CONFIG))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, '/dude/dude.conf'); - $self->optionBoolSetTest($oOption, OPTION_CONFIG, false); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, '/dude/dude.conf'); + $self->optionTestSetBool(CFGOPT_CONFIG, false); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_NEGATE, OPTION_CONFIG); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_NEGATE, cfgOptionName(CFGOPT_CONFIG)); } - if ($self->begin('option ' . OPTION_CONFIG)) + if ($self->begin('option ' . cfgOptionName(CFGOPT_CONFIG))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionBoolSetTest($oOption, OPTION_CONFIG, false); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSetBool(CFGOPT_CONFIG, false); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_CONFIG); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_CONFIG); } - if ($self->begin('default option ' . OPTION_CONFIG)) + if ($self->begin('default option ' . cfgOptionName(CFGOPT_CONFIG))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_CONFIG, OPTION_DEFAULT_CONFIG); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_CONFIG, cfgRuleOptionDefault(CFGCMD_BACKUP, CFGOPT_CONFIG)); } if ($self->begin('config file is a path')) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $self->testPath()); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $self->testPath()); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_FILE_INVALID, $self->testPath()); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP), ERROR_FILE_INVALID, $self->testPath()); } - if ($self->begin('load from config stanza command section - option ' . OPTION_PROCESS_MAX)) + if ($self->begin('load from config stanza command section - option ' . cfgOptionName(CFGOPT_PROCESS_MAX))) { $oConfig = {}; - $$oConfig{$self->stanza() . ':' . &CMD_BACKUP}{&OPTION_PROCESS_MAX} = 2; + $$oConfig{$self->stanza() . ':' . cfgCommandName(CFGCMD_BACKUP)}{cfgOptionName(CFGOPT_PROCESS_MAX)} = 2; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_PROCESS_MAX, 2); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_PROCESS_MAX, 2); } - if ($self->begin('load from config stanza section - option ' . OPTION_PROCESS_MAX)) + if ($self->begin('load from config stanza section - option ' . cfgOptionName(CFGOPT_PROCESS_MAX))) { $oConfig = {}; - $$oConfig{$self->stanza()}{&OPTION_PROCESS_MAX} = 3; + $$oConfig{$self->stanza()}{cfgOptionName(CFGOPT_PROCESS_MAX)} = 3; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_PROCESS_MAX, 3); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_PROCESS_MAX, 3); } if ($self->begin('load from config global command section - option thread-max')) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_BACKUP}{'thread-max'} = 2; + $$oConfig{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_BACKUP)}{'thread-max'} = 2; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_PROCESS_MAX, 2); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_PROCESS_MAX, 2); } - if ($self->begin('load from config global section - option ' . OPTION_PROCESS_MAX)) + if ($self->begin('load from config global section - option ' . cfgOptionName(CFGOPT_PROCESS_MAX))) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_PROCESS_MAX} = 5; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_PROCESS_MAX)} = 5; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_PROCESS_MAX, 5); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_PROCESS_MAX, 5); } - if ($self->begin('default - option ' . OPTION_PROCESS_MAX)) + if ($self->begin('default - option ' . cfgOptionName(CFGOPT_PROCESS_MAX))) { $oConfig = {}; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_PROCESS_MAX, 1); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_PROCESS_MAX, 1); } - if ($self->begin('command-line override - option ' . OPTION_PROCESS_MAX)) + if ($self->begin('command-line override - option ' . cfgOptionName(CFGOPT_PROCESS_MAX))) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_PROCESS_MAX} = 9; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_PROCESS_MAX)} = 9; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_PROCESS_MAX, 7); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_PROCESS_MAX, 7); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_PROCESS_MAX, 7); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_PROCESS_MAX, 7); } - if ($self->begin('invalid boolean - option ' . OPTION_HARDLINK)) + if ($self->begin('invalid boolean - option ' . cfgOptionName(CFGOPT_HARDLINK))) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_BACKUP}{&OPTION_HARDLINK} = 'Y'; + $$oConfig{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_BACKUP)}{cfgOptionName(CFGOPT_HARDLINK)} = 'Y'; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_INVALID_VALUE, 'Y', OPTION_HARDLINK); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_INVALID_VALUE, 'Y', cfgOptionName(CFGOPT_HARDLINK)); } - if ($self->begin('invalid value - option ' . OPTION_LOG_LEVEL_CONSOLE)) + if ($self->begin('invalid value - option ' . cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE))) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_LEVEL_CONSOLE} = BOGUS; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE)} = BOGUS; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_INVALID_VALUE, BOGUS, OPTION_LOG_LEVEL_CONSOLE); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_INVALID_VALUE, BOGUS, cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE)); } - if ($self->begin('valid value - option ' . OPTION_LOG_LEVEL_CONSOLE)) + if ($self->begin('valid value - option ' . cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE))) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_LEVEL_CONSOLE} = lc(INFO); + $$oConfig{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE)} = lc(INFO); storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_RESTORE); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_RESTORE)); } - if ($self->begin('archive-push - option ' . OPTION_LOG_LEVEL_CONSOLE)) + if ($self->begin('archive-push - option ' . cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_ARCHIVE_PUSH); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_ARCHIVE_PUSH)); } - if ($self->begin(CMD_EXPIRE . ' ' . OPTION_RETENTION_FULL)) + if ($self->begin(cfgCommandName(CFGCMD_EXPIRE) . ' ' . cfgOptionName(CFGOPT_RETENTION_FULL))) { $oConfig = {}; - $$oConfig{$self->stanza() . ':' . &CMD_EXPIRE}{&OPTION_RETENTION_FULL} = 2; + $$oConfig{$self->stanza() . ':' . cfgCommandName(CFGCMD_EXPIRE)}{cfgOptionName(CFGOPT_RETENTION_FULL)} = 2; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_EXPIRE); - $self->optionTestExpect(OPTION_RETENTION_FULL, 2); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_EXPIRE)); + $self->optionTestExpect(CFGOPT_RETENTION_FULL, 2); } - if ($self->begin(CMD_BACKUP . ' option ' . OPTION_COMPRESS)) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' option ' . cfgOptionName(CFGOPT_COMPRESS))) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_BACKUP}{&OPTION_COMPRESS} = 'n'; + $$oConfig{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_BACKUP)}{cfgOptionName(CFGOPT_COMPRESS)} = 'n'; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_COMPRESS, false); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_COMPRESS, false); } - if ($self->begin(CMD_RESTORE . ' global option ' . OPTION_RESTORE_RECOVERY_OPTION . ' error')) + if ($self->begin(cfgCommandName(CFGCMD_RESTORE) . ' global option ' . cfgOptionName(CFGOPT_RECOVERY_OPTION) . ' error')) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_RESTORE}{&OPTION_RESTORE_RECOVERY_OPTION} = 'bogus='; + $$oConfig{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_RESTORE)}{cfgOptionName(CFGOPT_RECOVERY_OPTION)} = 'bogus='; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_RESTORE, ERROR_OPTION_INVALID_VALUE, 'bogus=', OPTION_RESTORE_RECOVERY_OPTION); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_RESTORE), ERROR_OPTION_INVALID_VALUE, 'bogus=', cfgOptionName(CFGOPT_RECOVERY_OPTION)); } - if ($self->begin(CMD_RESTORE . ' global option ' . OPTION_RESTORE_RECOVERY_OPTION . ' error')) + if ($self->begin(cfgCommandName(CFGCMD_RESTORE) . ' global option ' . cfgOptionName(CFGOPT_RECOVERY_OPTION) . ' error')) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_RESTORE}{&OPTION_RESTORE_RECOVERY_OPTION} = '=bogus'; + $$oConfig{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_RESTORE)}{cfgOptionName(CFGOPT_RECOVERY_OPTION)} = '=bogus'; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_RESTORE, ERROR_OPTION_INVALID_VALUE, '=bogus', OPTION_RESTORE_RECOVERY_OPTION); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_RESTORE), ERROR_OPTION_INVALID_VALUE, '=bogus', cfgOptionName(CFGOPT_RECOVERY_OPTION)); } - if ($self->begin(CMD_RESTORE . ' global option ' . OPTION_RESTORE_RECOVERY_OPTION)) + if ($self->begin(cfgCommandName(CFGCMD_RESTORE) . ' global option ' . cfgOptionName(CFGOPT_RECOVERY_OPTION))) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_RESTORE}{&OPTION_RESTORE_RECOVERY_OPTION} = + $$oConfig{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_RESTORE)}{cfgOptionName(CFGOPT_RECOVERY_OPTION)} = 'archive-command=/path/to/pgbackrest'; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_RESTORE); - $self->optionTestExpect(OPTION_RESTORE_RECOVERY_OPTION, '/path/to/pgbackrest', 'archive-command'); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_RESTORE)); + $self->optionTestExpect(CFGOPT_RECOVERY_OPTION, '/path/to/pgbackrest', 'archive-command'); } - if ($self->begin(CMD_RESTORE . ' stanza option ' . OPTION_RESTORE_RECOVERY_OPTION)) + if ($self->begin(cfgCommandName(CFGCMD_RESTORE) . ' stanza option ' . cfgOptionName(CFGOPT_RECOVERY_OPTION))) { $oConfig = {}; - $$oConfig{$self->stanza()}{&OPTION_RESTORE_RECOVERY_OPTION} = ['standby-mode=on', 'a=b']; + $$oConfig{$self->stanza()}{cfgOptionName(CFGOPT_RECOVERY_OPTION)} = ['standby-mode=on', 'a=b']; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_RESTORE); - $self->optionTestExpect(OPTION_RESTORE_RECOVERY_OPTION, 'b', 'a'); - $self->optionTestExpect(OPTION_RESTORE_RECOVERY_OPTION, 'on', 'standby-mode'); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_RESTORE)); + $self->optionTestExpect(CFGOPT_RECOVERY_OPTION, 'b', 'a'); + $self->optionTestExpect(CFGOPT_RECOVERY_OPTION, 'on', 'standby-mode'); } - if ($self->begin(CMD_BACKUP . ' option ' . OPTION_DB_PATH)) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' option ' . cfgOptionName(CFGOPT_DB_PATH))) { $oConfig = {}; - $$oConfig{$self->stanza()}{&OPTION_DB_PATH} = '/path/to/db'; + $$oConfig{$self->stanza()}{cfgOptionName(CFGOPT_DB_PATH)} = '/path/to/db'; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_DB_PATH, '/path/to/db'); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_DB_PATH, '/path/to/db'); } - if ($self->begin(CMD_BACKUP . ' option ' . OPTION_BACKUP_ARCHIVE_CHECK)) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' option ' . cfgOptionName(CFGOPT_ARCHIVE_CHECK))) { $oConfig = {}; - $$oConfig{$self->stanza()}{&OPTION_DB_PATH} = '/path/to/db'; + $$oConfig{$self->stanza()}{cfgOptionName(CFGOPT_DB_PATH)} = '/path/to/db'; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); - $self->optionBoolSetTest($oOption, OPTION_BACKUP_ARCHIVE_CHECK, false); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); + $self->optionTestSetBool(CFGOPT_ARCHIVE_CHECK, false); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_ONLINE, true); - $self->optionTestExpect(OPTION_BACKUP_ARCHIVE_CHECK, false); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_ONLINE, true); + $self->optionTestExpect(CFGOPT_ARCHIVE_CHECK, false); } - if ($self->begin(CMD_ARCHIVE_PUSH . ' option ' . OPTION_DB_PATH)) + if ($self->begin(cfgCommandName(CFGCMD_ARCHIVE_PUSH) . ' option ' . cfgOptionName(CFGOPT_DB_PATH))) { $oConfig = {}; - $$oConfig{$self->stanza()}{&OPTION_DB_PATH} = '/path/to/db'; + $$oConfig{$self->stanza()}{cfgOptionName(CFGOPT_DB_PATH)} = '/path/to/db'; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_ARCHIVE_PUSH); - $self->optionTestExpect(OPTION_DB_PATH, '/path/to/db'); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_ARCHIVE_PUSH)); + $self->optionTestExpect(CFGOPT_DB_PATH, '/path/to/db'); } - if ($self->begin(CMD_BACKUP . ' option ' . OPTION_REPO_PATH)) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' option ' . cfgOptionName(CFGOPT_REPO_PATH))) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_PATH} = '/repo'; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_REPO_PATH)} = '/repo'; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_REPO_PATH, '/repo'); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_REPO_PATH, '/repo'); } - if ($self->begin(CMD_BACKUP . ' option ' . OPTION_REPO_PATH . ' multiple times')) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' option ' . cfgOptionName(CFGOPT_REPO_PATH) . ' multiple times')) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_REPO_PATH} = ['/repo', '/repo2']; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_REPO_PATH)} = ['/repo', '/repo2']; storageTest()->put($strConfigFile, iniRender($oConfig, true)); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_CONFIG, $strConfigFile); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_CONFIG, $strConfigFile); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_MULTIPLE_VALUE, OPTION_REPO_PATH); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_MULTIPLE_VALUE, cfgOptionName(CFGOPT_REPO_PATH)); } } diff --git a/test/lib/pgBackRestTest/Module/Config/ConfigOptionTest.pm b/test/lib/pgBackRestTest/Module/Config/ConfigOptionTest.pm index 4df02d8de..ea935c866 100644 --- a/test/lib/pgBackRestTest/Module/Config/ConfigOptionTest.pm +++ b/test/lib/pgBackRestTest/Module/Config/ConfigOptionTest.pm @@ -26,325 +26,337 @@ sub run { my $self = shift; - my $oOption = {}; my @oyArray; if ($self->begin('backup with no stanza')) { - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_REQUIRED, OPTION_STANZA); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_REQUIRED, cfgOptionName(CFGOPT_STANZA)); } if ($self->begin('backup with boolean stanza')) { - $self->optionBoolSetTest($oOption, OPTION_STANZA); + $self->optionTestSetBool(CFGOPT_STANZA); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_COMMAND_REQUIRED); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP), ERROR_COMMAND_REQUIRED); } - if ($self->begin('backup type defaults to ' . BACKUP_TYPE_INCR)) + if ($self->begin('backup type defaults to ' . CFGOPTVAL_BACKUP_TYPE_INCR)) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_TYPE, BACKUP_TYPE_INCR); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_TYPE, CFGOPTVAL_BACKUP_TYPE_INCR); } - if ($self->begin(CMD_BACKUP . ' invalid option ' . OPTION_ARCHIVE_ASYNC)) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' invalid option ' . cfgOptionName(CFGOPT_ARCHIVE_ASYNC))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionBoolSetTest($oOption, OPTION_ARCHIVE_ASYNC); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSetBool(CFGOPT_ARCHIVE_ASYNC); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_COMMAND, OPTION_ARCHIVE_ASYNC, CMD_BACKUP); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_COMMAND, cfgOptionName(CFGOPT_ARCHIVE_ASYNC), + cfgCommandName(CFGCMD_BACKUP)); } - if ($self->begin('backup type set to ' . BACKUP_TYPE_FULL)) + if ($self->begin('backup type set to ' . CFGOPTVAL_BACKUP_TYPE_FULL)) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_TYPE, BACKUP_TYPE_FULL); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_TYPE, CFGOPTVAL_BACKUP_TYPE_FULL); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_TYPE, BACKUP_TYPE_FULL); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_TYPE, CFGOPTVAL_BACKUP_TYPE_FULL); } if ($self->begin('backup type invalid')) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_TYPE, BOGUS); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_TYPE, BOGUS); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_INVALID_VALUE, BOGUS, OPTION_TYPE); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_INVALID_VALUE, BOGUS, cfgOptionName(CFGOPT_TYPE)); } if ($self->begin('backup invalid force')) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionBoolSetTest($oOption, OPTION_FORCE); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSetBool(CFGOPT_FORCE); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_INVALID, OPTION_FORCE, 'no-' . OPTION_ONLINE); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_INVALID, cfgOptionName(CFGOPT_FORCE), 'no-' . cfgOptionName(CFGOPT_ONLINE)); } if ($self->begin('backup valid force')) { - # $oOption = {}; - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionBoolSetTest($oOption, OPTION_ONLINE, false); - $self->optionBoolSetTest($oOption, OPTION_FORCE); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSetBool(CFGOPT_ONLINE, false); + $self->optionTestSetBool(CFGOPT_FORCE); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_ONLINE, false); - $self->optionTestExpect(OPTION_FORCE, true); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_ONLINE, false); + $self->optionTestExpect(CFGOPT_FORCE, true); } - if ($self->begin('backup invalid value for ' . OPTION_TEST_DELAY)) + if ($self->begin('backup invalid value for ' . cfgOptionName(CFGOPT_TEST_DELAY))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionBoolSetTest($oOption, OPTION_TEST); - $self->optionSetTest($oOption, OPTION_TEST_DELAY, BOGUS); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSetBool(CFGOPT_TEST); + $self->optionTestSet(CFGOPT_TEST_DELAY, BOGUS); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_INVALID_VALUE, BOGUS, OPTION_TEST_DELAY); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_INVALID_VALUE, BOGUS, cfgOptionName(CFGOPT_TEST_DELAY)); } - if ($self->begin('backup invalid ' . OPTION_TEST_DELAY)) + if ($self->begin('backup invalid ' . cfgOptionName(CFGOPT_TEST_DELAY))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_TEST_DELAY, 5); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_TEST_DELAY, 5); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_INVALID, OPTION_TEST_DELAY, OPTION_TEST); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_INVALID, cfgOptionName(CFGOPT_TEST_DELAY), cfgOptionName(CFGOPT_TEST)); } - if ($self->begin('backup check ' . OPTION_TEST_DELAY . ' undef')) + if ($self->begin('backup check ' . cfgOptionName(CFGOPT_TEST_DELAY) . ' undef')) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_TEST_DELAY); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_TEST_DELAY); } - if ($self->begin('restore invalid ' . OPTION_TARGET)) + if ($self->begin('restore invalid ' . cfgOptionName(CFGOPT_TARGET))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_TYPE, RECOVERY_TYPE_DEFAULT); - $self->optionSetTest($oOption, OPTION_TARGET, BOGUS); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_TYPE, cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_TYPE)); + $self->optionTestSet(CFGOPT_TARGET, BOGUS); - @oyArray = (RECOVERY_TYPE_NAME, RECOVERY_TYPE_TIME, RECOVERY_TYPE_XID); - $self->configLoadExpect($oOption, CMD_RESTORE, ERROR_OPTION_INVALID, OPTION_TARGET, OPTION_TYPE, \@oyArray); + @oyArray = (CFGOPTVAL_RESTORE_TYPE_NAME, CFGOPTVAL_RESTORE_TYPE_TIME, CFGOPTVAL_RESTORE_TYPE_XID); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_RESTORE), ERROR_OPTION_INVALID, cfgOptionName(CFGOPT_TARGET), + cfgOptionName(CFGOPT_TYPE), \@oyArray); } - if ($self->begin('restore ' . OPTION_TARGET)) + if ($self->begin('restore ' . cfgOptionName(CFGOPT_TARGET))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_TYPE, RECOVERY_TYPE_NAME); - $self->optionSetTest($oOption, OPTION_TARGET, BOGUS); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_TYPE, CFGOPTVAL_RESTORE_TYPE_NAME); + $self->optionTestSet(CFGOPT_TARGET, BOGUS); - $self->configLoadExpect($oOption, CMD_RESTORE); - $self->optionTestExpect(OPTION_TYPE, RECOVERY_TYPE_NAME); - $self->optionTestExpect(OPTION_TARGET, BOGUS); - $self->optionTestExpect(OPTION_TARGET_TIMELINE); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_RESTORE)); + $self->optionTestExpect(CFGOPT_TYPE, CFGOPTVAL_RESTORE_TYPE_NAME); + $self->optionTestExpect(CFGOPT_TARGET, BOGUS); + $self->optionTestExpect(CFGOPT_TARGET_TIMELINE); } - if ($self->begin('invalid string ' . OPTION_PROCESS_MAX)) + if ($self->begin('invalid string ' . cfgOptionName(CFGOPT_PROCESS_MAX))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_PROCESS_MAX, BOGUS); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_PROCESS_MAX, BOGUS); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_INVALID_VALUE, BOGUS, OPTION_PROCESS_MAX); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_INVALID_VALUE, BOGUS, cfgOptionName(CFGOPT_PROCESS_MAX)); } - if ($self->begin('invalid float ' . OPTION_PROCESS_MAX)) + if ($self->begin('invalid float ' . cfgOptionName(CFGOPT_PROCESS_MAX))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_PROCESS_MAX, '0.0'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_PROCESS_MAX, '0.0'); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_INVALID_VALUE, '0.0', OPTION_PROCESS_MAX); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_INVALID_VALUE, '0.0', cfgOptionName(CFGOPT_PROCESS_MAX)); } - if ($self->begin('valid ' . OPTION_PROCESS_MAX)) + if ($self->begin('valid ' . cfgOptionName(CFGOPT_PROCESS_MAX))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_PROCESS_MAX, '2'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_PROCESS_MAX, '2'); - $self->configLoadExpect($oOption, CMD_BACKUP); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); } if ($self->begin('valid thread-max')) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, 'thread-max', '2'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSetByName('thread-max', '2'); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_PROCESS_MAX, 2); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_PROCESS_MAX, 2); } - if ($self->begin('valid float ' . OPTION_TEST_DELAY)) + if ($self->begin('valid float ' . cfgOptionName(CFGOPT_TEST_DELAY))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionBoolSetTest($oOption, OPTION_TEST); - $self->optionSetTest($oOption, OPTION_TEST_DELAY, '0.25'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSetBool(CFGOPT_TEST); + $self->optionTestSet(CFGOPT_TEST_DELAY, '0.25'); - $self->configLoadExpect($oOption, CMD_BACKUP); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); } - if ($self->begin('valid int ' . OPTION_TEST_DELAY)) + if ($self->begin('valid int ' . cfgOptionName(CFGOPT_TEST_DELAY))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionBoolSetTest($oOption, OPTION_TEST); - $self->optionSetTest($oOption, OPTION_TEST_DELAY, 3); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSetBool(CFGOPT_TEST); + $self->optionTestSet(CFGOPT_TEST_DELAY, 3); - $self->configLoadExpect($oOption, CMD_BACKUP); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); } - if ($self->begin('restore valid ' . OPTION_TARGET_TIMELINE)) + if ($self->begin('restore valid ' . cfgOptionName(CFGOPT_TARGET_TIMELINE))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_TARGET_TIMELINE, 2); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_TARGET_TIMELINE, 2); - $self->configLoadExpect($oOption, CMD_RESTORE); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_RESTORE)); } - if ($self->begin('invalid ' . OPTION_COMPRESS_LEVEL)) + if ($self->begin('invalid ' . cfgOptionName(CFGOPT_COMPRESS_LEVEL))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_COMPRESS_LEVEL, '12'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_COMPRESS_LEVEL, '12'); - $self->configLoadExpect($oOption, CMD_RESTORE, ERROR_OPTION_INVALID_RANGE, '12', OPTION_COMPRESS_LEVEL); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_RESTORE), ERROR_OPTION_INVALID_RANGE, '12', cfgOptionName(CFGOPT_COMPRESS_LEVEL)); } - if ($self->begin(CMD_BACKUP . ' invalid value ' . OPTION_RETENTION_ARCHIVE_TYPE)) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' invalid value ' . cfgOptionName(CFGOPT_RETENTION_ARCHIVE_TYPE))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_RETENTION_ARCHIVE_TYPE, BOGUS); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_RETENTION_ARCHIVE_TYPE, BOGUS); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_INVALID_VALUE, BOGUS, OPTION_RETENTION_ARCHIVE_TYPE); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_INVALID_VALUE, BOGUS, cfgOptionName(CFGOPT_RETENTION_ARCHIVE_TYPE)); } if ($self->begin( - CMD_BACKUP . ' default value ' . OPTION_DEFAULT_RETENTION_ARCHIVE_TYPE . ' for ' . OPTION_RETENTION_ARCHIVE_TYPE . - ' with valid ' . OPTION_RETENTION_FULL)) + cfgCommandName(CFGCMD_BACKUP) . ' default value ' . cfgRuleOptionDefault(CFGCMD_BACKUP, CFGOPT_RETENTION_ARCHIVE_TYPE) . + ' for ' . cfgOptionName(CFGOPT_RETENTION_ARCHIVE_TYPE) . ' with valid ' . cfgOptionName(CFGOPT_RETENTION_FULL))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_RETENTION_FULL, 1); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_RETENTION_FULL, 1); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_RETENTION_ARCHIVE, 1); - $self->optionTestExpect(OPTION_RETENTION_FULL, 1); - $self->optionTestExpect(OPTION_RETENTION_DIFF, undef); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_RETENTION_ARCHIVE, 1); + $self->optionTestExpect(CFGOPT_RETENTION_FULL, 1); + $self->optionTestExpect(CFGOPT_RETENTION_DIFF, undef); # Default is FULL so this test will fail if the default is changed, alerting to the need to update configLoad. - $self->optionTestExpect(OPTION_RETENTION_ARCHIVE_TYPE, BACKUP_TYPE_FULL); + $self->optionTestExpect(CFGOPT_RETENTION_ARCHIVE_TYPE, CFGOPTVAL_BACKUP_TYPE_FULL); } if ($self->begin( - CMD_BACKUP . ' valid value ' . OPTION_RETENTION_ARCHIVE . ' for ' . OPTION_RETENTION_ARCHIVE_TYPE . ' ' . - BACKUP_TYPE_DIFF)) + cfgCommandName(CFGCMD_BACKUP) . ' valid value ' . cfgOptionName(CFGOPT_RETENTION_ARCHIVE) . ' for ' . + cfgOptionName(CFGOPT_RETENTION_ARCHIVE_TYPE) . ' ' . CFGOPTVAL_BACKUP_TYPE_DIFF)) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_RETENTION_DIFF, 1); - $self->optionSetTest($oOption, OPTION_RETENTION_ARCHIVE_TYPE, BACKUP_TYPE_DIFF); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_RETENTION_DIFF, 1); + $self->optionTestSet(CFGOPT_RETENTION_ARCHIVE_TYPE, CFGOPTVAL_BACKUP_TYPE_DIFF); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_RETENTION_ARCHIVE, 1); - $self->optionTestExpect(OPTION_RETENTION_DIFF, 1); - $self->optionTestExpect(OPTION_RETENTION_FULL, undef); - $self->optionTestExpect(OPTION_RETENTION_ARCHIVE_TYPE, BACKUP_TYPE_DIFF); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_RETENTION_ARCHIVE, 1); + $self->optionTestExpect(CFGOPT_RETENTION_DIFF, 1); + $self->optionTestExpect(CFGOPT_RETENTION_FULL, undef); + $self->optionTestExpect(CFGOPT_RETENTION_ARCHIVE_TYPE, CFGOPTVAL_BACKUP_TYPE_DIFF); } if ($self->begin( - CMD_BACKUP . ' warn no valid value ' . OPTION_RETENTION_ARCHIVE . ' for ' . OPTION_RETENTION_ARCHIVE_TYPE . ' ' . - BACKUP_TYPE_INCR)) + cfgCommandName(CFGCMD_BACKUP) . ' warn no valid value ' . cfgOptionName(CFGOPT_RETENTION_ARCHIVE) . ' for ' . + cfgOptionName(CFGOPT_RETENTION_ARCHIVE_TYPE) . ' ' . CFGOPTVAL_BACKUP_TYPE_INCR)) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_RETENTION_FULL, 2); - $self->optionSetTest($oOption, OPTION_RETENTION_DIFF, 1); - $self->optionSetTest($oOption, OPTION_RETENTION_ARCHIVE_TYPE, BACKUP_TYPE_INCR); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_RETENTION_FULL, 2); + $self->optionTestSet(CFGOPT_RETENTION_DIFF, 1); + $self->optionTestSet(CFGOPT_RETENTION_ARCHIVE_TYPE, CFGOPTVAL_BACKUP_TYPE_INCR); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_RETENTION_ARCHIVE, undef); - $self->optionTestExpect(OPTION_RETENTION_ARCHIVE_TYPE, BACKUP_TYPE_INCR); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_RETENTION_ARCHIVE, undef); + $self->optionTestExpect(CFGOPT_RETENTION_ARCHIVE_TYPE, CFGOPTVAL_BACKUP_TYPE_INCR); } - if ($self->begin(CMD_BACKUP . ' invalid value ' . OPTION_PROTOCOL_TIMEOUT)) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' invalid value ' . cfgOptionName(CFGOPT_PROTOCOL_TIMEOUT))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_DB_TIMEOUT, 5); - $self->optionSetTest($oOption, OPTION_PROTOCOL_TIMEOUT, 4); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_DB_TIMEOUT, 5); + $self->optionTestSet(CFGOPT_PROTOCOL_TIMEOUT, 4); - $self->configLoadExpect( - $oOption, CMD_BACKUP, ERROR_OPTION_INVALID_VALUE, 4, OPTION_PROTOCOL_TIMEOUT, + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_INVALID_VALUE, 4, cfgOptionName(CFGOPT_PROTOCOL_TIMEOUT), "'protocol-timeout' option should be greater than 'db-timeout' option"); } - if ($self->begin(CMD_RESTORE . ' invalid value ' . OPTION_RESTORE_RECOVERY_OPTION)) + if ($self->begin(cfgCommandName(CFGCMD_RESTORE) . ' invalid value ' . cfgOptionName(CFGOPT_RECOVERY_OPTION))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_RESTORE_RECOVERY_OPTION, '='); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_RECOVERY_OPTION, '='); - $self->configLoadExpect($oOption, CMD_RESTORE, ERROR_OPTION_INVALID_PAIR, '=', OPTION_RESTORE_RECOVERY_OPTION); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_RESTORE), ERROR_OPTION_INVALID_PAIR, '=', cfgOptionName(CFGOPT_RECOVERY_OPTION)); } - if ($self->begin(CMD_RESTORE . ' invalid value ' . OPTION_RESTORE_RECOVERY_OPTION)) + if ($self->begin(cfgCommandName(CFGCMD_RESTORE) . ' invalid value ' . cfgOptionName(CFGOPT_RECOVERY_OPTION))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_RESTORE_RECOVERY_OPTION, '=' . BOGUS); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_RECOVERY_OPTION, '=' . BOGUS); - $self->configLoadExpect($oOption, CMD_RESTORE, ERROR_OPTION_INVALID_PAIR, '=' . BOGUS, OPTION_RESTORE_RECOVERY_OPTION); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_RESTORE), ERROR_OPTION_INVALID_PAIR, '=' . BOGUS, cfgOptionName(CFGOPT_RECOVERY_OPTION)); } - if ($self->begin(CMD_RESTORE . ' invalid value ' . OPTION_RESTORE_RECOVERY_OPTION)) + if ($self->begin(cfgCommandName(CFGCMD_RESTORE) . ' invalid value ' . cfgOptionName(CFGOPT_RECOVERY_OPTION))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_RESTORE_RECOVERY_OPTION, BOGUS . '='); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_RECOVERY_OPTION, BOGUS . '='); - $self->configLoadExpect($oOption, CMD_RESTORE, ERROR_OPTION_INVALID_PAIR, BOGUS . '=', OPTION_RESTORE_RECOVERY_OPTION); + $self->configTestLoadExpect( + cfgCommandName(CFGCMD_RESTORE), ERROR_OPTION_INVALID_PAIR, BOGUS . '=', cfgOptionName(CFGOPT_RECOVERY_OPTION)); } - if ($self->begin(CMD_RESTORE . ' valid value ' . OPTION_RESTORE_RECOVERY_OPTION)) + if ($self->begin(cfgCommandName(CFGCMD_RESTORE) . ' valid value ' . cfgOptionName(CFGOPT_RECOVERY_OPTION))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_RESTORE_RECOVERY_OPTION, 'primary-conn-info=db.domain.net'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_RECOVERY_OPTION, 'primary-conn-info=db.domain.net'); - $self->configLoadExpect($oOption, CMD_RESTORE); - $self->optionTestExpect(OPTION_RESTORE_RECOVERY_OPTION, 'db.domain.net', 'primary-conn-info'); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_RESTORE)); + $self->optionTestExpect(&CFGOPT_RECOVERY_OPTION, 'db.domain.net', 'primary-conn-info'); } - if ($self->begin(CMD_RESTORE . ' values passed to ' . CMD_ARCHIVE_GET)) + if ($self->begin(cfgCommandName(CFGCMD_RESTORE) . ' values passed to ' . cfgCommandName(CFGCMD_ARCHIVE_GET))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db path/main'); - $self->optionSetTest($oOption, OPTION_REPO_PATH, '/repo'); - $self->optionSetTest($oOption, OPTION_BACKUP_HOST, 'db.mydomain.com'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db path/main'); + $self->optionTestSet(CFGOPT_REPO_PATH, '/repo'); + $self->optionTestSet(CFGOPT_BACKUP_HOST, 'db.mydomain.com'); - $self->configLoadExpect($oOption, CMD_RESTORE); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_RESTORE)); - my $strCommand = commandWrite(CMD_ARCHIVE_GET); - my $strExpectedCommand = abs_path($0) . " --backup-host=db.mydomain.com \"--db-path=/db path/main\"" . - " --repo-path=/repo --stanza=app " . CMD_ARCHIVE_GET; + my $strCommand = cfgCommandWrite(CFGCMD_ARCHIVE_GET); + my $strExpectedCommand = abs_path($0) . " --backup-host=db.mydomain.com \"--db1-path=/db path/main\"" . + " --repo-path=/repo --stanza=app " . cfgCommandName(CFGCMD_ARCHIVE_GET); if ($strCommand ne $strExpectedCommand) { @@ -352,31 +364,31 @@ sub run } } - if ($self->begin(CMD_BACKUP . ' default value ' . OPTION_DB_CMD)) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' default value ' . cfgOptionName(CFGOPT_DB_CMD))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_HOST, 'db'); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_HOST, 'db'); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_DB_CMD, abs_path($0)); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_DB_CMD, abs_path($0)); } - if ($self->begin(CMD_BACKUP . ' missing option ' . OPTION_DB_PATH)) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' missing option ' . cfgOptionName(CFGOPT_DB_PATH))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); - $self->configLoadExpect($oOption, CMD_BACKUP, ERROR_OPTION_REQUIRED, OPTION_DB_PATH, 'does this stanza exist?'); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP), ERROR_OPTION_REQUIRED, 'db1-path', 'does this stanza exist?'); } - if ($self->begin(CMD_BACKUP . ' automatically increase ' . OPTION_PROTOCOL_TIMEOUT)) + if ($self->begin(cfgCommandName(CFGCMD_BACKUP) . ' automatically increase ' . cfgOptionName(CFGOPT_PROTOCOL_TIMEOUT))) { - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, '/db'); - $self->optionSetTest($oOption, OPTION_DB_TIMEOUT, OPTION_DEFAULT_PROTOCOL_TIMEOUT + 30); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, '/db'); + $self->optionTestSet(CFGOPT_DB_TIMEOUT, cfgRuleOptionDefault(CFGCMD_BACKUP, CFGOPT_PROTOCOL_TIMEOUT) + 30); - $self->configLoadExpect($oOption, CMD_BACKUP); - $self->optionTestExpect(OPTION_PROTOCOL_TIMEOUT, OPTION_DEFAULT_PROTOCOL_TIMEOUT + 60); + $self->configTestLoadExpect(cfgCommandName(CFGCMD_BACKUP)); + $self->optionTestExpect(CFGOPT_PROTOCOL_TIMEOUT, cfgRuleOptionDefault(CFGCMD_BACKUP, CFGOPT_PROTOCOL_TIMEOUT) + 60); } } diff --git a/test/lib/pgBackRestTest/Module/Config/ConfigUnitTest.pm b/test/lib/pgBackRestTest/Module/Config/ConfigUnitTest.pm index 778f46402..46e1cd40f 100644 --- a/test/lib/pgBackRestTest/Module/Config/ConfigUnitTest.pm +++ b/test/lib/pgBackRestTest/Module/Config/ConfigUnitTest.pm @@ -27,78 +27,86 @@ sub run my $oConfig = {}; my $strConfigFile = $self->testPath() . '/pgbackrest.conf'; - optionSet(OPTION_CONFIG, $strConfigFile, true); - commandSet(CMD_ARCHIVE_GET); + cfgCommandSet(CFGCMD_ARCHIVE_GET); + cfgOptionSet(CFGOPT_CONFIG, $strConfigFile, true); if ($self->begin('Config::configFileValidate()')) { $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_DB_PORT} = 1234; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_DB_PORT)} = 1234; - $self->testResult(sub {configFileValidate($oConfig)}, false, - 'valid option ' . OPTION_DB_PORT . ' under invalid section', + $self->testResult(sub {pgBackRest::Config::Config::configFileValidate($oConfig)}, false, + 'valid option ' . cfgOptionName(CFGOPT_DB_PORT) . ' under invalid section', {strLogExpect => - "WARN: $strConfigFile valid option '" . OPTION_DB_PORT . "' is a stanza section option and is not valid in" . - " section " . CONFIG_SECTION_GLOBAL . "\nHINT: global options can be specified in global or stanza sections but" . - " not visa-versa"}); + "WARN: $strConfigFile valid option '" . cfgOptionName(CFGOPT_DB_PORT) . "' is a stanza section option and is not" . + " valid in section " . CFGDEF_SECTION_GLOBAL . "\n" . + "HINT: global options can be specified in global or stanza sections but not visa-versa"}); #--------------------------------------------------------------------------------------------------------------------------- $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_BACKUP}{&OPTION_DB_PORT} = 1234; + $$oConfig{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_BACKUP)}{cfgOptionName(CFGOPT_DB_PORT)} = 1234; - $self->testResult(sub {configFileValidate($oConfig)}, false, - 'valid option ' . OPTION_DB_PORT . ' for command ' . CMD_BACKUP . ' under invalid global section', + $self->testResult(sub {pgBackRest::Config::Config::configFileValidate($oConfig)}, false, + 'valid option ' . cfgOptionName(CFGOPT_DB_PORT) . ' for command ' . cfgCommandName(CFGCMD_BACKUP) . + ' under invalid global section', {strLogExpect => - "WARN: $strConfigFile valid option '" . OPTION_DB_PORT . "' is a stanza section option and is not valid in" . - " section " . CONFIG_SECTION_GLOBAL ."\nHINT: global options can be specified in global or stanza sections but" . - " not visa-versa"}); + "WARN: $strConfigFile valid option '" . cfgOptionName(CFGOPT_DB_PORT) . "' is a stanza section option and is not" . + " valid in section " . CFGDEF_SECTION_GLOBAL . "\n" . + "HINT: global options can be specified in global or stanza sections but not visa-versa"}); #--------------------------------------------------------------------------------------------------------------------------- $oConfig = {}; - $$oConfig{$self->stanza() . ':' . &CMD_ARCHIVE_PUSH}{&OPTION_DB_PORT} = 1234; + $$oConfig{$self->stanza() . ':' . cfgCommandName(CFGCMD_ARCHIVE_PUSH)}{cfgOptionName(CFGOPT_DB_PORT)} = 1234; - $self->testResult(sub {configFileValidate($oConfig)}, false, - 'valid option ' . OPTION_DB_PORT . ' under invalid stanza section command', + $self->testResult(sub {pgBackRest::Config::Config::configFileValidate($oConfig)}, false, + 'valid option ' . cfgOptionName(CFGOPT_DB_PORT) . ' under invalid stanza section command', {strLogExpect => - "WARN: $strConfigFile valid option '" . OPTION_DB_PORT . "' is not valid for command '" . CMD_ARCHIVE_PUSH ."'"}); + "WARN: $strConfigFile valid option '" . cfgOptionName(CFGOPT_DB_PORT) . "' is not valid for command '" . + cfgCommandName(CFGCMD_ARCHIVE_PUSH) ."'"}); #--------------------------------------------------------------------------------------------------------------------------- $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&BOGUS} = BOGUS; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{&BOGUS} = BOGUS; - $self->testResult(sub {configFileValidate($oConfig)}, false, 'invalid option ' . $$oConfig{&CONFIG_SECTION_GLOBAL}{&BOGUS}, + $self->testResult( + sub {pgBackRest::Config::Config::configFileValidate($oConfig)}, false, + 'invalid option ' . $$oConfig{&CFGDEF_SECTION_GLOBAL}{&BOGUS}, {strLogExpect => "WARN: $strConfigFile file contains invalid option '" . BOGUS . "'"}); #--------------------------------------------------------------------------------------------------------------------------- $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{'thread-max'} = 3; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{'thread-max'} = 3; - $self->testResult(sub {configFileValidate($oConfig)}, true, 'valid alt name found'); + $self->testResult(sub {pgBackRest::Config::Config::configFileValidate($oConfig)}, true, 'valid alt name found'); #--------------------------------------------------------------------------------------------------------------------------- $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_LEVEL_STDERR} = OPTION_DEFAULT_LOG_LEVEL_STDERR; - $$oConfig{$self->stanza()}{&OPTION_DB_PATH} = '/db'; - $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_ARCHIVE_PUSH}{&OPTION_PROCESS_MAX} = 2; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOG_LEVEL_STDERR)} = + cfgRuleOptionDefault(CFGCMD_ARCHIVE_PUSH, CFGOPT_LOG_LEVEL_STDERR); + $$oConfig{$self->stanza()}{cfgOptionName(CFGOPT_DB_PATH)} = '/db'; + $$oConfig{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_ARCHIVE_PUSH)}{cfgOptionName(CFGOPT_PROCESS_MAX)} = 2; - $self->testResult(sub {configFileValidate($oConfig)}, true, 'valid config file'); + $self->testResult(sub {pgBackRest::Config::Config::configFileValidate($oConfig)}, true, 'valid config file'); #--------------------------------------------------------------------------------------------------------------------------- $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&OPTION_LOG_LEVEL_STDERR} = OPTION_DEFAULT_LOG_LEVEL_STDERR; - $$oConfig{&CONFIG_SECTION_GLOBAL . ':' . &CMD_ARCHIVE_PUSH}{&OPTION_PROCESS_MAX} = 2; - $$oConfig{'unusual-section^name!:' . &CMD_CHECK}{&OPTION_DB_PATH} = '/db'; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{cfgOptionName(CFGOPT_LOG_LEVEL_STDERR)} = + cfgRuleOptionDefault(CFGCMD_ARCHIVE_PUSH, CFGOPT_LOG_LEVEL_STDERR); + $$oConfig{&CFGDEF_SECTION_GLOBAL . ':' . cfgCommandName(CFGCMD_ARCHIVE_PUSH)}{cfgOptionName(CFGOPT_PROCESS_MAX)} = 2; + $$oConfig{'unusual-section^name!:' . cfgCommandName(CFGCMD_CHECK)}{cfgOptionName(CFGOPT_DB_PATH)} = '/db'; - $self->testResult(sub {configFileValidate($oConfig)}, true, 'valid unusual section name'); + $self->testResult(sub {pgBackRest::Config::Config::configFileValidate($oConfig)}, true, 'valid unusual section name'); #--------------------------------------------------------------------------------------------------------------------------- $oConfig = {}; - $$oConfig{&CONFIG_SECTION_GLOBAL}{&BOGUS} = BOGUS; + $$oConfig{&CFGDEF_SECTION_GLOBAL}{&BOGUS} = BOGUS; # Change command to indicate remote - commandSet(CMD_REMOTE); + cfgCommandSet(CFGCMD_REMOTE); - $self->testResult(sub {configFileValidate($oConfig)}, true, 'invalid option but config file not validated on remote'); + $self->testResult( + sub {pgBackRest::Config::Config::configFileValidate($oConfig)}, true, + 'invalid option but config file not validated on remote'); } } diff --git a/test/lib/pgBackRestTest/Module/Expire/ExpireExpireTest.pm b/test/lib/pgBackRestTest/Module/Expire/ExpireExpireTest.pm index 8f6027ac0..8350fba4f 100644 --- a/test/lib/pgBackRestTest/Module/Expire/ExpireExpireTest.pm +++ b/test/lib/pgBackRestTest/Module/Expire/ExpireExpireTest.pm @@ -38,31 +38,30 @@ use pgBackRestTest::Env::HostEnvTest; sub initStanzaOption { my $self = shift; - my $oOption = shift; my $strDbBasePath = shift; my $strRepoPath = shift; my $oHostS3 = shift; - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, $strDbBasePath); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $strRepoPath); - $self->optionSetTest($oOption, OPTION_LOG_PATH, $self->testPath()); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, $strDbBasePath); + $self->optionTestSet(CFGOPT_REPO_PATH, $strRepoPath); + $self->optionTestSet(CFGOPT_LOG_PATH, $self->testPath()); - $self->optionBoolSetTest($oOption, OPTION_ONLINE, false); + $self->optionTestSetBool(CFGOPT_ONLINE, false); - $self->optionSetTest($oOption, OPTION_DB_TIMEOUT, 5); - $self->optionSetTest($oOption, OPTION_PROTOCOL_TIMEOUT, 6); + $self->optionTestSet(CFGOPT_DB_TIMEOUT, 5); + $self->optionTestSet(CFGOPT_PROTOCOL_TIMEOUT, 6); if (defined($oHostS3)) { - $self->optionSetTest($oOption, OPTION_REPO_TYPE, REPO_TYPE_S3); - $self->optionSetTest($oOption, OPTION_REPO_S3_KEY, HOST_S3_ACCESS_KEY); - $self->optionSetTest($oOption, OPTION_REPO_S3_KEY_SECRET, HOST_S3_ACCESS_SECRET_KEY); - $self->optionSetTest($oOption, OPTION_REPO_S3_BUCKET, HOST_S3_BUCKET); - $self->optionSetTest($oOption, OPTION_REPO_S3_ENDPOINT, HOST_S3_ENDPOINT); - $self->optionSetTest($oOption, OPTION_REPO_S3_REGION, HOST_S3_REGION); - $self->optionSetTest($oOption, OPTION_REPO_S3_HOST, $oHostS3->ipGet()); - $self->optionBoolSetTest($oOption, OPTION_REPO_S3_VERIFY_SSL, false); + $self->optionTestSet(CFGOPT_REPO_TYPE, CFGOPTVAL_REPO_TYPE_S3); + $self->optionTestSet(CFGOPT_REPO_S3_KEY, HOST_S3_ACCESS_KEY); + $self->optionTestSet(CFGOPT_REPO_S3_KEY_SECRET, HOST_S3_ACCESS_SECRET_KEY); + $self->optionTestSet(CFGOPT_REPO_S3_BUCKET, HOST_S3_BUCKET); + $self->optionTestSet(CFGOPT_REPO_S3_ENDPOINT, HOST_S3_ENDPOINT); + $self->optionTestSet(CFGOPT_REPO_S3_REGION, HOST_S3_REGION); + $self->optionTestSet(CFGOPT_REPO_S3_HOST, $oHostS3->ipGet()); + $self->optionTestSetBool(CFGOPT_REPO_S3_VERIFY_SSL, false); } } @@ -76,7 +75,6 @@ sub run use constant SECONDS_PER_DAY => 86400; my $lBaseTime = time() - (SECONDS_PER_DAY * 56); my $strDescription; - my $oOption = {}; my $bS3 = false; @@ -85,8 +83,8 @@ sub run # Create hosts, file object, and config my ($oHostDbMaster, $oHostDbStandby, $oHostBackup, $oHostS3) = $self->setup(true, $self->expect(), {bS3 => $bS3}); - $self->initStanzaOption($oOption, $oHostDbMaster->dbBasePath(), $oHostBackup->{strRepoPath}, $oHostS3); - $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); + $self->initStanzaOption($oHostDbMaster->dbBasePath(), $oHostBackup->{strRepoPath}, $oHostS3); + $self->configTestLoad(CFGCMD_STANZA_CREATE); # Create the test object my $oExpireTest = new pgBackRestTest::Env::ExpireEnvTest( @@ -97,84 +95,84 @@ sub run #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Nothing to expire'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, 246); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, 246); - $oExpireTest->process($self->stanza(), 1, 1, BACKUP_TYPE_FULL, 1, $strDescription); + $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire oldest full backup, archive expire falls on segment major boundary'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), 1, 1, BACKUP_TYPE_FULL, 1, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire oldest full backup'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY, 256); - $oExpireTest->process($self->stanza(), 1, 1, BACKUP_TYPE_FULL, 1, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY, 256); + $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire oldest diff backup, archive expire does not fall on major segment boundary'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY, undef, 0); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, undef, 0); - $oExpireTest->process($self->stanza(), 1, 1, BACKUP_TYPE_DIFF, 1, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY, undef, 0); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, undef, 0); + $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire oldest diff backup (cascade to incr)'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), 1, 1, BACKUP_TYPE_DIFF, 1, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire archive based on newest incr backup'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), 1, 1, BACKUP_TYPE_INCR, 1, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_INCR, 1, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire diff treating full as diff'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), 2, 1, BACKUP_TYPE_DIFF, 1, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), 2, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire diff with retention-archive with warning retention-diff not set'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), undef, undef, BACKUP_TYPE_DIFF, 1, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire full with retention-archive with warning retention-full not set'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), undef, undef, BACKUP_TYPE_FULL, 1, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire no archive with warning since retention-archive not set for INCR'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), 1, 1, BACKUP_TYPE_INCR, undef, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_INCR, undef, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire no archive with warning since neither retention-archive nor retention-diff is set'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), undef, undef, BACKUP_TYPE_DIFF, undef, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_DIFF, undef, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Use oldest full backup for archive retention'; - $oExpireTest->process($self->stanza(), 10, 10, BACKUP_TYPE_FULL, 10, $strDescription); + $oExpireTest->process($self->stanza(), 10, 10, CFGOPTVAL_BACKUP_TYPE_FULL, 10, $strDescription); } if ($self->begin("Expire::stanzaUpgrade")) @@ -182,8 +180,8 @@ sub run # Create hosts, file object, and config my ($oHostDbMaster, $oHostDbStandby, $oHostBackup, $oHostS3) = $self->setup(true, $self->expect(), {bS3 => $bS3}); - $self->initStanzaOption($oOption, $oHostDbMaster->dbBasePath(), $oHostBackup->{strRepoPath}, $oHostS3); - $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); + $self->initStanzaOption($oHostDbMaster->dbBasePath(), $oHostBackup->{strRepoPath}, $oHostS3); + $self->configTestLoad(CFGCMD_STANZA_CREATE); # Create the test object my $oExpireTest = new pgBackRestTest::Env::ExpireEnvTest( @@ -194,48 +192,50 @@ sub run #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Create backups in current db version'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), undef, undef, BACKUP_TYPE_DIFF, undef, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_DIFF, undef, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Upgrade stanza and expire only earliest db backup and archive'; $oExpireTest->stanzaUpgrade($self->stanza(), PG_VERSION_93); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, 246); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), 3, undef, BACKUP_TYPE_FULL, undef, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, 246); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), 3, undef, CFGOPTVAL_BACKUP_TYPE_FULL, undef, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Upgrade the stanza, create full back - earliest db orphaned archive removed and earliest full backup ' . 'and archive in previous db version removed'; $oExpireTest->stanzaUpgrade($self->stanza(), PG_VERSION_95); - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), 2, undef, BACKUP_TYPE_FULL, undef, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), 2, undef, CFGOPTVAL_BACKUP_TYPE_FULL, undef, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire all archive last full backup through pitr'; - $oExpireTest->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); - $oExpireTest->process($self->stanza(), 3, 1, BACKUP_TYPE_DIFF, 1, $strDescription); + $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY); + $oExpireTest->process($self->stanza(), 3, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription); #----------------------------------------------------------------------------------------------------------------------- $strDescription = 'Expire all archive except for the current database'; - $oExpireTest->process($self->stanza(), 2, undef, BACKUP_TYPE_FULL, undef, $strDescription); + $oExpireTest->process($self->stanza(), 2, undef, CFGOPTVAL_BACKUP_TYPE_FULL, undef, $strDescription); #----------------------------------------------------------------------------------------------------------------------- - $self->optionReset($oOption, OPTION_DB_PATH); - $self->optionReset($oOption, OPTION_ONLINE); - $self->optionSetTest($oOption, OPTION_RETENTION_FULL, 1); - $self->optionSetTest($oOption, OPTION_RETENTION_DIFF, 1); - $self->optionSetTest($oOption, OPTION_RETENTION_ARCHIVE_TYPE, BACKUP_TYPE_FULL); - $self->optionSetTest($oOption, OPTION_RETENTION_ARCHIVE, 1); - $self->configLoadExpect(dclone($oOption), CMD_EXPIRE); + $self->optionTestClear(CFGOPT_DB_TIMEOUT); + $self->optionTestClear(CFGOPT_DB_PATH); + $self->optionTestClear(CFGOPT_ONLINE); + $self->optionTestClear(CFGOPT_PROTOCOL_TIMEOUT); + $self->optionTestSet(CFGOPT_RETENTION_FULL, 1); + $self->optionTestSet(CFGOPT_RETENTION_DIFF, 1); + $self->optionTestSet(CFGOPT_RETENTION_ARCHIVE_TYPE, CFGOPTVAL_BACKUP_TYPE_FULL); + $self->optionTestSet(CFGOPT_RETENTION_ARCHIVE, 1); + $self->configTestLoad(CFGCMD_EXPIRE); $strDescription = 'Expiration cannot occur due to info file db mismatch'; my $oExpire = new pgBackRest::Expire(); diff --git a/test/lib/pgBackRestTest/Module/Help/HelpHelpTest.pm b/test/lib/pgBackRestTest/Module/Help/HelpHelpTest.pm index 8d409262e..41d5c01ac 100644 --- a/test/lib/pgBackRestTest/Module/Help/HelpHelpTest.pm +++ b/test/lib/pgBackRestTest/Module/Help/HelpHelpTest.pm @@ -41,11 +41,12 @@ sub run # Increment the run, log, and decide whether this unit test should be run if ($self->begin('base')) { - $self->helpExecute(CMD_VERSION); - $self->helpExecute(CMD_HELP); - $self->helpExecute(CMD_HELP . ' version'); - $self->helpExecute(CMD_HELP . ' --output=json --stanza=main info'); - $self->helpExecute(CMD_HELP . ' --output=json --stanza=main info output'); + $self->helpExecute(cfgCommandName(CFGCMD_VERSION)); + $self->helpExecute(cfgCommandName(CFGCMD_HELP)); + $self->helpExecute(cfgCommandName(CFGCMD_HELP) . ' version'); + $self->helpExecute(cfgCommandName(CFGCMD_HELP) . ' --output=json --stanza=main --backup-host=backup info'); + $self->helpExecute(cfgCommandName(CFGCMD_HELP) . ' --output=json --stanza=main info output'); + $self->helpExecute(cfgCommandName(CFGCMD_HELP) . ' check'); } } diff --git a/test/lib/pgBackRestTest/Module/Info/InfoUnitTest.pm b/test/lib/pgBackRestTest/Module/Info/InfoUnitTest.pm index c2690fa29..ca946d9de 100644 --- a/test/lib/pgBackRestTest/Module/Info/InfoUnitTest.pm +++ b/test/lib/pgBackRestTest/Module/Info/InfoUnitTest.pm @@ -2,7 +2,7 @@ # InfoUnitTest.pm - Unit tests for Info module #################################################################################################################################### package pgBackRestTest::Module::Info::InfoUnitTest; -use parent 'pgBackRestTest::Env::HostEnvTest'; +use parent 'pgBackRestTest::Env::ConfigEnvTest'; #################################################################################################################################### # Perl includes @@ -72,21 +72,21 @@ sub initStanzaCreate my $self = shift; # Set options for stanzaCreate - my $oOption = {}; + my $rhConfig = $self->configTestClear(); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, $self->{strDbPath}); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $self->{strRepoPath}); - $self->optionSetTest($oOption, OPTION_LOG_PATH, $self->testPath()); - $self->optionBoolSetTest($oOption, OPTION_ONLINE, false); - $self->optionSetTest($oOption, OPTION_DB_TIMEOUT, 5); - $self->optionSetTest($oOption, OPTION_PROTOCOL_TIMEOUT, 6); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, $self->{strDbPath}); + $self->optionTestSet(CFGOPT_REPO_PATH, $self->{strRepoPath}); + $self->optionTestSet(CFGOPT_LOG_PATH, $self->testPath()); + $self->optionTestSetBool(CFGOPT_ONLINE, false); + $self->optionTestSet(CFGOPT_DB_TIMEOUT, 5); + $self->optionTestSet(CFGOPT_PROTOCOL_TIMEOUT, 6); - $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); + $self->configTestLoad(CFGCMD_STANZA_CREATE); + $self->configTestSet($rhConfig); # Create the test object $self->{oExpireTest} = new pgBackRestTest::Env::ExpireEnvTest(undef, $self->backrestExe(), storageRepo(), undef, $self); - $self->{oExpireTest}->stanzaCreate($self->stanza(), PG_VERSION_94); } @@ -98,17 +98,18 @@ sub initStanzaUpgrade my $self = shift; # Set options for stanzaCreate - my $oOption = {}; + my $rhConfig = $self->configTestClear(); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, $self->{strDbPath}); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $self->{strRepoPath}); - $self->optionSetTest($oOption, OPTION_LOG_PATH, $self->testPath()); - $self->optionBoolSetTest($oOption, OPTION_ONLINE, false); - $self->optionSetTest($oOption, OPTION_DB_TIMEOUT, 5); - $self->optionSetTest($oOption, OPTION_PROTOCOL_TIMEOUT, 6); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, $self->{strDbPath}); + $self->optionTestSet(CFGOPT_REPO_PATH, $self->{strRepoPath}); + $self->optionTestSet(CFGOPT_LOG_PATH, $self->testPath()); + $self->optionTestSetBool(CFGOPT_ONLINE, false); + $self->optionTestSet(CFGOPT_DB_TIMEOUT, 5); + $self->optionTestSet(CFGOPT_PROTOCOL_TIMEOUT, 6); - $self->configLoadExpect(dclone($oOption), CMD_STANZA_UPGRADE); + $self->configTestLoad(CFGCMD_STANZA_UPGRADE); + $self->configTestSet($rhConfig); # Create the test object $self->{oExpireTest} = new pgBackRestTest::Env::ExpireEnvTest(undef, $self->backrestExe(), storageRepo(), undef, $self); @@ -123,8 +124,6 @@ sub run { my $self = shift; - my $oOption = {}; - # Used to create backups and WAL to test use constant SECONDS_PER_DAY => 86400; my $lBaseTime = 1486137448 - (60 * SECONDS_PER_DAY); @@ -132,7 +131,7 @@ sub run ################################################################################################################################ if ($self->begin("Info")) { - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_INFO); logEnable(); + $self->configTestLoad(CFGCMD_INFO); my $oInfo = new pgBackRest::Info(); @@ -142,14 +141,14 @@ sub run # Invalid option #--------------------------------------------------------------------------------------------------------------------------- - optionSet(OPTION_OUTPUT, BOGUS); + cfgOptionSet(CFGOPT_OUTPUT, BOGUS); $self->testException(sub {$oInfo->process()}, ERROR_ASSERT, "invalid info output option '" . BOGUS . "'"); # Output json option with no stanza defined #--------------------------------------------------------------------------------------------------------------------------- - $self->optionSetTest($oOption, OPTION_OUTPUT, INFO_OUTPUT_JSON); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_INFO); logEnable(); + $self->optionTestSet(CFGOPT_OUTPUT, CFGOPTVAL_INFO_OUTPUT_JSON); + $self->configTestLoad(CFGCMD_INFO); $self->testResult(sub {$oInfo->process()}, 0, 'json option'); @@ -196,7 +195,8 @@ sub run # Test !isRepoLocal branch #--------------------------------------------------------------------------------------------------------------------------- - optionSet(OPTION_BACKUP_HOST, false); + cfgOptionSet(CFGOPT_BACKUP_HOST, false); + cfgOptionSet(CFGOPT_BACKUP_CONFIG, BOGUS); $self->testException(sub {$oInfo->stanzaList(BOGUS)}, ERROR_ASSERT, "option backup-cmd is required"); # dbArchiveSection() -- no archive @@ -225,9 +225,9 @@ sub run # Create more than one stanza but no data #--------------------------------------------------------------------------------------------------------------------------- - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $self->{strRepoPath}); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_INFO); logEnable(); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_REPO_PATH, $self->{strRepoPath}); + $self->configTestLoad(CFGCMD_INFO); # Create archive info paths but no archive info storageTest()->pathCreate($self->{strArchivePath}, {bIgnoreExists => true, bCreateParent => true}); @@ -247,16 +247,16 @@ sub run # Define the stanza option #--------------------------------------------------------------------------------------------------------------------------- - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionReset($oOption, OPTION_OUTPUT); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_INFO); logEnable(); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestClear(CFGOPT_OUTPUT); + $self->configTestLoad(CFGCMD_INFO); $self->testResult(sub {$oInfo->process()}, 0, 'stanza set'); # Create the stanza - no WAL or backups #--------------------------------------------------------------------------------------------------------------------------- $self->initStanzaCreate(); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_INFO); logEnable(); + $self->configTestLoad(CFGCMD_INFO); $hyStanza = $oInfo->stanzaList($self->stanza()); $self->testResult(sub {$oInfo->formatText($hyStanza)}, @@ -266,7 +266,7 @@ sub run # Create a backup and list backup for just one stanza #--------------------------------------------------------------------------------------------------------------------------- - $self->{oExpireTest}->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY, -1, -1); + $self->{oExpireTest}->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY, -1, -1); $hyStanza = $oInfo->stanzaList($self->stanza()); $self->testResult(sub {$oInfo->formatText($hyStanza)}, @@ -294,10 +294,11 @@ sub run #--------------------------------------------------------------------------------------------------------------------------- undef($self->{oExpireTest}); $self->initStanzaUpgrade(); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_INFO); logEnable(); - $self->{oExpireTest}->backupCreate($self->stanza(), BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY, 1, 1); - $self->{oExpireTest}->backupCreate($self->stanza(), BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY, 1, 1); + $self->configTestLoad(CFGCMD_INFO); + + $self->{oExpireTest}->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY, 1, 1); + $self->{oExpireTest}->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY, 1, 1); # Remove the 9.4-1 path for condition test coverage storageTest()->remove($self->{strArchivePath} . "/9.4-1/", {bRecurse => true}); diff --git a/test/lib/pgBackRestTest/Module/Mock/MockAllTest.pm b/test/lib/pgBackRestTest/Module/Mock/MockAllTest.pm index 12405987a..746370010 100644 --- a/test/lib/pgBackRestTest/Module/Mock/MockAllTest.pm +++ b/test/lib/pgBackRestTest/Module/Mock/MockAllTest.pm @@ -71,19 +71,19 @@ sub run true, $self->expect(), {bHostBackup => $bRemote, bCompress => false, bS3 => $bS3}); # Reduce log level for many tests - my $strLogReduced = '--' . OPTION_LOG_LEVEL_CONSOLE . '=' . lc(DETAIL); + my $strLogReduced = '--' . cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE) . '=' . lc(DETAIL); # If S3 set process max to 2. This seems like the best place for parallel testing since it will help speed S3 processing # without slowing down the other tests too much. if ($bS3) { - $oHostBackup->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_PROCESS_MAX => 2}}); - $oHostDbMaster->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_PROCESS_MAX => 2}}); + $oHostBackup->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_PROCESS_MAX) => 2}}); + $oHostDbMaster->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_PROCESS_MAX) => 2}}); # Reduce log level to detail because parallel tests do not create deterministic logs - $oHostBackup->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_LOG_LEVEL_CONSOLE => lc(WARN)}}); - $oHostDbMaster->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_LOG_LEVEL_CONSOLE => lc(WARN)}}); - $strLogReduced = '--' . OPTION_LOG_LEVEL_CONSOLE . '=' . lc(WARN); + $oHostBackup->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE) => lc(WARN)}}); + $oHostDbMaster->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE) => lc(WARN)}}); + $strLogReduced = '--' . cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE) . '=' . lc(WARN); } # Get base time @@ -257,13 +257,13 @@ sub run } # Backup Info (with no stanzas) - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- $oHostDbMaster->info('no stanzas exist'); - $oHostDbMaster->info('no stanzas exist', {strOutput => INFO_OUTPUT_JSON}); + $oHostDbMaster->info('no stanzas exist', {strOutput => CFGOPTVAL_INFO_OUTPUT_JSON}); # Full backup - #----------------------------------------------------------------------------------------------------------------------- - my $strType = BACKUP_TYPE_FULL; + #--------------------------------------------------------------------------------------------------------------------------- + my $strType = CFGOPTVAL_BACKUP_TYPE_FULL; my $strOptionalParam = '--manifest-save-threshold=3'; my $strTestPoint; @@ -279,7 +279,7 @@ sub run } # Create the archive info file - $oHostBackup->stanzaCreate('create required data for stanza', {strOptionalParam => '--no-' . OPTION_ONLINE}); + $oHostBackup->stanzaCreate('create required data for stanza', {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Create a file link storageTest()->pathCreate($oHostDbMaster->dbPath() . '/pg_config', {strMode => '0700', bCreateParent => true}); @@ -325,12 +325,13 @@ sub run $strFullBackup = $oHostBackup->backup( $strType, 'create pg_stat link, pg_clog dir', {oExpectedManifest => \%oManifest, - strOptionalParam => $strOptionalParam . ($bRemote ? ' --cmd-ssh=/usr/bin/ssh' : '') . ' --' . OPTION_BUFFER_SIZE . - '=16384 --' . OPTION_CHECKSUM_PAGE . ' --' . OPTION_PROCESS_MAX . '=1', - strRepoType => $bS3 ? undef : REPO_TYPE_CIFS, strTest => $strTestPoint, fTestDelay => 0}); + strOptionalParam => $strOptionalParam . ($bRemote ? ' --cmd-ssh=/usr/bin/ssh' : '') . + ' --' . cfgOptionName(CFGOPT_BUFFER_SIZE) . '=16384 --' . cfgOptionName(CFGOPT_CHECKSUM_PAGE) . + ' --' . cfgOptionName(CFGOPT_PROCESS_MAX) . '=1', + strRepoType => $bS3 ? undef : CFGOPTVAL_REPO_TYPE_CIFS, strTest => $strTestPoint, fTestDelay => 0}); # Error on backup option to check logging - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- if (!$bRemote) { $oHostBackup->backup( @@ -339,7 +340,7 @@ sub run } # Test protocol timeout - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- if ($bRemote && !$bS3) { $oHostBackup->backup( @@ -349,7 +350,7 @@ sub run } # Stop operations and make sure the correct error occurs - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- if (!$bS3) { # Test a backup abort @@ -404,8 +405,8 @@ sub run } # Resume Full Backup - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_FULL; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_FULL; # These files should never be backed up (this requires the next backup to do --force) testFileCreate($oHostDbMaster->dbBasePath() . '/' . DB_FILE_POSTMASTERPID, 'JUNK'); @@ -461,20 +462,20 @@ sub run $strFullBackup = $oHostBackup->backup( $strType, 'resume', {oExpectedManifest => \%oManifest, strTest => TEST_BACKUP_RESUME, - strOptionalParam => '--force --' . OPTION_CHECKSUM_PAGE}); + strOptionalParam => '--force --' . cfgOptionName(CFGOPT_CHECKSUM_PAGE)}); # Remove postmaster.pid so restore will succeed (the rest will be cleaned up by the delta) storageDb->remove($oHostDbMaster->dbBasePath() . '/' . DB_FILE_POSTMASTERPID); # Misconfigure repo-path and check errors - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- $oHostBackup->backup( $strType, 'invalid repo', - {oExpectedManifest => \%oManifest, strOptionalParam => '--' . OPTION_REPO_PATH . '=/bogus_path' . + {oExpectedManifest => \%oManifest, strOptionalParam => '--' . cfgOptionName(CFGOPT_REPO_PATH) . '=/bogus_path' . " ${strLogReduced}", iExpectedExitStatus => $bS3 ? ERROR_FILE_MISSING : ERROR_PATH_MISSING}); # Restore - tests various mode, extra files/paths, missing files/paths - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- my $bDelta = true; my $bForce = false; @@ -576,7 +577,7 @@ sub run } # Restore - test errors when $PGDATA cannot be verified - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- $bDelta = true; $bForce = true; @@ -607,8 +608,8 @@ sub run 'restore succeeds with backup.manifest file', undef, $strLogReduced); # Various broken info tests - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_INCR; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; $oHostDbMaster->manifestReference(\%oManifest, $strFullBackup); # Break the database version @@ -651,8 +652,8 @@ sub run $oHostBackup->infoRestore(storageRepo()->pathGet(STORAGE_REPO_BACKUP . qw{/} . FILE_BACKUP_INFO)); # Test broken tablespace configuration - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_INCR; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; my $strTblSpcPath = $oHostDbMaster->dbBasePath() . '/' . DB_PATH_PGTBLSPC; # Create a directory in pg_tablespace @@ -750,8 +751,8 @@ sub run testFileRemove("${strTblSpcPath}/99999"); # Incr backup - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_INCR; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; # Add tablespace 1 $oHostDbMaster->manifestTablespaceCreate(\%oManifest, 1); @@ -775,8 +776,8 @@ sub run $strType, 'add tablespace 1', {oExpectedManifest => \%oManifest, strOptionalParam => '--test'}); # Resume Incr Backup - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_INCR; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; # Create resumable backup from last backup $strResumePath = @@ -813,11 +814,11 @@ sub run $strBackup = $oHostBackup->backup( $strType, 'resume and add tablespace 2', {oExpectedManifest => \%oManifest, strTest => TEST_BACKUP_RESUME, - strOptionalParam => '--' . OPTION_PROCESS_MAX . '=1'}); + strOptionalParam => '--' . cfgOptionName(CFGOPT_PROCESS_MAX) . '=1'}); # Resume Diff Backup - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_DIFF; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_DIFF; # Drop tablespace 11 $oHostDbMaster->manifestTablespaceDrop(\%oManifest, 11); @@ -831,11 +832,11 @@ sub run $strBackup = $oHostBackup->backup( $strType, 'cannot resume - new diff', {oExpectedManifest => \%oManifest, strTest => TEST_BACKUP_NORESUME, - strOptionalParam => "$strLogReduced --" . OPTION_PROCESS_MAX . '=1'}); + strOptionalParam => "$strLogReduced --" . cfgOptionName(CFGOPT_PROCESS_MAX) . '=1'}); # Resume Diff Backup - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_DIFF; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_DIFF; # Create resumable backup from last backup $strResumePath = storageRepo()->pathGet('backup/' . $self->stanza() . "/${strBackup}"); @@ -846,10 +847,10 @@ sub run $strBackup = $oHostBackup->backup( $strType, 'cannot resume - disabled / no repo link', {oExpectedManifest => \%oManifest, strTest => TEST_BACKUP_NORESUME, - strOptionalParam => "--no-resume ${strLogReduced} --" . OPTION_PROCESS_MAX . '=1'}); + strOptionalParam => "--no-resume ${strLogReduced} --" . cfgOptionName(CFGOPT_PROCESS_MAX) . '=1'}); # Restore - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- $bDelta = false; $bForce = false; @@ -870,7 +871,7 @@ sub run 'remap all paths', undef, $strLogReduced); # Restore (make sure file in root tablespace path is not deleted by --delta) - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- $bDelta = true; $oHostDbMaster->restore( @@ -883,8 +884,8 @@ sub run } # Incr Backup - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_INCR; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; $oHostDbMaster->manifestReference(\%oManifest, $strBackup); $oHostDbMaster->manifestFileCreate( @@ -902,11 +903,11 @@ sub run $strBackup = $oHostBackup->backup( $strType, 'add files and remove tablespace 2', - {oExpectedManifest => \%oManifest, strOptionalParam => "$strLogReduced --" . OPTION_PROCESS_MAX . '=1'}); + {oExpectedManifest => \%oManifest, strOptionalParam => "$strLogReduced --" . cfgOptionName(CFGOPT_PROCESS_MAX) . '=1'}); # Incr Backup - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_INCR; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; $oHostDbMaster->manifestReference(\%oManifest, $strBackup); # Delete the backup.info and make sure the backup fails - the user must then run a stanza-create --force @@ -926,16 +927,16 @@ sub run # Fail on attempt to create the stanza data since force was not used $oHostBackup->stanzaCreate('fail on backup directory missing backup.info', - {iExpectedExitStatus => ERROR_FILE_MISSING, strOptionalParam => '--no-' . OPTION_ONLINE}); + {iExpectedExitStatus => ERROR_FILE_MISSING, strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Use force to create the stanza $oHostBackup->stanzaCreate('create required data for stanza', - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); } else { $oHostBackup->stanzaCreate('create required data for stanza', - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); } # Perform the backup @@ -943,25 +944,25 @@ sub run $strType, 'update files', {oExpectedManifest => \%oManifest, strOptionalParam => $strLogReduced}); # Diff Backup - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_DIFF; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_DIFF; $oHostDbMaster->manifestReference(\%oManifest, $strFullBackup, true); $strBackup = $oHostBackup->backup( $strType, 'updates since last full', {oExpectedManifest => \%oManifest, - strOptionalParam => "$strLogReduced --" . OPTION_PROCESS_MAX . '=1'}); + strOptionalParam => "$strLogReduced --" . cfgOptionName(CFGOPT_PROCESS_MAX) . '=1'}); # Incr Backup # # Remove a file from the db after the manifest has been built but before files are copied. The file will not be shown # as removed in the log because it had not changed since the last backup so it will only be referenced. This test also # checks that everything works when there are no jobs to run. - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_INCR; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; $oHostDbMaster->manifestReference(\%oManifest, $strBackup); # Enable compression to ensure a warning is raised - $oHostBackup->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_COMPRESS => 'y'}}); + $oHostBackup->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_COMPRESS) => 'y'}}); my $oBackupExecute = $oHostBackup->backupBegin( $strType, 'remove files - but won\'t affect manifest', @@ -976,10 +977,10 @@ sub run # # Remove base2.txt and changed tablespace2c.txt during the backup. The removed file should be logged and the changed # file should have the new, larger size logged and in the manifest. - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- $oHostDbMaster->manifestReference(\%oManifest, $strFullBackup, true); - $strType = BACKUP_TYPE_DIFF; + $strType = CFGOPTVAL_BACKUP_TYPE_DIFF; $oHostDbMaster->manifestFileRemove(\%oManifest, MANIFEST_TARGET_PGDATA, 'base/16384/17000'); @@ -991,13 +992,13 @@ sub run # Enable hardlinks (except for s3) to ensure a warning is raised if (!$bS3) { - $oHostBackup->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_HARDLINK => 'y'}}); + $oHostBackup->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_HARDLINK) => 'y'}}); } $oBackupExecute = $oHostBackup->backupBegin( $strType, 'remove files during backup', {oExpectedManifest => \%oManifest, strTest => TEST_MANIFEST_BUILD, fTestDelay => 1, - strOptionalParam => "$strLogReduced --" . OPTION_PROCESS_MAX . '=1'}); + strOptionalParam => "$strLogReduced --" . cfgOptionName(CFGOPT_PROCESS_MAX) . '=1'}); $oHostDbMaster->manifestFileCreate( \%oManifest, MANIFEST_TARGET_PGTBLSPC . '/2', '32768/tablespace2c.txt', 'TBLSPCBIGGER', @@ -1008,8 +1009,8 @@ sub run $strBackup = $oHostBackup->backupEnd($strType, $oBackupExecute, {oExpectedManifest => \%oManifest}); # Full Backup - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_FULL; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_FULL; # Now the compression and hardlink changes will take effect $oManifest{&MANIFEST_SECTION_BACKUP_OPTION}{&MANIFEST_KEY_COMPRESS} = JSON::PP::true; @@ -1032,17 +1033,17 @@ sub run $strType, 'update file', {oExpectedManifest => \%oManifest, strOptionalParam => $strLogReduced}); # Backup Info - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- $oHostDbMaster->info('normal output', {strStanza => $oHostDbMaster->stanza()}); - $oHostBackup->info('normal output', {strStanza => $oHostBackup->stanza(), strOutput => INFO_OUTPUT_JSON}); + $oHostBackup->info('normal output', {strStanza => $oHostBackup->stanza(), strOutput => CFGOPTVAL_INFO_OUTPUT_JSON}); # Call expire - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- $oHostBackup->expire({iRetentionFull => 1}); # Diff Backup - #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_DIFF; + #--------------------------------------------------------------------------------------------------------------------------- + $strType = CFGOPTVAL_BACKUP_TYPE_DIFF; $oHostDbMaster->manifestReference(\%oManifest, $strFullBackup); @@ -1057,10 +1058,10 @@ sub run $strBackup = $oHostBackup->backup( $strType, 'add file', {oExpectedManifest => \%oManifest, - strOptionalParam => "${strLogReduced} --" . OPTION_CHECKSUM_PAGE}); + strOptionalParam => "${strLogReduced} --" . cfgOptionName(CFGOPT_CHECKSUM_PAGE)}); # Selective Restore - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- $bDelta = true; # Remove mapping for tablespace 1 @@ -1075,8 +1076,8 @@ sub run {&MANIFEST_SUBKEY_CHECKSUM}); $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, \%oManifest, \%oRemapHash, $bDelta, $bForce, undef, undef, undef, undef, undef, undef, - 'selective restore 16384', undef, "${strLogReduced} --db-include=16384"); + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), \%oManifest, \%oRemapHash, $bDelta, $bForce, undef, undef, undef, + undef, undef, undef, 'selective restore 16384', undef, "${strLogReduced} --db-include=16384"); # Restore checksum values for next test $oManifest{&MANIFEST_SECTION_TARGET_FILE}{'pg_data/base/32768/33000'}{&MANIFEST_SUBKEY_CHECKSUM} = @@ -1092,23 +1093,22 @@ sub run delete($oManifest{&MANIFEST_SECTION_TARGET_FILE}{'pg_data/base/16384/17000'}{&MANIFEST_SUBKEY_CHECKSUM}); $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, \%oManifest, \%oRemapHash, $bDelta, $bForce, undef, undef, undef, undef, undef, undef, - 'selective restore 32768', undef, "${strLogReduced} --db-include=32768"); + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), \%oManifest, \%oRemapHash, $bDelta, $bForce, undef, undef, undef, + undef, undef, undef, 'selective restore 32768', undef, "${strLogReduced} --db-include=32768"); $oManifest{&MANIFEST_SECTION_TARGET_FILE}{'pg_data/base/16384/17000'}{&MANIFEST_SUBKEY_CHECKSUM} = '7579ada0808d7f98087a0a586d0df9de009cdc33'; $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, \%oManifest, \%oRemapHash, - $bDelta, $bForce, undef, undef, undef, undef, undef, undef, - 'error on invalid id', ERROR_DB_MISSING, '--log-level-console=warn --db-include=7777'); + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), \%oManifest, \%oRemapHash, $bDelta, $bForce, undef, undef, undef, + undef, undef, undef, 'error on invalid id', ERROR_DB_MISSING, '--log-level-console=warn --db-include=7777'); $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, \%oManifest, \%oRemapHash, $bDelta, $bForce, undef, undef, undef, undef, undef, undef, - 'error on system id', ERROR_DB_INVALID, '--log-level-console=warn --db-include=1'); + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), \%oManifest, \%oRemapHash, $bDelta, $bForce, undef, undef, undef, + undef, undef, undef, 'error on system id', ERROR_DB_INVALID, '--log-level-console=warn --db-include=1'); # Compact Restore - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- $bDelta = false; executeTest('rm -rf ' . $oHostDbMaster->dbBasePath(2) . "/*"); @@ -1120,33 +1120,33 @@ sub run delete($oRemapHash{&MANIFEST_TARGET_PGTBLSPC . '/2'}); $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, \%oManifest, \%oRemapHash, $bDelta, $bForce, undef, undef, undef, undef, undef, undef, - 'no tablespace remap - error when tablespace dir does not exist', ERROR_PATH_MISSING, + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), \%oManifest, \%oRemapHash, $bDelta, $bForce, undef, undef, undef, + undef, undef, undef, 'no tablespace remap - error when tablespace dir does not exist', ERROR_PATH_MISSING, "${strLogReduced} --tablespace-map-all=../../tablespace", false); storageTest()->pathCreate($oHostDbMaster->dbBasePath(2) . '/tablespace', {strMode => '0700'}); $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, \%oManifest, undef, $bDelta, $bForce, undef, undef, undef, undef, undef, undef, - 'no tablespace remap', undef, "--tablespace-map-all=../../tablespace ${strLogReduced}", false); + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), \%oManifest, undef, $bDelta, $bForce, undef, undef, undef, undef, + undef, undef, 'no tablespace remap', undef, "--tablespace-map-all=../../tablespace ${strLogReduced}", false); $oManifest{&MANIFEST_SECTION_BACKUP_TARGET}{'pg_tblspc/2'}{&MANIFEST_SUBKEY_PATH} = '../../tablespace/ts2'; $oManifest{&MANIFEST_SECTION_TARGET_LINK}{'pg_data/pg_tblspc/2'}{&MANIFEST_SUBKEY_DESTINATION} = '../../tablespace/ts2'; # Backup Info (with an empty stanza) - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- forceStorageMode(storageRepo(), 'backup', 'g+w'); storageRepo()->pathCreate(storageRepo()->pathGet('backup/db_empty'), {strMode => '0770'}); $oHostBackup->info('normal output'); - $oHostDbMaster->info('normal output', {strOutput => INFO_OUTPUT_JSON}); + $oHostDbMaster->info('normal output', {strOutput => CFGOPTVAL_INFO_OUTPUT_JSON}); $oHostBackup->info('bogus stanza', {strStanza => BOGUS}); - $oHostDbMaster->info('bogus stanza', {strStanza => BOGUS, strOutput => INFO_OUTPUT_JSON}); + $oHostDbMaster->info('bogus stanza', {strStanza => BOGUS, strOutput => CFGOPTVAL_INFO_OUTPUT_JSON}); # Dump out history path at the end to verify all history files are being recorded. This test is only performed locally # because for some reason sort order is different when this command is executed via ssh (even though the content of the # directory is identical). - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- if (!$bRemote) { executeTest('ls -1R ' . storageRepo()->pathGet('backup/' . $self->stanza() . '/' . PATH_BACKUP_HISTORY), @@ -1154,7 +1154,7 @@ sub run } # Test config file validation - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- if ($bRemote) { # Save off config file and add an invalid option to the remote (DB master) and confirm no warning thrown @@ -1184,12 +1184,12 @@ sub run } # Test backup from standby warning that standby not configured so option reset - #----------------------------------------------------------------------------------------------------------------------- + #--------------------------------------------------------------------------------------------------------------------------- if (!defined($oHostDbStandby)) { $strBackup = $oHostBackup->backup( $strType, 'option backup-standby reset - backup performed from master', {oExpectedManifest => \%oManifest, - strOptionalParam => '--log-level-console=info --' . OPTION_BACKUP_STANDBY}); + strOptionalParam => '--log-level-console=info --' . cfgOptionName(CFGOPT_BACKUP_STANDBY)}); } } } diff --git a/test/lib/pgBackRestTest/Module/Mock/MockArchiveTest.pm b/test/lib/pgBackRestTest/Module/Mock/MockArchiveTest.pm index 8dbacbb36..97e7bec1a 100644 --- a/test/lib/pgBackRestTest/Module/Mock/MockArchiveTest.pm +++ b/test/lib/pgBackRestTest/Module/Mock/MockArchiveTest.pm @@ -91,19 +91,19 @@ sub run true, $self->expect(), {bHostBackup => $bRemote, bCompress => false, bS3 => $bS3}); # Reduce console logging to detail - $oHostDbMaster->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_LOG_LEVEL_CONSOLE => lc(DETAIL)}}); - my $strLogDebug = '--' . OPTION_LOG_LEVEL_CONSOLE . qw{=} . lc(DEBUG); + $oHostDbMaster->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE) => lc(DETAIL)}}); + my $strLogDebug = '--' . cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE) . qw{=} . lc(DEBUG); # If S3 set process max to 2. This seems like the best place for parallel testing since it will help speed S3 processing # without slowing down the other tests too much. if ($bS3) { - $oHostBackup->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_PROCESS_MAX => 2}}); - $oHostDbMaster->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_PROCESS_MAX => 2}}); + $oHostBackup->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_PROCESS_MAX) => 2}}); + $oHostDbMaster->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_PROCESS_MAX) => 2}}); # Reduce console logging to warn (even for debug exceptions) - $oHostDbMaster->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_LOG_LEVEL_CONSOLE => lc(WARN)}}); - $strLogDebug = '--' . OPTION_LOG_LEVEL_CONSOLE . qw{=} . lc(WARN); + $oHostDbMaster->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE) => lc(WARN)}}); + $strLogDebug = '--' . cfgOptionName(CFGOPT_LOG_LEVEL_CONSOLE) . qw{=} . lc(WARN); } # Create the xlog path @@ -121,11 +121,11 @@ sub run # Create archive-push command my $strCommandPush = $oHostDbMaster->backrestExe() . ' --config=' . $oHostDbMaster->backrestConfig() . ' --stanza=' . $self->stanza() . - ' ' . CMD_ARCHIVE_PUSH; + ' ' . cfgCommandName(CFGCMD_ARCHIVE_PUSH); my $strCommandGet = $oHostDbMaster->backrestExe() . ' --config=' . $oHostDbMaster->backrestConfig() . ' --stanza=' . $self->stanza() . - ' ' . CMD_ARCHIVE_GET; + ' ' . cfgCommandName(CFGCMD_ARCHIVE_GET); #--------------------------------------------------------------------------------------------------------------------------- &log(INFO, ' archive.info missing'); @@ -142,7 +142,9 @@ sub run {iExpectedExitStatus => ERROR_FILE_MISSING, oLogTest => $self->expect()}); #--------------------------------------------------------------------------------------------------------------------------- - $oHostBackup->stanzaCreate('stanza create', {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + $oHostBackup->stanzaCreate( + 'stanza create', + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); #--------------------------------------------------------------------------------------------------------------------------- &log(INFO, ' push first WAL'); diff --git a/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm b/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm index 856cb67aa..0fc4d11db 100644 --- a/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm +++ b/test/lib/pgBackRestTest/Module/Mock/MockStanzaTest.pm @@ -53,7 +53,7 @@ sub run # Create the stanza $oHostBackup->stanzaCreate('fail on missing control file', {iExpectedExitStatus => ERROR_FILE_OPEN, - strOptionalParam => '--no-' . OPTION_ONLINE}); + strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Create the test path for pg_control storageDb()->pathCreate(($oHostDbMaster->dbBasePath() . '/' . DB_PATH_GLOBAL), {bCreateParent => true}); @@ -66,16 +66,19 @@ sub run # Fail stanza upgrade before stanza-create has been performed #-------------------------------------------------------------------------------------------------------------------------- $oHostBackup->stanzaUpgrade('fail on stanza not initialized since archive.info is missing', - {iExpectedExitStatus => ERROR_FILE_MISSING, strOptionalParam => '--no-' . OPTION_ONLINE}); + {iExpectedExitStatus => ERROR_FILE_MISSING, strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); - $oHostBackup->stanzaCreate('successfully create the stanza', {strOptionalParam => '--no-' . OPTION_ONLINE}); + # Create the stanza successfully without force + #-------------------------------------------------------------------------------------------------------------------------- + $oHostBackup->stanzaCreate('successfully create the stanza', {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Rerun stanza-create and confirm success without the need to use force on empty directories - $oHostBackup->stanzaCreate('successful rerun of stanza-create', {strOptionalParam => '--no-' . OPTION_ONLINE}); + $oHostBackup->stanzaCreate( + 'successful rerun of stanza-create', {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Perform a stanza upgrade which will indicate already up to date #-------------------------------------------------------------------------------------------------------------------------- - $oHostBackup->stanzaUpgrade('already up to date', {strOptionalParam => '--no-' . OPTION_ONLINE}); + $oHostBackup->stanzaUpgrade('already up to date', {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Create the xlog path my $strXlogPath = $oHostDbMaster->dbBasePath() . '/pg_xlog'; @@ -94,7 +97,7 @@ sub run forceStorageRemove(storageRepo(), STORAGE_REPO_ARCHIVE . qw{/} . ARCHIVE_INFO_FILE . INI_COPY_EXT); $oHostBackup->stanzaCreate('fail on archive info file missing from non-empty dir', - {iExpectedExitStatus => ERROR_FILE_MISSING, strOptionalParam => '--no-' . OPTION_ONLINE}); + {iExpectedExitStatus => ERROR_FILE_MISSING, strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Stanza Create fails using force - failure to unzip compressed file #-------------------------------------------------------------------------------------------------------------------------- @@ -109,7 +112,8 @@ sub run # Force creation of the info file but fail on gunzip $oHostBackup->stanzaCreate('gunzip fail on forced stanza-create', - {iExpectedExitStatus => ERROR_FILE_OPEN, strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {iExpectedExitStatus => ERROR_FILE_OPEN, strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . + cfgOptionName(CFGOPT_FORCE)}); # Change permissions back forceStorageMode( @@ -122,11 +126,11 @@ sub run #-------------------------------------------------------------------------------------------------------------------------- # Force creation of archive info from the gz file $oHostBackup->stanzaCreate('force create archive.info from gz file', - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); # Rerun without the force to ensure the format is still valid - this will hash check the info files and indicate the # stanza already exists - $oHostBackup->stanzaCreate('repeat create', {strOptionalParam => '--no-' . OPTION_ONLINE}); + $oHostBackup->stanzaCreate('repeat create', {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Stanza Create fails when not using force - hash check failure #-------------------------------------------------------------------------------------------------------------------------- @@ -136,10 +140,10 @@ sub run {&INFO_BACKUP_SECTION_DB => {&INFO_BACKUP_KEY_DB_VERSION => '8.0'}}); $oHostBackup->stanzaCreate('hash check fails requiring force', - {iExpectedExitStatus => ERROR_FILE_INVALID, strOptionalParam => '--no-' . OPTION_ONLINE}); + {iExpectedExitStatus => ERROR_FILE_INVALID, strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); $oHostBackup->stanzaCreate('use force to overwrite the invalid file', - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); # Cleanup the global hash but don't save the file (permission issues may prevent it anyway) $oHostBackup->infoRestore(storageRepo()->pathGet(STORAGE_REPO_ARCHIVE . qw{/} . ARCHIVE_INFO_FILE), false); @@ -153,7 +157,7 @@ sub run $oHostDbMaster->dbBasePath() . '/' . DB_FILE_PGCONTROL); $oHostBackup->stanzaCreate('fail on database mismatch without force option', - {iExpectedExitStatus => ERROR_FILE_INVALID, strOptionalParam => '--no-' . OPTION_ONLINE}); + {iExpectedExitStatus => ERROR_FILE_INVALID, strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Restore pg_control storageDb()->remove($oHostDbMaster->dbBasePath() . '/' . DB_FILE_PGCONTROL); @@ -177,7 +181,7 @@ sub run STORAGE_REPO_ARCHIVE . "/${strArchiveTest}"); $oHostBackup->stanzaCreate('force create archive.info from uncompressed file', - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); # Stanza Create succeeds when using force - missing archive file #-------------------------------------------------------------------------------------------------------------------------- @@ -187,7 +191,7 @@ sub run forceStorageRemove(storageRepo(), STORAGE_REPO_ARCHIVE . qw{/} . ARCHIVE_INFO_FILE . INI_COPY_EXT); $oHostBackup->stanzaCreate('force with missing WAL archive file', - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); # Stanza Create succeeds when using force - missing archive directory #-------------------------------------------------------------------------------------------------------------------------- @@ -199,7 +203,7 @@ sub run forceStorageRemove(storageRepo(), STORAGE_REPO_ARCHIVE . qw{/} . ARCHIVE_INFO_FILE . INI_COPY_EXT); $oHostBackup->stanzaCreate('force with missing WAL archive directory', - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); # Fail on archive push due to mismatch of DB since stanza not upgraded #-------------------------------------------------------------------------------------------------------------------------- @@ -217,7 +221,7 @@ sub run # Perform a successful stanza upgrade noting additional history lines in info files for new version of the database #-------------------------------------------------------------------------------------------------------------------------- $oHostBackup->stanzaUpgrade('successful upgrade creates additional history', {strOptionalParam => '--no-' . - OPTION_ONLINE}); + cfgOptionName(CFGOPT_ONLINE)}); # After stanza upgrade, make sure archives are pushed to the new db verion-id directory (9.4-2) #-------------------------------------------------------------------------------------------------------------------------- @@ -235,7 +239,7 @@ sub run forceStorageRemove(storageRepo(), STORAGE_REPO_ARCHIVE . qw{/} . ARCHIVE_INFO_FILE . INI_COPY_EXT); $oHostBackup->stanzaCreate('use force to recreate the stanza producing mismatched info history but same current db-id', - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); # Create a DB-ID mismatch between the info files #-------------------------------------------------------------------------------------------------------------------------- @@ -243,14 +247,15 @@ sub run forceStorageRemove(storageRepo(), STORAGE_REPO_BACKUP . qw{/} . FILE_BACKUP_INFO . INI_COPY_EXT); $oHostBackup->stanzaCreate('use force to recreate the stanza producing mismatched db-id', - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); # Confirm successful backup at db-1 although archive at db-2 #-------------------------------------------------------------------------------------------------------------------------- # Create the tablespace directory and perform a backup storageTest()->pathCreate($oHostDbMaster->dbBasePath() . '/' . DB_PATH_PGTBLSPC); - $oHostBackup->backup('full', 'create first full backup ', {strOptionalParam => '--retention-full=2 --no-' . - OPTION_ONLINE . ' --log-level-console=detail'}, false); + $oHostBackup->backup( + 'full', 'create first full backup ', + {strOptionalParam => '--retention-full=2 --no-' . cfgOptionName(CFGOPT_ONLINE) . ' --log-level-console=detail'}, false); # Stanza Create fails when not using force - no backup.info but backup exists #-------------------------------------------------------------------------------------------------------------------------- @@ -258,12 +263,12 @@ sub run forceStorageRemove(storageRepo(), STORAGE_REPO_BACKUP . qw{/} . FILE_BACKUP_INFO . INI_COPY_EXT); $oHostBackup->stanzaCreate('fail no force to recreate the stanza from backups', - {iExpectedExitStatus => ERROR_FILE_MISSING, strOptionalParam => '--no-' . OPTION_ONLINE}); + {iExpectedExitStatus => ERROR_FILE_MISSING, strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Stanza Create succeeds using force - reconstruct backup.info from backup #-------------------------------------------------------------------------------------------------------------------------- $oHostBackup->stanzaCreate('use force to recreate the stanza from backups', - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); # Test archive dir version XX.Y-Z ensuring sort order of db ids is reconstructed correctly from the directory db-id value #-------------------------------------------------------------------------------------------------------------------------- @@ -281,7 +286,8 @@ sub run $oHostDbMaster->dbBasePath() . '/' . DB_FILE_PGCONTROL); forceStorageMode(storageDb(), $oHostDbMaster->dbBasePath() . '/' . DB_FILE_PGCONTROL, '600'); - $oHostBackup->stanzaUpgrade('successfully upgrade with XX.Y-Z', {strOptionalParam => '--no-' . OPTION_ONLINE}); + $oHostBackup->stanzaUpgrade( + 'successfully upgrade with XX.Y-Z', {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Push a WAL and create a backup in the new DB to confirm diff changed to full and info command displays the JSON correctly #-------------------------------------------------------------------------------------------------------------------------- @@ -289,11 +295,11 @@ sub run # Test backup is changed from type=DIFF to FULL (WARN message displayed) my $oExecuteBackup = $oHostBackup->backupBegin('diff', 'diff changed to full backup', - {strOptionalParam => '--retention-full=2 --no-' . OPTION_ONLINE . ' --log-level-console=detail'}); + {strOptionalParam => '--retention-full=2 --no-' . cfgOptionName(CFGOPT_ONLINE) . ' --log-level-console=detail'}); $oHostBackup->backupEnd('full', $oExecuteBackup, undef, false); # Confirm info command displays the JSON correctly - $oHostDbMaster->info('db upgraded - db-1 and db-2 listed', {strOutput => INFO_OUTPUT_JSON}); + $oHostDbMaster->info('db upgraded - db-1 and db-2 listed', {strOutput => CFGOPTVAL_INFO_OUTPUT_JSON}); } } } diff --git a/test/lib/pgBackRestTest/Module/Performance/PerformanceArchiveTest.pm b/test/lib/pgBackRestTest/Module/Performance/PerformanceArchiveTest.pm index 7325c812b..8bda47595 100644 --- a/test/lib/pgBackRestTest/Module/Performance/PerformanceArchiveTest.pm +++ b/test/lib/pgBackRestTest/Module/Performance/PerformanceArchiveTest.pm @@ -63,8 +63,10 @@ sub run for (my $iIndex = 0; $iIndex < $iRunTotal; $iIndex++) { executeTest( - $self->backrestExe() . ' --' . OPTION_STANZA . '=' . $self->stanza() . ' --' . OPTION_ARCHIVE_ASYNC . - ' --' . OPTION_SPOOL_PATH . '=' . $self->{strSpoolPath} . ' --' . OPTION_ARCHIVE_TIMEOUT . '=1' . + $self->backrestExe() . ' --' . cfgOptionName(CFGOPT_STANZA) . '=' . $self->stanza() . + ' --' . cfgOptionName(CFGOPT_ARCHIVE_ASYNC) . + ' --' . cfgOptionName(CFGOPT_SPOOL_PATH) . '=' . $self->{strSpoolPath} . + ' --' . cfgOptionName(CFGOPT_ARCHIVE_TIMEOUT) . '=1' . ' archive-push /pg_xlog/000000010000000100000001'); } diff --git a/test/lib/pgBackRestTest/Module/Protocol/ProtocolHelperTest.pm b/test/lib/pgBackRestTest/Module/Protocol/ProtocolHelperTest.pm index 80e3ab34a..cf4a9532c 100644 --- a/test/lib/pgBackRestTest/Module/Protocol/ProtocolHelperTest.pm +++ b/test/lib/pgBackRestTest/Module/Protocol/ProtocolHelperTest.pm @@ -17,13 +17,9 @@ use Storable qw(dclone); use pgBackRest::Archive::Common; use pgBackRest::Archive::Push::Push; -use pgBackRest::Archive::Push::Async; -use pgBackRest::Archive::Push::File; use pgBackRest::Common::Exception; -use pgBackRest::Common::Lock; use pgBackRest::Common::Log; use pgBackRest::Config::Config; -use pgBackRest::DbVersion; use pgBackRest::Protocol::Helper; use pgBackRest::Protocol::Storage::Helper; use pgBackRest::Storage::Helper; @@ -41,12 +37,8 @@ sub initModule my $self = shift; $self->{strDbPath} = $self->testPath() . '/db'; - $self->{strWalPath} = "$self->{strDbPath}/pg_xlog"; - $self->{strWalStatusPath} = "$self->{strWalPath}/archive_status"; - $self->{strWalHash} = "1e34fa1c833090d94b9bb14f2a8d3153dca6ea27"; $self->{strRepoPath} = $self->testPath() . '/repo'; $self->{strArchivePath} = "$self->{strRepoPath}/archive/" . $self->stanza(); - $self->{strSpoolPath} = "$self->{strArchivePath}/out"; } #################################################################################################################################### @@ -56,18 +48,10 @@ sub initTest { my $self = shift; - # Create WAL path - storageTest()->pathCreate($self->{strWalStatusPath}, {bIgnoreExists => true, bCreateParent => true}); - # Create archive info storageTest()->pathCreate($self->{strArchivePath}, {bIgnoreExists => true, bCreateParent => true}); - my $oOption = $self->initOption(); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); - my $oArchiveInfo = new pgBackRest::Archive::Info($self->{strArchivePath}, false, {bIgnoreMissing => true}); - $oArchiveInfo->create(PG_VERSION_94, WAL_VERSION_94_SYS_ID, true); - - $self->{strArchiveId} = $oArchiveInfo->archiveId(); + $self->initOption(); } #################################################################################################################################### @@ -77,19 +61,15 @@ sub initOption { my $self = shift; - my $oOption = {}; + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, $self->{strDbPath}); + $self->optionTestSet(CFGOPT_REPO_PATH, $self->{strRepoPath}); + $self->optionTestSet(CFGOPT_LOG_PATH, $self->testPath()); + $self->optionTestSetBool(CFGOPT_COMPRESS, false); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, $self->{strDbPath}); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $self->{strRepoPath}); - $self->optionSetTest($oOption, OPTION_LOG_PATH, $self->testPath()); - $self->optionBoolSetTest($oOption, OPTION_COMPRESS, false); - - $self->optionSetTest($oOption, OPTION_DB_TIMEOUT, 5); - $self->optionSetTest($oOption, OPTION_PROTOCOL_TIMEOUT, 6); - $self->optionSetTest($oOption, OPTION_ARCHIVE_TIMEOUT, 3); - - return $oOption; + $self->optionTestSet(CFGOPT_DB_TIMEOUT, 5); + $self->optionTestSet(CFGOPT_PROTOCOL_TIMEOUT, 6); + $self->optionTestSet(CFGOPT_ARCHIVE_TIMEOUT, 3); } #################################################################################################################################### @@ -104,28 +84,26 @@ sub run ################################################################################################################################ if ($self->begin("Protocol::Helper")) { - $self->optionSetTest($oOption, OPTION_BACKUP_HOST, 'localhost'); - $self->optionSetTest($oOption, OPTION_BACKUP_USER, $self->pgUser()); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_BACKUP_HOST, 'localhost'); + $self->optionTestSet(CFGOPT_BACKUP_USER, $self->pgUser()); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); - $self->testResult(sub {protocolGet(BACKUP, undef, {strBackRestBin => $self->backrestExe()})}, "[object]", - 'ssh default port'); + $self->testResult( + sub {protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP, undef, {strBackRestBin => $self->backrestExe()})}, "[object]", + 'ssh default port'); # Destroy protocol object protocolDestroy(); - $self->optionSetTest($oOption, OPTION_BACKUP_SSH_PORT, 25); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH); logEnable(); + $self->optionTestSet(CFGOPT_BACKUP_SSH_PORT, 25); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); - $self->testException(sub {protocolGet(BACKUP, undef, {strBackRestBin => $self->backrestExe()})}, ERROR_FILE_READ, - "process 'localhost remote' terminated unexpectedly: ssh: connect to host localhost port 25:"); + $self->testException( + sub {protocolGet(CFGOPTVAL_REMOTE_TYPE_BACKUP, undef, {strBackRestBin => $self->backrestExe()})}, ERROR_FILE_READ, + "process 'localhost remote' terminated unexpectedly: ssh: connect to host localhost port 25:"); # Destroy protocol object protocolDestroy(); - - $self->optionReset($oOption, OPTION_BACKUP_HOST); - $self->optionReset($oOption, OPTION_BACKUP_USER); - $self->optionReset($oOption, OPTION_BACKUP_SSH_PORT); } } diff --git a/test/lib/pgBackRestTest/Module/Real/RealAllTest.pm b/test/lib/pgBackRestTest/Module/Real/RealAllTest.pm index 81e9d008f..0babddf49 100644 --- a/test/lib/pgBackRestTest/Module/Real/RealAllTest.pm +++ b/test/lib/pgBackRestTest/Module/Real/RealAllTest.pm @@ -102,8 +102,8 @@ sub run # without slowing down the other tests too much. if ($bS3) { - $oHostBackup->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_PROCESS_MAX => 2}}); - $oHostDbMaster->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_PROCESS_MAX => 2}}); + $oHostBackup->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_PROCESS_MAX) => 2}}); + $oHostDbMaster->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_PROCESS_MAX) => 2}}); } $oHostDbMaster->clusterCreate(); @@ -147,7 +147,7 @@ sub run #--------------------------------------------------------------------------------------------------------------------------- if ($bTestExtra) { - $strType = BACKUP_TYPE_FULL; + $strType = CFGOPTVAL_BACKUP_TYPE_FULL; # Remove the files in the archive directory forceStorageRemove(storageRepo(), STORAGE_REPO_ARCHIVE, {bRecurse => true}); @@ -157,7 +157,7 @@ sub run {iTimeout => 0.1, iExpectedExitStatus => ERROR_FILE_MISSING}); # Backup.info was created earlier so force stanza-create to create archive info file - $oHostBackup->stanzaCreate('force create stanza info files', {strOptionalParam => ' --' . OPTION_FORCE}); + $oHostBackup->stanzaCreate('force create stanza info files', {strOptionalParam => ' --' . cfgOptionName(CFGOPT_FORCE)}); # Check ERROR_ARCHIVE_DISABLED error $strComment = 'fail on archive_mode=off'; @@ -293,7 +293,7 @@ sub run } # Force the backup.info file to be recreated - $oHostBackup->stanzaCreate('verify success with force', {strOptionalParam => ' --' . OPTION_FORCE}); + $oHostBackup->stanzaCreate('verify success with force', {strOptionalParam => ' --' . cfgOptionName(CFGOPT_FORCE)}); # Remove the backup info file forceStorageRemove(storageRepo(), STORAGE_REPO_BACKUP . qw{/} . FILE_BACKUP_INFO); @@ -318,15 +318,16 @@ sub run # Run stanza-create online to confirm proper handling of configValidation error against new db-path $oHostBackup->stanzaCreate('fail on database mismatch with directory', - {strOptionalParam => ' --' . OPTION_DB_PATH . '=' . $oHostDbMaster->dbPath() . '/testbase/', - iExpectedExitStatus => ERROR_DB_MISMATCH}); + {strOptionalParam => ' --' . $oHostBackup->optionIndexName(CFGOPT_DB_PATH, 1) . '=' . $oHostDbMaster->dbPath() . + '/testbase/', iExpectedExitStatus => ERROR_DB_MISMATCH}); # Stanza Upgrade - tests configValidate code - all other tests in synthetic integration tests #----------------------------------------------------------------------------------------------------------------------- # Run stanza-create offline with --force to create files needing to be upgraded (using new db-path) $oHostBackup->stanzaCreate('successfully create stanza files to be upgraded', - {strOptionalParam => ' --' . OPTION_DB_PATH . '=' . $oHostDbMaster->dbPath() . '/testbase/ --no-' . OPTION_ONLINE . - ' --' . OPTION_FORCE}); + {strOptionalParam => + ' --' . $oHostBackup->optionIndexName(CFGOPT_DB_PATH, 1) . '=' . $oHostDbMaster->dbPath() . + '/testbase/ --no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); my $oAchiveInfo = new pgBackRest::Archive::Info(storageRepo()->pathGet('archive/' . $self->stanza())); my $oBackupInfo = new pgBackRest::Backup::Info(storageRepo()->pathGet('backup/' . $self->stanza())); @@ -360,7 +361,7 @@ sub run # Full backup #--------------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_FULL; + $strType = CFGOPTVAL_BACKUP_TYPE_FULL; # Create the table where test messages will be stored $oHostDbMaster->sqlExecute("create table test (message text not null)"); @@ -387,7 +388,7 @@ sub run my $oExecuteBackup = $oHostBackup->backupBegin( $strType, 'update during backup', {strTest => TEST_MANIFEST_BUILD, fTestDelay => $fTestDelay, - strOptionalParam => ' --' . OPTION_BUFFER_SIZE . '=16384'}); + strOptionalParam => ' --' . cfgOptionName(CFGOPT_BUFFER_SIZE) . '=16384'}); $oHostDbMaster->sqlExecute("update test set message = '$strFullMessage'"); @@ -397,7 +398,7 @@ sub run my $strFullBackup = $oHostBackup->backupEnd($strType, $oExecuteBackup); # Enabled async archiving - $oHostBackup->configUpdate({&CONFIG_SECTION_GLOBAL => {&OPTION_ARCHIVE_ASYNC => 'y'}}); + $oHostBackup->configUpdate({&CFGDEF_SECTION_GLOBAL => {cfgOptionName(CFGOPT_ARCHIVE_ASYNC) => 'y'}}); # Kick out a bunch of archive logs to excercise async archiving. Only do this when compressed and remote to slow it # down enough to make it evident that the async process is working. @@ -422,7 +423,7 @@ sub run { $bDelta = false; $bForce = false; - $strType = RECOVERY_TYPE_DEFAULT; + $strType = CFGOPTVAL_RESTORE_TYPE_DEFAULT; $strTarget = undef; $bTargetExclusive = undef; $strTargetAction = undef; @@ -442,8 +443,8 @@ sub run } $oHostDbStandby->restore( - OPTION_DEFAULT_RESTORE_SET, undef, \%oRemapHash, $bDelta, $bForce, $strType, $strTarget, $bTargetExclusive, - $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus, + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), undef, \%oRemapHash, $bDelta, $bForce, $strType, $strTarget, + $bTargetExclusive, $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus, ' --recovery-option=standby_mode=on' . ' --recovery-option="primary_conninfo=host=' . HOST_DB_MASTER . ' port=' . $oHostDbMaster->pgPort() . ' user=replicator"'); @@ -461,10 +462,10 @@ sub run $oHostDbMaster->sqlExecute("update test set message = '$strStandbyMessage'"); my $strStandbyBackup = $oHostBackup->backup( - BACKUP_TYPE_FULL, 'backup from standby', + CFGOPTVAL_BACKUP_TYPE_FULL, 'backup from standby', {bStandby => true, iExpectedExitStatus => $oHostDbStandby->pgVersion() >= PG_VERSION_BACKUP_STANDBY ? undef : ERROR_CONFIG, - strOptionalParam => '--' . OPTION_RETENTION_FULL . '=1'}); + strOptionalParam => '--' . cfgOptionName(CFGOPT_RETENTION_FULL) . '=1'}); if ($oHostDbStandby->pgVersion() >= PG_VERSION_BACKUP_STANDBY) { @@ -484,7 +485,7 @@ sub run # the logs will to be deleted to avoid causing issues further down the line. if ($bTestExtra && !$bS3) { - $strType = BACKUP_TYPE_INCR; + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; $oHostDbMaster->clusterRestart(); @@ -506,7 +507,7 @@ sub run #--------------------------------------------------------------------------------------------------------------------------- if ($bTestLocal && $oHostDbMaster->pgVersion() >= PG_VERSION_95) { - $strType = BACKUP_TYPE_INCR; + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; # Set archive_mode=always $oHostDbMaster->clusterRestart({bArchiveAlways => true}); @@ -519,7 +520,7 @@ sub run # Incr backup #--------------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_INCR; + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; # Create a tablespace directory storageTest()->pathCreate($oHostDbMaster->tablespacePath(1), {strMode => '0700', bCreateParent => true}); @@ -562,8 +563,8 @@ sub run $oExecuteBackup = $oHostBackup->backupBegin( $strType, 'update during backup', {strTest => TEST_MANIFEST_BUILD, fTestDelay => $fTestDelay, - strOptionalParam => '--' . OPTION_STOP_AUTO . ' --no-' . OPTION_BACKUP_ARCHIVE_CHECK . - ' --' . OPTION_BUFFER_SIZE . '=32768'}); + strOptionalParam => '--' . cfgOptionName(CFGOPT_STOP_AUTO) . ' --no-' . cfgOptionName(CFGOPT_ARCHIVE_CHECK) . + ' --' . cfgOptionName(CFGOPT_BUFFER_SIZE) . '=32768'}); # Drop a table $oHostDbMaster->sqlExecute('drop table test_remove'); @@ -573,7 +574,7 @@ sub run # Check that application name is set if ($oHostDbMaster->pgVersion() >= PG_VERSION_APPLICATION_NAME) { - my $strApplicationNameExpected = BACKREST_NAME . ' [' . CMD_BACKUP . ']'; + my $strApplicationNameExpected = BACKREST_NAME . ' [' . cfgCommandName(CFGCMD_BACKUP) . ']'; my $strApplicationName = $oHostDbMaster->sqlSelectOne( "select application_name from pg_stat_activity where application_name like '" . BACKREST_NAME . "%'"); @@ -634,7 +635,7 @@ sub run #--------------------------------------------------------------------------------------------------------------------------- $bDelta = false; $bForce = false; - $strType = RECOVERY_TYPE_DEFAULT; + $strType = CFGOPTVAL_RESTORE_TYPE_DEFAULT; $strTarget = undef; $bTargetExclusive = undef; $strTargetAction = undef; @@ -650,8 +651,8 @@ sub run $iExpectedExitStatus = ERROR_POSTMASTER_RUNNING; $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, undef, undef, $bDelta, $bForce, $strType, $strTarget, $bTargetExclusive, - $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus); + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), undef, undef, $bDelta, $bForce, $strType, $strTarget, + $bTargetExclusive, $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus); } $oHostDbMaster->clusterStop(); @@ -663,8 +664,8 @@ sub run $iExpectedExitStatus = ERROR_PATH_NOT_EMPTY; $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, undef, undef, $bDelta, $bForce, $strType, $strTarget, $bTargetExclusive, - $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus); + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), undef, undef, $bDelta, $bForce, $strType, $strTarget, + $bTargetExclusive, $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus); } # Drop and recreate db path @@ -680,8 +681,8 @@ sub run $iExpectedExitStatus = undef; $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, undef, undef, $bDelta, $bForce, $strType, $strTarget, $bTargetExclusive, - $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus, + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), undef, undef, $bDelta, $bForce, $strType, $strTarget, + $bTargetExclusive, $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus, $bTestLocal ? ' --db-include=test1' : undef); $oHostDbMaster->clusterStart(); @@ -754,7 +755,7 @@ sub run { $bDelta = false; $bForce = true; - $strType = RECOVERY_TYPE_IMMEDIATE; + $strType = CFGOPTVAL_RESTORE_TYPE_IMMEDIATE; $strTarget = undef; $bTargetExclusive = undef; $strTargetAction = undef; @@ -782,7 +783,7 @@ sub run { $bDelta = false; $bForce = true; - $strType = RECOVERY_TYPE_XID; + $strType = CFGOPTVAL_RESTORE_TYPE_XID; $strTarget = $strXidTarget; $bTargetExclusive = undef; $strTargetAction = $oHostDbMaster->pgVersion() >= PG_VERSION_91 ? 'promote' : undef; @@ -819,7 +820,7 @@ sub run { $bDelta = false; $bForce = false; - $strType = RECOVERY_TYPE_PRESERVE; + $strType = CFGOPTVAL_RESTORE_TYPE_PRESERVE; $strTarget = undef; $bTargetExclusive = undef; $strTargetAction = undef; @@ -840,8 +841,8 @@ sub run storageDb()->move($self->testPath . '/recovery.conf', $oHostDbMaster->dbBasePath() . '/recovery.conf'); $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, undef, undef, $bDelta, $bForce, $strType, $strTarget, $bTargetExclusive, - $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus); + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), undef, undef, $bDelta, $bForce, $strType, $strTarget, + $bTargetExclusive, $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus); $oHostDbMaster->clusterStart(); $oHostDbMaster->sqlSelectOneTest('select message from test', $strXidMessage); @@ -854,7 +855,7 @@ sub run #--------------------------------------------------------------------------------------------------------------------------- $bDelta = true; $bForce = false; - $strType = RECOVERY_TYPE_TIME; + $strType = CFGOPTVAL_RESTORE_TYPE_TIME; $strTarget = $strTimeTarget; $bTargetExclusive = undef; $strTargetAction = undef; @@ -880,7 +881,7 @@ sub run { $bDelta = true; $bForce = false; - $strType = RECOVERY_TYPE_XID; + $strType = CFGOPTVAL_RESTORE_TYPE_XID; $strTarget = $strXidTarget; $bTargetExclusive = true; $strTargetAction = undef; @@ -907,7 +908,7 @@ sub run { $bDelta = true; $bForce = true; - $strType = RECOVERY_TYPE_NAME; + $strType = CFGOPTVAL_RESTORE_TYPE_NAME; $strTarget = $strNameTarget; $bTargetExclusive = undef; $strTargetAction = undef; @@ -921,8 +922,8 @@ sub run $oHostDbMaster->clusterStop(); $oHostDbMaster->restore( - OPTION_DEFAULT_RESTORE_SET, undef, undef, $bDelta, $bForce, $strType, $strTarget, $bTargetExclusive, - $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus); + cfgRuleOptionDefault(CFGCMD_RESTORE, CFGOPT_SET), undef, undef, $bDelta, $bForce, $strType, $strTarget, + $bTargetExclusive, $strTargetAction, $strTargetTimeline, $oRecoveryHashRef, $strComment, $iExpectedExitStatus); $oHostDbMaster->clusterStart(); $oHostDbMaster->sqlSelectOneTest('select message from test', $strNameMessage); @@ -934,7 +935,7 @@ sub run { $bDelta = true; $bForce = false; - $strType = RECOVERY_TYPE_DEFAULT; + $strType = CFGOPTVAL_RESTORE_TYPE_DEFAULT; $strTarget = undef; $bTargetExclusive = undef; $strTargetAction = undef; @@ -968,22 +969,20 @@ sub run # Incr backup - make sure a --no-online backup fails #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_INCR; + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; $oHostBackup->backup( - $strType, 'fail on --no-' . OPTION_ONLINE, - {iExpectedExitStatus => ERROR_POSTMASTER_RUNNING, strOptionalParam => '--no-' . OPTION_ONLINE}); + $strType, 'fail on --no-' . cfgOptionName(CFGOPT_ONLINE), + {iExpectedExitStatus => ERROR_POSTMASTER_RUNNING, strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE)}); # Incr backup - allow --no-online backup to succeed with --force #----------------------------------------------------------------------------------------------------------------------- - $strType = BACKUP_TYPE_INCR; + $strType = CFGOPTVAL_BACKUP_TYPE_INCR; $oHostBackup->backup( - $strType, 'succeed on --no-' . OPTION_ONLINE . ' with --' . OPTION_FORCE, - {strOptionalParam => '--no-' . OPTION_ONLINE . ' --' . OPTION_FORCE}); + $strType, 'succeed on --no-' . cfgOptionName(CFGOPT_ONLINE) . ' with --' . cfgOptionName(CFGOPT_FORCE), + {strOptionalParam => '--no-' . cfgOptionName(CFGOPT_ONLINE) . ' --' . cfgOptionName(CFGOPT_FORCE)}); } - # } - # } } } } diff --git a/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm b/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm index 40406a274..754436abb 100644 --- a/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm +++ b/test/lib/pgBackRestTest/Module/Stanza/StanzaAllTest.pm @@ -78,44 +78,41 @@ sub run { my $self = shift; - my $oOption = {}; + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSet(CFGOPT_DB_PATH, $self->{strDbPath}); + $self->optionTestSet(CFGOPT_REPO_PATH, $self->{strRepoPath}); + $self->optionTestSet(CFGOPT_LOG_PATH, $self->testPath()); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionSetTest($oOption, OPTION_DB_PATH, $self->{strDbPath}); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $self->{strRepoPath}); - $self->optionSetTest($oOption, OPTION_LOG_PATH, $self->testPath()); + $self->optionTestSetBool(CFGOPT_ONLINE, false); - $self->optionBoolSetTest($oOption, OPTION_ONLINE, false); - - $self->optionSetTest($oOption, OPTION_DB_TIMEOUT, 5); - $self->optionSetTest($oOption, OPTION_PROTOCOL_TIMEOUT, 6); + $self->optionTestSet(CFGOPT_DB_TIMEOUT, 5); + $self->optionTestSet(CFGOPT_PROTOCOL_TIMEOUT, 6); ################################################################################################################################ if ($self->begin("Stanza::new")) { #--------------------------------------------------------------------------------------------------------------------------- - $self->optionBoolSetTest($oOption, OPTION_ONLINE, true); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); logEnable(); - # my $oStanza = new pgBackRest::Stanza(); + $self->optionTestSetBool(CFGOPT_ONLINE, true); + $self->configTestLoad(CFGCMD_STANZA_CREATE); $self->testException(sub {(new pgBackRest::Stanza())}, ERROR_DB_CONNECT, "could not connect to server: No such file or directory\n"); - $self->optionBoolSetTest($oOption, OPTION_ONLINE, false); + $self->optionTestSetBool(CFGOPT_ONLINE, false); } ################################################################################################################################ if ($self->begin("Stanza::process()")) { #--------------------------------------------------------------------------------------------------------------------------- - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_CHECK); logEnable(); + $self->configTestLoad(CFGCMD_CHECK); my $oStanza = new pgBackRest::Stanza(); $self->testException(sub {$oStanza->process()}, ERROR_ASSERT, - "stanza->process() called with invalid command: " . CMD_CHECK); + "stanza->process() called with invalid command: " . cfgCommandName(CFGCMD_CHECK)); #--------------------------------------------------------------------------------------------------------------------------- - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); logEnable(); + $self->configTestLoad(CFGCMD_STANZA_CREATE); rmdir($self->{strArchivePath}); rmdir($self->{strBackupPath}); $self->testResult(sub {$oStanza->process()}, 0, 'parent paths recreated successfully'); @@ -124,7 +121,7 @@ sub run ################################################################################################################################ if ($self->begin("Stanza::stanzaCreate()")) { - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); logEnable(); + $self->configTestLoad(CFGCMD_STANZA_CREATE); my $oStanza = new pgBackRest::Stanza(); my $strBackupInfoFile = storageRepo()->pathGet(STORAGE_REPO_BACKUP . qw{/} . FILE_BACKUP_INFO); @@ -207,8 +204,8 @@ sub run # Force on, Repo-Sync off. Archive dir empty. No archive.info file. Backup directory not empty. No backup.info file. #--------------------------------------------------------------------------------------------------------------------------- - $self->optionBoolSetTest($oOption, OPTION_FORCE, true); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); logEnable(); + $self->optionTestSetBool(CFGOPT_FORCE, true); + $self->configTestLoad(CFGCMD_STANZA_CREATE); forceStorageRemove(storageRepo(), $strBackupInfoFile . "*"); forceStorageRemove(storageRepo(), $strArchiveInfoFile . "*"); @@ -219,13 +216,13 @@ sub run WAL_VERSION_94_SYS_ID) && (new pgBackRest::Backup::Info($self->{strBackupPath}))->check(PG_VERSION_94, '942', '201409291', WAL_VERSION_94_SYS_ID)}, 1, ' new info files correct'); - $self->optionReset($oOption, OPTION_FORCE); + $self->optionTestClear(CFGOPT_FORCE); } ################################################################################################################################ if ($self->begin("Stanza::infoFileCreate")) { - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); logEnable(); + $self->configTestLoad(CFGCMD_STANZA_CREATE); my $oStanza = new pgBackRest::Stanza(); my @stryFileList = ('anything'); @@ -249,12 +246,12 @@ sub run "\nHINT: use stanza-create --force to force the stanza data to be created."); # Set force option -------- - $self->optionBoolSetTest($oOption, OPTION_FORCE, true); + $self->optionTestSetBool(CFGOPT_FORCE, true); # Force. Invalid archive.info exists. #--------------------------------------------------------------------------------------------------------------------------- - $self->optionBoolSetTest($oOption, OPTION_FORCE, true); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); logEnable(); + $self->optionTestSetBool(CFGOPT_FORCE, true); + $self->configTestLoad(CFGCMD_STANZA_CREATE); $oArchiveInfo->create(PG_VERSION_94, 12345, true); $oStanza = new pgBackRest::Stanza(); @@ -278,13 +275,13 @@ sub run {strLogExpect => "WARN: found empty directory " . $self->{strArchivePath} . "/9.3-0"}); # Reset force option -------- - $self->optionReset($oOption, OPTION_FORCE); + $self->optionTestClear(CFGOPT_FORCE); } ################################################################################################################################ if ($self->begin("Stanza::infoObject()")) { - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_UPGRADE); logEnable(); + $self->configTestLoad(CFGCMD_STANZA_UPGRADE); my $oStanza = new pgBackRest::Stanza(); $self->testException(sub {$oStanza->infoObject(STORAGE_REPO_BACKUP, $self->{strBackupPath})}, ERROR_FILE_MISSING, @@ -294,7 +291,7 @@ sub run # Force valid but not set. #--------------------------------------------------------------------------------------------------------------------------- - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); logEnable(); + $self->configTestLoad(CFGCMD_STANZA_CREATE); $oStanza = new pgBackRest::Stanza(); $self->testException(sub {$oStanza->infoObject(STORAGE_REPO_BACKUP, $self->{strBackupPath})}, ERROR_FILE_MISSING, @@ -305,8 +302,8 @@ sub run # Force. #--------------------------------------------------------------------------------------------------------------------------- - $self->optionBoolSetTest($oOption, OPTION_FORCE, true); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); logEnable(); + $self->optionTestSetBool(CFGOPT_FORCE, true); + $self->configTestLoad(CFGCMD_STANZA_CREATE); $self->testResult(sub {$oStanza->infoObject(STORAGE_REPO_ARCHIVE, $self->{strArchivePath})}, "[object]", 'archive force successful'); @@ -314,11 +311,11 @@ sub run 'backup force successful'); # Reset force option -------- - $self->optionReset($oOption, OPTION_FORCE); + $self->optionTestClear(CFGOPT_FORCE); # Cause an error to be thrown by changing the permissions of the archive file so it cannot be read #--------------------------------------------------------------------------------------------------------------------------- - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_CREATE); logEnable(); + $self->configTestLoad(CFGCMD_STANZA_CREATE); (new pgBackRest::Backup::Info($self->{strBackupPath}, false, false, {bIgnoreMissing => true}))->create(PG_VERSION_94, WAL_VERSION_94_SYS_ID, '942', '201409291', true); @@ -333,7 +330,7 @@ sub run ################################################################################################################################ if ($self->begin("Stanza::stanzaUpgrade()")) { - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_UPGRADE); logEnable(); + $self->configTestLoad(CFGCMD_STANZA_UPGRADE); my $oArchiveInfo = new pgBackRest::Archive::Info($self->{strArchivePath}, false, {bIgnoreMissing => true}); $oArchiveInfo->create('9.3', '6999999999999999999', true); @@ -341,7 +338,7 @@ sub run my $oBackupInfo = new pgBackRest::Backup::Info($self->{strBackupPath}, false, false, {bIgnoreMissing => true}); $oBackupInfo->create('9.3', '6999999999999999999', '937', '201306121', true); - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_UPGRADE); logEnable(); + $self->configTestLoad(CFGCMD_STANZA_UPGRADE); my $oStanza = new pgBackRest::Stanza(); #--------------------------------------------------------------------------------------------------------------------------- @@ -354,7 +351,7 @@ sub run ################################################################################################################################ if ($self->begin("Stanza::upgradeCheck()")) { - logDisable(); $self->configLoadExpect(dclone($oOption), CMD_STANZA_UPGRADE); logEnable(); + $self->configTestLoad(CFGCMD_STANZA_UPGRADE); my $oStanza = new pgBackRest::Stanza(); # Create the archive file with current data diff --git a/test/lib/pgBackRestTest/Module/Storage/StorageHelperTest.pm b/test/lib/pgBackRestTest/Module/Storage/StorageHelperTest.pm index 03f0a8ddf..7eadfa6e0 100644 --- a/test/lib/pgBackRestTest/Module/Storage/StorageHelperTest.pm +++ b/test/lib/pgBackRestTest/Module/Storage/StorageHelperTest.pm @@ -50,18 +50,17 @@ sub run my $iFileSize = length($strFileContent); # Setup parameters - my $oOption = {}; - $self->optionSetTest($oOption, OPTION_DB_PATH, $self->testPath() . '/db'); - $self->optionSetTest($oOption, OPTION_REPO_PATH, $self->testPath() . '/repo'); - $self->optionSetTest($oOption, OPTION_SPOOL_PATH, $self->testPath() . '/spool'); - $self->optionSetTest($oOption, OPTION_STANZA, $self->stanza()); - $self->optionBoolSetTest($oOption, OPTION_ARCHIVE_ASYNC, true); + $self->optionTestSet(CFGOPT_DB_PATH, $self->testPath() . '/db'); + $self->optionTestSet(CFGOPT_REPO_PATH, $self->testPath() . '/repo'); + $self->optionTestSet(CFGOPT_SPOOL_PATH, $self->testPath() . '/spool'); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); + $self->optionTestSetBool(CFGOPT_ARCHIVE_ASYNC, true); + + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); #------------------------------------------------------------------------------------------------------------------------------- if ($self->begin("storageLocal()")) { - $self->testResult(sub {$self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH)}, '', 'config load'); - $self->testResult(sub {storageLocal($self->testPath())->put($strFile, $strFileContent)}, $iFileSize, 'put'); $self->testResult(sub {${storageTest()->get($strFile)}}, $strFileContent, ' check put'); @@ -72,8 +71,6 @@ sub run #------------------------------------------------------------------------------------------------------------------------------- if ($self->begin("storageDb()")) { - $self->testResult(sub {$self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH)}, '', 'config load'); - $self->testResult(sub {storageDb()->put($strFile, $strFileContent)}, $iFileSize, 'put'); $self->testResult(sub {${storageTest()->get("db/${strFile}")}}, $strFileContent, ' check put'); @@ -84,9 +81,6 @@ sub run #------------------------------------------------------------------------------------------------------------------------------- if ($self->begin("storageRepo()")) { - #--------------------------------------------------------------------------------------------------------------------------- - $self->testResult(sub {$self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH)}, '', 'config load'); - $self->testResult(sub {storageRepo()->put($strFile, $strFileContent)}, $iFileSize, 'put'); $self->testResult(sub {${storageTest()->get("repo/${strFile}")}}, $strFileContent, ' check put'); @@ -129,8 +123,6 @@ sub run #------------------------------------------------------------------------------------------------------------------------------- if ($self->begin("storageSpool()")) { - $self->testResult(sub {$self->configLoadExpect(dclone($oOption), CMD_ARCHIVE_PUSH)}, '', 'config load'); - $self->testResult(sub {storageSpool()->put($strFile, $strFileContent)}, $iFileSize, 'put'); $self->testResult(sub {${storageTest()->get("spool/${strFile}")}}, $strFileContent, ' check put'); diff --git a/test/lib/pgBackRestTest/Module/Storage/StorageS3CertTest.pm b/test/lib/pgBackRestTest/Module/Storage/StorageS3CertTest.pm index 025b08c83..b0951cdcc 100644 --- a/test/lib/pgBackRestTest/Module/Storage/StorageS3CertTest.pm +++ b/test/lib/pgBackRestTest/Module/Storage/StorageS3CertTest.pm @@ -38,15 +38,15 @@ sub run my $strRegion = 'us-west-2'; # Options - my $oOptionGlobal = {}; - $self->optionSetTest($oOptionGlobal, OPTION_REPO_TYPE, REPO_TYPE_S3); - $self->optionSetTest($oOptionGlobal, OPTION_REPO_S3_KEY, BOGUS); - $self->optionSetTest($oOptionGlobal, OPTION_REPO_S3_KEY_SECRET, BOGUS); - $self->optionSetTest($oOptionGlobal, OPTION_REPO_S3_BUCKET, $strBucket); - $self->optionSetTest($oOptionGlobal, OPTION_REPO_S3_ENDPOINT, $strEndpoint); - $self->optionSetTest($oOptionGlobal, OPTION_REPO_S3_REGION, $strRegion); + $self->optionTestSet(CFGOPT_REPO_TYPE, CFGOPTVAL_REPO_TYPE_S3); + $self->optionTestSet(CFGOPT_REPO_S3_KEY, BOGUS); + $self->optionTestSet(CFGOPT_REPO_S3_KEY_SECRET, BOGUS); + $self->optionTestSet(CFGOPT_REPO_S3_BUCKET, $strBucket); + $self->optionTestSet(CFGOPT_REPO_S3_ENDPOINT, $strEndpoint); + $self->optionTestSet(CFGOPT_REPO_S3_REGION, $strRegion); + $self->optionTestSet(CFGOPT_STANZA, $self->stanza()); - $self->optionSetTest($oOptionGlobal, OPTION_STANZA, $self->stanza()); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); ################################################################################################################################ if ($self->begin('validation')) @@ -62,42 +62,44 @@ sub run { # Tests fails on co7 because by default certs cannot be located. This logic may need to be changed in the future if # this bug gets fixed by Red Hat. - $self->testResult(sub {$self->configLoadExpect(dclone($oOptionGlobal), CMD_ARCHIVE_PUSH)}, '', 'config load'); - $self->testException( sub {storageRepo({strStanza => 'test1'})->list('/')}, ERROR_HOST_CONNECT, 'IO::Socket::IP configuration failed SSL connect attempt failed.*certificate verify failed', 'cert verify fails on ' . VM_CO7); # It should work when verification is disabled - my $oOptionLocal = dclone($oOptionGlobal); - $self->optionBoolSetTest($oOptionLocal, OPTION_REPO_S3_VERIFY_SSL, false); - $self->testResult(sub {$self->configLoadExpect($oOptionLocal, CMD_ARCHIVE_PUSH)}, '', 'config load'); + $self->optionTestSetBool(CFGOPT_REPO_S3_VERIFY_SSL, false); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $self->testException( sub {storageRepo({strStanza => 'test2'})->list('/')}, ERROR_PROTOCOL, 'S3 request error \[403\] Forbidden.*', 'connection succeeds with verification disabled, (expected) error on invalid access key'); + + $self->optionTestClear(CFGOPT_REPO_S3_VERIFY_SSL); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); } #----------------------------------------------------------------------------------------------------------------------- - my $oOptionLocal = dclone($oOptionGlobal); - # CO7 doesn't locate certs automatically so specify the path if ($self->vm() eq VM_CO7) { - $self->optionSetTest($oOptionLocal, OPTION_REPO_S3_CA_FILE, '/etc/pki/tls/certs/ca-bundle.crt'); + $self->optionTestSet(CFGOPT_REPO_S3_CA_FILE, '/etc/pki/tls/certs/ca-bundle.crt'); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); } - $self->testResult(sub {$self->configLoadExpect($oOptionLocal, CMD_ARCHIVE_PUSH)}, '', 'config load'); - $self->testException( sub {storageRepo({strStanza => 'test3'})->list('/')}, ERROR_PROTOCOL, 'S3 request error \[403\] Forbidden.*', 'connection succeeds, (expected) error on invalid access key'); + if ($self->vm() eq VM_CO7) + { + $self->optionTestClear(CFGOPT_REPO_S3_CA_FILE); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); + } + #----------------------------------------------------------------------------------------------------------------------- - $oOptionLocal = dclone($oOptionGlobal); - $self->optionSetTest($oOptionLocal, OPTION_REPO_S3_CA_PATH, '/bogus'); - $self->testResult(sub {$self->configLoadExpect($oOptionLocal, CMD_ARCHIVE_PUSH)}, '', 'config load'); + $self->optionTestSet(CFGOPT_REPO_S3_CA_PATH, '/bogus'); + $self->configTestLoad(CFGCMD_ARCHIVE_PUSH); $self->testException( sub {storageRepo({strStanza => 'test4'})->list('/')}, ERROR_HOST_CONNECT, diff --git a/test/test.pl b/test/test.pl index 456a002d3..4309f9908 100755 --- a/test/test.pl +++ b/test/test.pl @@ -24,6 +24,7 @@ use Time::HiRes qw(gettimeofday); use lib dirname($0) . '/lib'; use lib dirname(dirname($0)) . '/lib'; +use lib dirname(dirname($0)) . '/build/lib'; use lib dirname(dirname($0)) . '/doc/lib'; use pgBackRest::Common::Exception; @@ -344,7 +345,7 @@ eval my $strVagrantPath = "${strBackRestBase}/test/.vagrant"; my $strLibCPath = "${strVagrantPath}/libc"; my $strLibCSmart = "${strLibCPath}/build.timestamp"; - my @stryLibCSrcPath = ('libc'); + my @stryLibCSrcPath = ('build', 'doc', 'lib', 'libc', 'src'); # VM Info my $oVm = vmGet(); @@ -412,6 +413,20 @@ eval "cd ${strBuildPath} && perl Makefile.PL INSTALLMAN1DIR=none INSTALLMAN3DIR=none" . ($bContainerExists ? "'" : ''), {bSuppressStdErr => true, bShowOutputAsync => $bLogDetail}); + + if ($strBuildVM eq $strVmHost) + { + foreach my $strFile ( + 'src/config/config.auto.c', 'src/config/config.auto.h', 'src/config/config.auto.md', + 'src/config/configRule.auto.c', 'src/config/configRule.auto.md', 'libc/lib/pgBackRest/LibC.pm') + { + $oStorageBackRest->copy( + "${strLibCPath}/${strBuildVM}/${strFile}", + $oStorageBackRest->openWrite( + "${strBackRestBase}/${strFile}", {bPathCreate => true, lTimestamp => $lTimestampLast})); + } + } + executeTest( ($bContainerExists ? 'docker exec -i test-build ' : '') . "make -C ${strBuildPath}", @@ -888,7 +903,7 @@ or do exit $EVAL_ERROR->code() if (isException($EVAL_ERROR)); # Else output the unhandled error - print $EVAL_ERROR; + syswrite(*STDOUT, $EVAL_ERROR); exit ERROR_UNHANDLED; };