@@ -91,6 +91,31 @@ write_backup_status(pgBackup *backup, BackupStatus status)
9191pgBackupFree (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 */
586611if (backup -> external_dir_str )
587612fio_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
641669char buf [BUFFERSZ ];
642670size_t write_len = 0 ;
671+ int64 backup_size_on_disk = BYTES_INVALID ;
643672
644673pgBackupGetPath (backup ,path ,lengthof (path ),DATABASE_FILE_LIST );
645674snprintf (path_temp ,sizeof (path_temp ),"%s.tmp" ,path );
@@ -661,14 +690,14 @@ write_backup_filelist(pgBackup *backup, parray *files, const char *root,
661690if (!file -> backuped )
662691continue ;
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{
669696path = GetRelativePath (path ,parray_get (external_list ,
670697file -> external_dir_num - 1 ));
671698}
699+ else
700+ path = file -> rel_path ;
672701
673702len = 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,
737766elog (ERROR ,"Cannot rename configuration file \"%s\" to \"%s\": %s" ,
738767path_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)
10151049backup -> program_version [0 ]= '\0' ;
10161050backup -> server_version [0 ]= '\0' ;
10171051backup -> external_dir_str = NULL ;
1052+
1053+ backup -> size_on_disk = BYTES_INVALID ;
1054+ backup -> duration = (time_t )0 ;
10181055}
10191056
10201057/* free pgBackup object */