@@ -1534,18 +1534,23 @@ do_set_backup(const char *instance_name, time_t backup_id,
15341534
15351535 target_backup = (pgBackup * ) parray_get (backup_list , 0 );
15361536
1537- if (!pin_backup (target_backup , set_backup_params ))
1538- elog (ERROR , "Failed to pin the backup %s" , base36enc (backup_id ));
1537+ /* Pin or unpin backup if requested */
1538+ if (set_backup_params -> ttl >= 0 || set_backup_params -> expire_time > 0 )
1539+ pin_backup (target_backup , set_backup_params );
1540+
1541+ if (set_backup_params -> note )
1542+ add_note (target_backup , set_backup_params -> note );
15391543}
15401544
15411545/*
15421546 * Set 'expire-time' attribute based on set_backup_params, or unpin backup
15431547 * if ttl is equal to zero.
15441548 */
1545- bool
1549+ void
15461550pin_backup (pgBackup * target_backup , pgSetBackupParams * set_backup_params )
15471551{
15481552
1553+ /* sanity, backup must have positive recovery-time */
15491554 if (target_backup -> recovery_time <= 0 )
15501555 elog (ERROR , "Failed to set 'expire-time' for backup %s: invalid 'recovery-time'" ,
15511556 base36enc (target_backup -> backup_id ));
@@ -1563,15 +1568,16 @@ pin_backup(pgBackup *target_backup, pgSetBackupParams *set_backup_params)
15631568 {
15641569 elog (WARNING , "Backup %s is not pinned, nothing to unpin" ,
15651570 base36enc (target_backup -> start_time ));
1566- return false ;
1571+ return ;
15671572 }
15681573 target_backup -> expire_time = 0 ;
15691574 }
15701575 /* Pin comes from expire-time */
15711576 else if (set_backup_params -> expire_time > 0 )
15721577 target_backup -> expire_time = set_backup_params -> expire_time ;
15731578 else
1574- return false;
1579+ /* nothing to do */
1580+ return ;
15751581
15761582 /* Update backup.control */
15771583 write_backup (target_backup );
@@ -1587,7 +1593,44 @@ pin_backup(pgBackup *target_backup, pgSetBackupParams *set_backup_params)
15871593 else
15881594 elog (INFO , "Backup %s is unpinned" , base36enc (target_backup -> start_time ));
15891595
1590- return true;
1596+ return ;
1597+ }
1598+
1599+ /*
1600+ * Add note to backup metadata or unset already existing note.
1601+ * It is a job of the caller to make sure that note is not NULL.
1602+ */
1603+ void
1604+ add_note (pgBackup * target_backup , char * note )
1605+ {
1606+
1607+ char * note_string ;
1608+
1609+ /* unset note */
1610+ if (pg_strcasecmp (note , "none" ) == 0 )
1611+ {
1612+ target_backup -> note = NULL ;
1613+ elog (INFO , "Removing note from backup %s" ,
1614+ base36enc (target_backup -> start_time ));
1615+ }
1616+ else
1617+ {
1618+ /* Currently we do not allow string with newlines as note,
1619+ * because it will break parsing of backup.control.
1620+ * So if user provides string like this "aaa\nbbbbb",
1621+ * we save only "aaa"
1622+ * Example: tests.set_backup.SetBackupTest.test_add_note_newlines
1623+ */
1624+ note_string = pgut_malloc (MAX_NOTE_SIZE );
1625+ sscanf (note , "%[^\n]" , note_string );
1626+
1627+ target_backup -> note = note_string ;
1628+ elog (INFO , "Adding note to backup %s: '%s'" ,
1629+ base36enc (target_backup -> start_time ), target_backup -> note );
1630+ }
1631+
1632+ /* Update backup.control */
1633+ write_backup (target_backup );
15911634}
15921635
15931636/*
@@ -1682,6 +1725,10 @@ pgBackupWriteControl(FILE *out, pgBackup *backup)
16821725 /* print external directories list */
16831726 if (backup -> external_dir_str )
16841727 fio_fprintf (out , "external-dirs = '%s'\n" , backup -> external_dir_str );
1728+
1729+ if (backup -> note )
1730+ fio_fprintf (out , "note = '%s'\n" , backup -> note );
1731+
16851732}
16861733
16871734/*
@@ -1919,6 +1966,7 @@ readBackupControlFile(const char *path)
19191966 {'b' , 0 , "from-replica" , & backup -> from_replica , SOURCE_FILE_STRICT },
19201967 {'s' , 0 , "primary-conninfo" , & backup -> primary_conninfo , SOURCE_FILE_STRICT },
19211968 {'s' , 0 , "external-dirs" , & backup -> external_dir_str , SOURCE_FILE_STRICT },
1969+ {'s' , 0 , "note" , & backup -> note , SOURCE_FILE_STRICT },
19221970 {0 }
19231971 };
19241972
@@ -2185,6 +2233,8 @@ pgBackupInit(pgBackup *backup)
21852233 backup -> external_dir_str = NULL ;
21862234 backup -> root_dir = NULL ;
21872235 backup -> files = NULL ;
2236+ backup -> note = NULL ;
2237+
21882238}
21892239
21902240/* free pgBackup object */
@@ -2196,6 +2246,7 @@ pgBackupFree(void *backup)
21962246 pfree (b -> primary_conninfo );
21972247 pfree (b -> external_dir_str );
21982248 pfree (b -> root_dir );
2249+ pfree (b -> note );
21992250 pfree (backup );
22002251}
22012252
0 commit comments