@@ -110,9 +110,6 @@ do_backup_database(parray *backup_list, pgBackupOption bkupopt)
110
110
*/
111
111
current .tli = get_current_timeline (false);
112
112
113
- if (current .backup_mode != BACKUP_MODE_DIFF_PTRACK )
114
- pg_ptrack_clear ();
115
-
116
113
/*
117
114
* In differential backup mode, check if there is an already-validated
118
115
* full backup on current timeline.
@@ -148,6 +145,8 @@ do_backup_database(parray *backup_list, pgBackupOption bkupopt)
148
145
elog (ERROR ,"backup_label does not exist in PGDATA." );
149
146
}
150
147
148
+ if (current .backup_mode != BACKUP_MODE_DIFF_PTRACK )
149
+ pg_ptrack_clear ();
151
150
/*
152
151
* List directories and symbolic links with the physical path to make
153
152
* 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)
915
914
path_len = strlen (file -> path );
916
915
if (path_len > 6 && strncmp (file -> path + (path_len - 6 ),"ptrack" ,6 )== 0 )
917
916
{
918
- pgFile tmp_file ;
919
917
pgFile * 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 ++ ;
928
940
}
929
- free ( tmp_file . path );
941
+
930
942
pgFileFree (file );
931
943
parray_remove (list_file ,i );
932
944
i -- ;
@@ -1051,7 +1063,11 @@ void make_pagemap_from_ptrack(parray *files)
1051
1063
if (p -> ptrack_path != NULL )
1052
1064
{
1053
1065
DataPage page ;
1066
+ char * flat_memory ,* flat_mamory_cur ;
1067
+ size_t flat_size = 0 ;
1068
+ size_t start_addr ;
1054
1069
struct stat st ;
1070
+
1055
1071
FILE * ptrack_file = fopen (p -> ptrack_path ,"r" );
1056
1072
if (ptrack_file == NULL )
1057
1073
{
@@ -1060,16 +1076,21 @@ void make_pagemap_from_ptrack(parray *files)
1060
1076
}
1061
1077
1062
1078
fstat (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 );
1065
1081
1066
- elog (LOG ,"Start copy bitmap from ptrack:%s size:%i" ,p -> ptrack_path ,p -> pagemap .bitmapsize );
1067
1082
while (fread (page .data ,BLCKSZ ,1 ,ptrack_file )== 1 )
1068
1083
{
1069
1084
char * map = PageGetContents (page .data );
1070
- memcpy (p -> pagemap .bitmap ,map ,BLCKSZ - MAXALIGN (SizeOfPageHeaderData ));
1085
+ memcpy (flat_memory ,map ,MAPSIZE );
1086
+ flat_mamory_cur += MAPSIZE ;
1071
1087
}
1072
1088
fclose (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 );
1073
1094
}
1074
1095
}
1075
1096
}