You've already forked pgbackrest
							
							
				mirror of
				https://github.com/pgbackrest/pgbackrest.git
				synced 2025-10-30 23:37:45 +02:00 
			
		
		
		
	Add expire-auto option.
This allows automatic expiration after a successful backup to be disabled.
This commit is contained in:
		| @@ -251,6 +251,7 @@ use constant CFGOPT_ARCHIVE_COPY                                    => 'archive- | ||||
| use constant CFGOPT_BACKUP_STANDBY                                  => 'backup-standby'; | ||||
| use constant CFGOPT_CHECKSUM_PAGE                                   => 'checksum-page'; | ||||
| use constant CFGOPT_EXCLUDE                                         => 'exclude'; | ||||
| use constant CFGOPT_EXPIRE_AUTO                                     => 'expire-auto'; | ||||
| use constant CFGOPT_MANIFEST_SAVE_THRESHOLD                         => 'manifest-save-threshold'; | ||||
| use constant CFGOPT_RESUME                                          => 'resume'; | ||||
| use constant CFGOPT_START_FAST                                      => 'start-fast'; | ||||
| @@ -2345,6 +2346,17 @@ my %hConfigDefine = | ||||
|         }, | ||||
|     }, | ||||
|  | ||||
|     &CFGOPT_EXPIRE_AUTO => | ||||
|     { | ||||
|         &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, | ||||
|         &CFGDEF_TYPE => CFGDEF_TYPE_BOOLEAN, | ||||
|         &CFGDEF_DEFAULT => true, | ||||
|         &CFGDEF_COMMAND => | ||||
|         { | ||||
|             &CFGCMD_BACKUP => {}, | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     &CFGOPT_MANIFEST_SAVE_THRESHOLD => | ||||
|     { | ||||
|         &CFGDEF_SECTION => CFGDEF_SECTION_GLOBAL, | ||||
|   | ||||
| @@ -757,6 +757,15 @@ | ||||
|                         <example>5G</example> | ||||
|                     </config-key> | ||||
|  | ||||
|                     <!-- CONFIG - BACKUP SECTION - EXPIRE-AUTO --> | ||||
|                     <config-key id="expire-auto" name="Expire Auto"> | ||||
|                         <summary>Automatically run the <cmd>expire</cmd> command after a successful backup.</summary> | ||||
|  | ||||
|                         <text>The setting is enabled by default. Use caution when disabling this option; doing so will result in retaining all backups and archives indefinitely which could cause your repository to run out of space.</text> | ||||
|  | ||||
|                         <example>y</example> | ||||
|                     </config-key> | ||||
|  | ||||
|                     <!-- CONFIG - BACKUP SECTION - RESUME --> | ||||
|                     <config-key id="resume" name="Resume"> | ||||
|                         <summary>Allow resume of failed backup.</summary> | ||||
|   | ||||
| @@ -39,6 +39,18 @@ | ||||
|  | ||||
|                         <p>Azure support for repository storage.</p> | ||||
|                     </release-item> | ||||
|  | ||||
|                     <release-item> | ||||
|                         <release-item-contributor-list> | ||||
|                             <release-item-contributor id="stefan.fercot"/> | ||||
|                             <release-item-reviewer id="cynthia.shang"/> | ||||
|                             <release-item-reviewer id="david.steele"/> | ||||
|                         </release-item-contributor-list> | ||||
|  | ||||
|                         <p>Add <br-option>expire-auto</br-option> option.</p> | ||||
|  | ||||
|                         <p>This allows automatic expiration after a successful backup to be disabled.</p> | ||||
|                     </release-item> | ||||
|                 </release-feature-list> | ||||
|  | ||||
|                 <release-improvement-list> | ||||
|   | ||||
| @@ -306,6 +306,7 @@ STRING_EXTERN(CFGOPT_DB_TIMEOUT_STR,                                CFGOPT_DB_TI | ||||
| STRING_EXTERN(CFGOPT_DELTA_STR,                                     CFGOPT_DELTA); | ||||
| STRING_EXTERN(CFGOPT_DRY_RUN_STR,                                   CFGOPT_DRY_RUN); | ||||
| STRING_EXTERN(CFGOPT_EXCLUDE_STR,                                   CFGOPT_EXCLUDE); | ||||
| STRING_EXTERN(CFGOPT_EXPIRE_AUTO_STR,                               CFGOPT_EXPIRE_AUTO); | ||||
| STRING_EXTERN(CFGOPT_FILTER_STR,                                    CFGOPT_FILTER); | ||||
| STRING_EXTERN(CFGOPT_FORCE_STR,                                     CFGOPT_FORCE); | ||||
| STRING_EXTERN(CFGOPT_HOST_ID_STR,                                   CFGOPT_HOST_ID); | ||||
| @@ -675,6 +676,14 @@ static ConfigOptionData configOptionData[CFG_OPTION_TOTAL] = CONFIG_OPTION_LIST | ||||
|         CONFIG_OPTION_DEFINE_ID(cfgDefOptExclude) | ||||
|     ) | ||||
|  | ||||
|     //------------------------------------------------------------------------------------------------------------------------------ | ||||
|     CONFIG_OPTION | ||||
|     ( | ||||
|         CONFIG_OPTION_NAME(CFGOPT_EXPIRE_AUTO) | ||||
|         CONFIG_OPTION_INDEX(0) | ||||
|         CONFIG_OPTION_DEFINE_ID(cfgDefOptExpireAuto) | ||||
|     ) | ||||
|  | ||||
|     //------------------------------------------------------------------------------------------------------------------------------ | ||||
|     CONFIG_OPTION | ||||
|     ( | ||||
|   | ||||
| @@ -99,6 +99,8 @@ Option constants | ||||
|     STRING_DECLARE(CFGOPT_DRY_RUN_STR); | ||||
| #define CFGOPT_EXCLUDE                                              "exclude" | ||||
|     STRING_DECLARE(CFGOPT_EXCLUDE_STR); | ||||
| #define CFGOPT_EXPIRE_AUTO                                          "expire-auto" | ||||
|     STRING_DECLARE(CFGOPT_EXPIRE_AUTO_STR); | ||||
| #define CFGOPT_FILTER                                               "filter" | ||||
|     STRING_DECLARE(CFGOPT_FILTER_STR); | ||||
| #define CFGOPT_FORCE                                                "force" | ||||
| @@ -458,7 +460,7 @@ Option constants | ||||
| #define CFGOPT_TYPE                                                 "type" | ||||
|     STRING_DECLARE(CFGOPT_TYPE_STR); | ||||
|  | ||||
| #define CFG_OPTION_TOTAL                                            202 | ||||
| #define CFG_OPTION_TOTAL                                            203 | ||||
|  | ||||
| /*********************************************************************************************************************************** | ||||
| Command enum | ||||
| @@ -515,6 +517,7 @@ typedef enum | ||||
|     cfgOptDelta, | ||||
|     cfgOptDryRun, | ||||
|     cfgOptExclude, | ||||
|     cfgOptExpireAuto, | ||||
|     cfgOptFilter, | ||||
|     cfgOptForce, | ||||
|     cfgOptHostId, | ||||
|   | ||||
| @@ -1186,6 +1186,37 @@ static ConfigDefineOptionData configDefineOptionData[] = CFGDEFDATA_OPTION_LIST | ||||
|         ) | ||||
|     ) | ||||
|  | ||||
|     // ----------------------------------------------------------------------------------------------------------------------------- | ||||
|     CFGDEFDATA_OPTION | ||||
|     ( | ||||
|         CFGDEFDATA_OPTION_NAME("expire-auto") | ||||
|         CFGDEFDATA_OPTION_REQUIRED(true) | ||||
|         CFGDEFDATA_OPTION_SECTION(cfgDefSectionGlobal) | ||||
|         CFGDEFDATA_OPTION_TYPE(cfgDefOptTypeBoolean) | ||||
|         CFGDEFDATA_OPTION_INTERNAL(false) | ||||
|  | ||||
|         CFGDEFDATA_OPTION_INDEX_TOTAL(1) | ||||
|         CFGDEFDATA_OPTION_SECURE(false) | ||||
|  | ||||
|         CFGDEFDATA_OPTION_HELP_SECTION("backup") | ||||
|         CFGDEFDATA_OPTION_HELP_SUMMARY("Automatically run the expire command after a successful backup.") | ||||
|         CFGDEFDATA_OPTION_HELP_DESCRIPTION | ||||
|         ( | ||||
|             "The setting is enabled by default. Use caution when disabling this option; doing so will result in retaining all " | ||||
|                 "backups and archives indefinitely which could cause your repository to run out of space." | ||||
|         ) | ||||
|  | ||||
|         CFGDEFDATA_OPTION_COMMAND_LIST | ||||
|         ( | ||||
|             CFGDEFDATA_OPTION_COMMAND(cfgDefCmdBackup) | ||||
|         ) | ||||
|  | ||||
|         CFGDEFDATA_OPTION_OPTIONAL_LIST | ||||
|         ( | ||||
|             CFGDEFDATA_OPTION_OPTIONAL_DEFAULT("1") | ||||
|         ) | ||||
|     ) | ||||
|  | ||||
|     // ----------------------------------------------------------------------------------------------------------------------------- | ||||
|     CFGDEFDATA_OPTION | ||||
|     ( | ||||
|   | ||||
| @@ -75,6 +75,7 @@ typedef enum | ||||
|     cfgDefOptDelta, | ||||
|     cfgDefOptDryRun, | ||||
|     cfgDefOptExclude, | ||||
|     cfgDefOptExpireAuto, | ||||
|     cfgDefOptFilter, | ||||
|     cfgDefOptForce, | ||||
|     cfgDefOptHostId, | ||||
|   | ||||
| @@ -298,6 +298,21 @@ static const struct option optionList[] = | ||||
|         .val = PARSE_OPTION_FLAG | PARSE_RESET_FLAG | cfgOptExclude, | ||||
|     }, | ||||
|  | ||||
|     // expire-auto option | ||||
|     // ----------------------------------------------------------------------------------------------------------------------------- | ||||
|     { | ||||
|         .name = CFGOPT_EXPIRE_AUTO, | ||||
|         .val = PARSE_OPTION_FLAG | cfgOptExpireAuto, | ||||
|     }, | ||||
|     { | ||||
|         .name = "no-" CFGOPT_EXPIRE_AUTO, | ||||
|         .val = PARSE_OPTION_FLAG | PARSE_NEGATE_FLAG | cfgOptExpireAuto, | ||||
|     }, | ||||
|     { | ||||
|         .name = "reset-" CFGOPT_EXPIRE_AUTO, | ||||
|         .val = PARSE_OPTION_FLAG | PARSE_RESET_FLAG | cfgOptExpireAuto, | ||||
|     }, | ||||
|  | ||||
|     // filter option | ||||
|     // ----------------------------------------------------------------------------------------------------------------------------- | ||||
|     { | ||||
| @@ -2704,6 +2719,7 @@ static const ConfigOption optionResolveOrder[] = | ||||
|     cfgOptDelta, | ||||
|     cfgOptDryRun, | ||||
|     cfgOptExclude, | ||||
|     cfgOptExpireAuto, | ||||
|     cfgOptFilter, | ||||
|     cfgOptHostId, | ||||
|     cfgOptIgnoreMissing, | ||||
|   | ||||
							
								
								
									
										17
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								src/main.c
									
									
									
									
									
								
							| @@ -118,14 +118,17 @@ main(int argListSize, const char *argList[]) | ||||
|                     // Run backup | ||||
|                     cmdBackup(); | ||||
|  | ||||
|                     // Switch to expire command | ||||
|                     cmdEnd(0, NULL); | ||||
|                     cfgCommandSet(cfgCmdExpire, cfgCmdRoleDefault); | ||||
|                     cfgLoadLogFile(); | ||||
|                     cmdBegin(true); | ||||
|                     if (cfgOptionBool(cfgOptExpireAuto)) | ||||
|                     { | ||||
|                         // Switch to expire command | ||||
|                         cmdEnd(0, NULL); | ||||
|                         cfgCommandSet(cfgCmdExpire, cfgCmdRoleDefault); | ||||
|                         cfgLoadLogFile(); | ||||
|                         cmdBegin(true); | ||||
|  | ||||
|                     // Run expire | ||||
|                     cmdExpire(); | ||||
|                         // Run expire | ||||
|                         cmdExpire(); | ||||
|                     } | ||||
|  | ||||
|                     break; | ||||
|                 } | ||||
|   | ||||
| @@ -196,6 +196,109 @@ repo1-path=[TEST_PATH]/backup/repo | ||||
| archive-copy=y | ||||
| start-fast=y | ||||
|  | ||||
| full backup - with disabled expire-auto (backup host) | ||||
| > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf  --repo1-retention-full=1 --no-expire-auto --type=full --stanza=db backup | ||||
| ------------------------------------------------------------------------------------------------------------------------------------ | ||||
|  | ||||
| + supplemental file: [TEST_PATH]/db-primary/pgbackrest.conf | ||||
| ----------------------------------------------------------- | ||||
| [db] | ||||
| pg1-path=[TEST_PATH]/db-primary/db/base | ||||
| pg1-port=6543 | ||||
| pg1-socket-path=[TEST_PATH]/db-primary/db | ||||
|  | ||||
| [global] | ||||
| buffer-size=[BUFFER-SIZE] | ||||
| compress-level=3 | ||||
| compress-level-network=1 | ||||
| compress-type=none | ||||
| db-timeout=45 | ||||
| lock-path=[TEST_PATH]/db-primary/lock | ||||
| log-level-console=detail | ||||
| log-level-file=[LOG-LEVEL-FILE] | ||||
| log-level-stderr=off | ||||
| log-path=[TEST_PATH]/db-primary/log | ||||
| log-subprocess=[LOG-SUBPROCESS] | ||||
| log-timestamp=n | ||||
| protocol-timeout=60 | ||||
| repo1-host=backup | ||||
| repo1-host-cmd=[BACKREST-BIN] | ||||
| repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf | ||||
| repo1-host-user=[USER-1] | ||||
| spool-path=[TEST_PATH]/db-primary/spool | ||||
|  | ||||
| + supplemental file: [TEST_PATH]/db-standby/pgbackrest.conf | ||||
| ----------------------------------------------------------- | ||||
| [db] | ||||
| pg1-path=[TEST_PATH]/db-standby/db/base | ||||
| pg1-port=6544 | ||||
| pg1-socket-path=[TEST_PATH]/db-standby/db | ||||
|  | ||||
| [global] | ||||
| buffer-size=[BUFFER-SIZE] | ||||
| compress-level=3 | ||||
| compress-level-network=1 | ||||
| compress-type=none | ||||
| db-timeout=45 | ||||
| lock-path=[TEST_PATH]/db-standby/lock | ||||
| log-level-console=detail | ||||
| log-level-file=[LOG-LEVEL-FILE] | ||||
| log-level-stderr=off | ||||
| log-path=[TEST_PATH]/db-standby/log | ||||
| log-subprocess=[LOG-SUBPROCESS] | ||||
| log-timestamp=n | ||||
| protocol-timeout=60 | ||||
| repo1-host=backup | ||||
| repo1-host-cmd=[BACKREST-BIN] | ||||
| repo1-host-config=[TEST_PATH]/backup/pgbackrest.conf | ||||
| repo1-host-user=[USER-1] | ||||
| spool-path=[TEST_PATH]/db-standby/spool | ||||
|  | ||||
| + supplemental file: [TEST_PATH]/backup/pgbackrest.conf | ||||
| ------------------------------------------------------- | ||||
| [db] | ||||
| pg1-host=db-primary | ||||
| pg1-host-cmd=[BACKREST-BIN] | ||||
| pg1-host-config=[TEST_PATH]/db-primary/pgbackrest.conf | ||||
| pg1-host-user=[USER-1] | ||||
| pg1-path=[TEST_PATH]/db-primary/db/base | ||||
| pg1-port=6543 | ||||
| pg2-host=bogus | ||||
| pg2-host-cmd=[BACKREST-BIN] | ||||
| pg2-host-config=[TEST_PATH]/db-standby/pgbackrest.conf | ||||
| pg2-host-user=[USER-1] | ||||
| pg2-path=[TEST_PATH]/db-standby/db/base | ||||
| pg8-host=db-standby | ||||
| pg8-host-cmd=[BACKREST-BIN] | ||||
| pg8-host-config=[TEST_PATH]/db-standby/pgbackrest.conf | ||||
| pg8-host-user=[USER-1] | ||||
| pg8-path=[TEST_PATH]/db-standby/db/base | ||||
| pg8-port=6544 | ||||
|  | ||||
| [global] | ||||
| buffer-size=[BUFFER-SIZE] | ||||
| compress-level=3 | ||||
| compress-level-network=1 | ||||
| compress-type=none | ||||
| db-timeout=45 | ||||
| lock-path=[TEST_PATH]/backup/lock | ||||
| log-level-console=detail | ||||
| log-level-file=[LOG-LEVEL-FILE] | ||||
| log-level-stderr=off | ||||
| log-path=[TEST_PATH]/backup/log | ||||
| log-subprocess=[LOG-SUBPROCESS] | ||||
| log-timestamp=n | ||||
| protocol-timeout=60 | ||||
| repo1-path=[TEST_PATH]/backup/repo | ||||
|  | ||||
| [global:backup] | ||||
| archive-copy=y | ||||
| start-fast=y | ||||
|  | ||||
| expire full=1 (backup host) | ||||
| > [CONTAINER-EXEC] backup [BACKREST-BIN] --config=[TEST_PATH]/backup/pgbackrest.conf --repo1-retention-full=1  --stanza=db expire | ||||
| ------------------------------------------------------------------------------------------------------------------------------------ | ||||
|  | ||||
| restore, type 'standby', remap - restore backup on replica (db-standby host) | ||||
| > [CONTAINER-EXEC] db-standby [BACKREST-BIN] --config=[TEST_PATH]/db-standby/pgbackrest.conf  --recovery-option="primary_conninfo=host=db-primary port=6543 user=replicator"  --type=standby --link-map="pg_xlog=[TEST_PATH]/db-standby/db/pg_xlog" --link-all --stanza=db restore | ||||
| ------------------------------------------------------------------------------------------------------------------------------------ | ||||
|   | ||||
| @@ -416,6 +416,28 @@ sub run | ||||
|             CFGOPTVAL_BACKUP_TYPE_FULL, 'update during backup', | ||||
|             {strOptionalParam => ' --buffer-size=16384'}); | ||||
|  | ||||
|         # Make a new backup with expire-auto disabled then run the expire command and compare backup numbers to ensure that expire | ||||
|         # was really disabled | ||||
|         $oBackupInfo = new pgBackRestTest::Env::BackupInfo($oHostBackup->repoBackupPath()); | ||||
|         push(my @backupLst1, $oBackupInfo->list()); | ||||
|  | ||||
|         $strFullBackup = $oHostBackup->backup( | ||||
|             CFGOPTVAL_BACKUP_TYPE_FULL, 'with disabled expire-auto', | ||||
|             {strOptionalParam => ' --repo1-retention-full='.scalar(@backupLst1). ' --no-expire-auto'}); | ||||
|  | ||||
|         $oBackupInfo = new pgBackRestTest::Env::BackupInfo($oHostBackup->repoBackupPath()); | ||||
|         push(my @backupLst2, $oBackupInfo->list()); | ||||
|  | ||||
|         &log(INFO, "    run the expire command"); | ||||
|         $oHostBackup->expire({iRetentionFull => scalar(@backupLst1)}); | ||||
|         $oBackupInfo = new pgBackRestTest::Env::BackupInfo($oHostBackup->repoBackupPath()); | ||||
|         push(my @backupLst3, $oBackupInfo->list()); | ||||
|  | ||||
|         unless (scalar(@backupLst2) == scalar(@backupLst1) + 1 && scalar(@backupLst1) == scalar(@backupLst3)) | ||||
|         { | ||||
|             confess "expire-auto option didn't work as expected"; | ||||
|         } | ||||
|  | ||||
|         # Enabled async archiving | ||||
|         $oHostBackup->configUpdate({&CFGDEF_SECTION_GLOBAL => {'archive-async' => 'y'}}); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user