@@ -110,9 +110,6 @@ do_backup_database(parray *backup_list, pgBackupOption bkupopt)
110110 */
111111current .tli = get_current_timeline (false);
112112
113- if (current .backup_mode != BACKUP_MODE_DIFF_PTRACK )
114- pg_ptrack_clear ();
115-
116113/*
117114 * In differential backup mode, check if there is an already-validated
118115 * full backup on current timeline.
@@ -148,6 +145,8 @@ do_backup_database(parray *backup_list, pgBackupOption bkupopt)
148145elog (ERROR ,"backup_label does not exist in PGDATA." );
149146}
150147
148+ if (current .backup_mode != BACKUP_MODE_DIFF_PTRACK )
149+ pg_ptrack_clear ();
151150/*
152151 * List directories and symbolic links with the physical path to make
153152 * mkdirs.sh, then sort them in order of path. Omit $PGDATA.
@@ -915,18 +914,31 @@ add_files(parray *files, const char *root, bool add_root, bool is_pgdata)
915914path_len = strlen (file -> path );
916915if (path_len > 6 && strncmp (file -> path + (path_len - 6 ),"ptrack" ,6 )== 0 )
917916{
918- pgFile tmp_file ;
919917pgFile * search_file ;
920- //elog(WARNING, "Remove ptrack file from backup %s", file->path);
921- tmp_file .path = pg_strdup (file -> path );
922- tmp_file .path [path_len - 7 ]= '\0' ;
923- search_file = * (pgFile * * )parray_bsearch (list_file ,& tmp_file ,pgFileComparePath );
924- if (search_file != NULL )
925- {
926- //elog(WARNING, "Finded main fork for ptrak:%s", search_file->path);
927- search_file -> ptrack_path = pg_strdup (file -> path );
918+ pgFile * * pre_search_file ;
919+ int segno = 0 ;
920+ while (true) {
921+ pgFile tmp_file ;
922+ tmp_file .path = pg_strdup (file -> path );
923+ /* I hope segno not more than 999999 */
924+ if (segno > 0 )
925+ sprintf (tmp_file .path + path_len - 7 ,".%d" ,segno );
926+ else
927+ tmp_file .path [path_len - 7 ]= '\0' ;
928+ pre_search_file = (pgFile * * )parray_bsearch (list_file ,& tmp_file ,pgFileComparePath );
929+ if (pre_search_file != NULL )
930+ {
931+ search_file = * pre_search_file ;
932+ search_file -> ptrack_path = pg_strdup (file -> path );
933+ search_file -> segno = segno ;
934+ }else {
935+ pg_free (tmp_file .path );
936+ break ;
937+ }
938+ pg_free (tmp_file .path );
939+ segno ++ ;
928940}
929- free ( tmp_file . path );
941+
930942pgFileFree (file );
931943parray_remove (list_file ,i );
932944i -- ;
@@ -1051,7 +1063,11 @@ void make_pagemap_from_ptrack(parray *files)
10511063if (p -> ptrack_path != NULL )
10521064{
10531065DataPage page ;
1066+ char * flat_memory ,* flat_mamory_cur ;
1067+ size_t flat_size = 0 ;
1068+ size_t start_addr ;
10541069struct stat st ;
1070+
10551071FILE * ptrack_file = fopen (p -> ptrack_path ,"r" );
10561072if (ptrack_file == NULL )
10571073{
@@ -1060,16 +1076,21 @@ void make_pagemap_from_ptrack(parray *files)
10601076}
10611077
10621078fstat (fileno (ptrack_file ),& st );
1063- p -> pagemap . bitmapsize = st .st_size - (st .st_size /BLCKSZ )* MAXALIGN (SizeOfPageHeaderData );
1064- p -> pagemap . bitmap = pg_malloc (p -> pagemap . bitmapsize );
1079+ flat_size = st .st_size - (st .st_size /BLCKSZ )* MAXALIGN (SizeOfPageHeaderData );
1080+ flat_mamory_cur = flat_memory = pg_malloc (flat_size );
10651081
1066- elog (LOG ,"Start copy bitmap from ptrack:%s size:%i" ,p -> ptrack_path ,p -> pagemap .bitmapsize );
10671082while (fread (page .data ,BLCKSZ ,1 ,ptrack_file )== 1 )
10681083{
10691084char * map = PageGetContents (page .data );
1070- memcpy (p -> pagemap .bitmap ,map ,BLCKSZ - MAXALIGN (SizeOfPageHeaderData ));
1085+ memcpy (flat_memory ,map ,MAPSIZE );
1086+ flat_mamory_cur += MAPSIZE ;
10711087}
10721088fclose (ptrack_file );
1089+ start_addr = (RELSEG_SIZE /8 )* p -> segno ;
1090+ p -> pagemap .bitmapsize = start_addr + RELSEG_SIZE /8 > flat_size ?flat_size - start_addr :RELSEG_SIZE /8 ;
1091+ p -> pagemap .bitmap = pg_malloc (p -> pagemap .bitmapsize );
1092+ memcpy (p -> pagemap .bitmap ,flat_memory + start_addr ,p -> pagemap .bitmapsize );
1093+ pg_free (flat_memory );
10731094}
10741095}
10751096}