@@ -77,7 +77,7 @@ static void backup_cleanup(bool fatal, void *userdata);
7777static void backup_disconnect (bool fatal , void * userdata );
7878
7979static void backup_files (void * arg );
80- static void do_backup_database ( parray * backup_list );
80+ static void do_backup_instance ( void );
8181
8282static void pg_start_backup (const char * label , bool smooth , pgBackup * backup );
8383static void pg_switch_wal (PGconn * conn );
@@ -116,10 +116,11 @@ static void confirm_block_size(const char *name, int blcksz);
116116
117117
118118/*
119- * Take a backup of database.
119+ * Take a backup of a single postgresql instance.
120+ * Move files from 'pgdata' to a subdirectory in 'backup_path'.
120121 */
121122static void
122- do_backup_database ( parray * backup_list )
123+ do_backup_instance ( void )
123124{
124125 size_t i ;
125126 char database_path [MAXPGPATH ];
@@ -144,15 +145,32 @@ do_backup_database(parray *backup_list)
144145
145146 /*
146147 * In incremental backup mode ensure that already-validated
147- * backup on current timeline exists.
148+ * backup on current timeline exists and get its filelist .
148149 */
149150 if (current .backup_mode == BACKUP_MODE_DIFF_PAGE ||
150151 current .backup_mode == BACKUP_MODE_DIFF_PTRACK )
151152 {
153+ parray * backup_list ;
154+ /* get list of backups already taken */
155+ backup_list = catalog_get_backup_list (INVALID_BACKUP_ID );
156+ if (backup_list == NULL )
157+ elog (ERROR , "Failed to get backup list." );
158+
152159 prev_backup = catalog_get_last_data_backup (backup_list , current .tli );
153160 if (prev_backup == NULL )
154161 elog (ERROR , "Valid backup on current timeline is not found. "
155162 "Create new FULL backup before an incremental one." );
163+ parray_free (backup_list );
164+
165+ pgBackupGetPath (prev_backup , prev_backup_filelist_path , lengthof (prev_backup_filelist_path ),
166+ DATABASE_FILE_LIST );
167+ prev_backup_filelist = dir_read_file_list (pgdata , prev_backup_filelist_path );
168+
169+ /* If lsn is not NULL, only pages with higher lsn will be copied. */
170+ prev_backup_start_lsn = prev_backup -> start_lsn ;
171+ current .parent_backup = prev_backup -> start_time ;
172+
173+ pgBackupWriteBackupControlFile (& current );
156174 }
157175
158176 /* Clear ptrack files for FULL and PAGE backup */
@@ -200,24 +218,6 @@ do_backup_database(parray *backup_list)
200218 pthread_mutex_unlock (& start_stream_mut );
201219 }
202220
203- /*
204- * To take incremental backup get the filelist of the last completed database
205- */
206- if (current .backup_mode == BACKUP_MODE_DIFF_PAGE ||
207- current .backup_mode == BACKUP_MODE_DIFF_PTRACK )
208- {
209- Assert (prev_backup );
210- pgBackupGetPath (prev_backup , prev_backup_filelist_path , lengthof (prev_backup_filelist_path ),
211- DATABASE_FILE_LIST );
212- prev_backup_filelist = dir_read_file_list (pgdata , prev_backup_filelist_path );
213-
214- /* If lsn is not NULL, only pages with higher lsn will be copied. */
215- prev_backup_start_lsn = prev_backup -> start_lsn ;
216-
217- current .parent_backup = prev_backup -> start_time ;
218- pgBackupWriteBackupControlFile (& current );
219- }
220-
221221 /* initialize backup list */
222222 backup_files_list = parray_new ();
223223
@@ -394,9 +394,6 @@ do_backup_database(parray *backup_list)
394394int
395395do_backup (void )
396396{
397- parray * backup_list ;
398- bool is_ptrack_support ;
399-
400397 /* PGDATA and BACKUP_MODE are always required */
401398 if (pgdata == NULL )
402399 elog (ERROR , "required parameter not specified: PGDATA "
@@ -422,15 +419,18 @@ do_backup(void)
422419 current .stream = stream_wal ;
423420
424421 /* ptrack backup checks */
425- is_ptrack_support = pg_ptrack_support ();
426- if (current .backup_mode == BACKUP_MODE_DIFF_PTRACK && !is_ptrack_support )
427- elog (ERROR , "This PostgreSQL instance does not support ptrack" );
428-
429- if (is_ptrack_support )
422+ if (current .backup_mode == BACKUP_MODE_DIFF_PTRACK )
430423 {
431- is_ptrack_enable = pg_ptrack_enable ();
432- if (current .backup_mode == BACKUP_MODE_DIFF_PTRACK && !is_ptrack_enable )
433- elog (ERROR , "Ptrack is disabled" );
424+ bool is_ptrack_support = pg_ptrack_support ();
425+
426+ if (!is_ptrack_support )
427+ elog (ERROR , "This PostgreSQL instance does not support ptrack" );
428+ else
429+ {
430+ is_ptrack_enable = pg_ptrack_enable ();
431+ if (!is_ptrack_enable )
432+ elog (ERROR , "Ptrack is disabled" );
433+ }
434434 }
435435
436436 /* archiving check */
@@ -460,11 +460,6 @@ do_backup(void)
460460 */
461461 check_system_identifiers ();
462462
463- /* get list of backups already taken */
464- backup_list = catalog_get_backup_list (INVALID_BACKUP_ID );
465- if (backup_list == NULL )
466- elog (ERROR , "Failed to get backup list." );
467-
468463 elog (LOG , "Backup start. backup-mode = %s, stream = %s" ,
469464 pgBackupGetBackupMode (& current ), current .stream ? "true" : "false" );
470465
@@ -483,7 +478,7 @@ do_backup(void)
483478 pgut_atexit_push (backup_cleanup , NULL );
484479
485480 /* backup data */
486- do_backup_database ( backup_list );
481+ do_backup_instance ( );
487482 pgut_atexit_pop (backup_cleanup , NULL );
488483
489484 /* compute size of wal files of this backup stored in the archive */
0 commit comments