@@ -91,6 +91,31 @@ write_backup_status(pgBackup *backup, BackupStatus status)
9191 pgBackupFree (tmp );
9292}
9393
94+ /* update some fields of backup control file */
95+ void
96+ write_backup_control_on_the_fly (pgBackup * backup )
97+ {
98+ pgBackup * tmp ;
99+
100+ tmp = read_backup (backup -> start_time );
101+ if (!tmp )
102+ {
103+ /*
104+ * Silently exit the function, since read_backup already logged the
105+ * warning message.
106+ */
107+ return ;
108+ }
109+
110+ tmp -> status = backup -> status ;
111+ tmp -> size_on_disk = backup -> size_on_disk ;
112+ backup -> duration = difftime (time (NULL ), backup -> start_time );
113+ tmp -> duration = backup -> duration ;
114+ write_backup (tmp );
115+
116+ pgBackupFree (tmp );
117+ }
118+
94119/*
95120 * Create exclusive lockfile in the backup's directory.
96121 */
@@ -585,6 +610,9 @@ pgBackupWriteControl(FILE *out, pgBackup *backup)
585610 /* print external directories list */
586611 if (backup -> external_dir_str )
587612 fio_fprintf (out , "external-dirs = '%s'\n" , backup -> external_dir_str );
613+
614+ fio_fprintf (out , "size-on-disk = " INT64_FORMAT "\n" , backup -> size_on_disk );
615+ fio_fprintf (out , "duration = " INT64_FORMAT "\n" , backup -> duration );
588616}
589617
590618/*
@@ -640,6 +668,7 @@ write_backup_filelist(pgBackup *backup, parray *files, const char *root,
640668 #define BUFFERSZ BLCKSZ*500
641669 char buf [BUFFERSZ ];
642670 size_t write_len = 0 ;
671+ int64 backup_size_on_disk = BYTES_INVALID ;
643672
644673 pgBackupGetPath (backup , path , lengthof (path ), DATABASE_FILE_LIST );
645674 snprintf (path_temp , sizeof (path_temp ), "%s.tmp" , path );
@@ -661,14 +690,14 @@ write_backup_filelist(pgBackup *backup, parray *files, const char *root,
661690 if (!file -> backuped )
662691 continue ;
663692
664- /* omit root directory portion */
665- if (root && strstr (path , root ) == path )
666- path = GetRelativePath (path , root );
667- else if (file -> external_dir_num && external_list )
693+ backup_size_on_disk += file -> write_size ;
694+ if (file -> external_dir_num && external_list )
668695 {
669696 path = GetRelativePath (path , parray_get (external_list ,
670697 file -> external_dir_num - 1 ));
671698 }
699+ else
700+ path = file -> rel_path ;
672701
673702 len = sprintf (line , "{\"path\":\"%s\", \"size\":\"" INT64_FORMAT "\", "
674703 "\"mode\":\"%u\", \"is_datafile\":\"%u\", "
@@ -737,6 +766,9 @@ write_backup_filelist(pgBackup *backup, parray *files, const char *root,
737766 elog (ERROR , "Cannot rename configuration file \"%s\" to \"%s\": %s" ,
738767 path_temp , path , strerror (errno_temp ));
739768 }
769+
770+ backup -> size_on_disk = backup_size_on_disk ;
771+ write_backup_control_on_the_fly (backup );
740772}
741773
742774/*
@@ -784,6 +816,8 @@ readBackupControlFile(const char *path)
784816 {'b' , 0 , "from-replica" , & backup -> from_replica , SOURCE_FILE_STRICT },
785817 {'s' , 0 , "primary-conninfo" , & backup -> primary_conninfo , SOURCE_FILE_STRICT },
786818 {'s' , 0 , "external-dirs" , & backup -> external_dir_str , SOURCE_FILE_STRICT },
819+ {'I' , 0 , "size-on-disk" , & backup -> size_on_disk , SOURCE_FILE_STRICT },
820+ {'I' , 0 , "duration" , & backup -> duration , SOURCE_FILE_STRICT },
787821 {0 }
788822 };
789823
@@ -1015,6 +1049,9 @@ pgBackupInit(pgBackup *backup)
10151049 backup -> program_version [0 ] = '\0' ;
10161050 backup -> server_version [0 ] = '\0' ;
10171051 backup -> external_dir_str = NULL ;
1052+
1053+ backup -> size_on_disk = BYTES_INVALID ;
1054+ backup -> duration = (time_t ) 0 ;
10181055}
10191056
10201057/* free pgBackup object */
0 commit comments