@@ -59,7 +59,10 @@ static bool pg_is_standby(void);
59
59
static void get_lsn (PGresult * res ,XLogRecPtr * lsn );
60
60
static void get_xid (PGresult * res ,uint32 * xid );
61
61
static void pg_ptrack_clear (void );
62
-
62
+ static char * pg_ptrack_get_and_clear (Oid tablespace_oid ,
63
+ Oid db_oid ,
64
+ Oid rel_oid ,
65
+ size_t * result_size );
63
66
static void add_files (parray * files ,const char * root ,bool add_root ,bool is_pgdata );
64
67
static void create_file_list (parray * files ,
65
68
const char * root ,
@@ -315,9 +318,6 @@ do_backup_database(parray *backup_list, pgBackupOption bkupopt)
315
318
pg_free (backup_threads_args [i ]);
316
319
}
317
320
318
- /* Clear ptrack files after backup */
319
- if (current .backup_mode == BACKUP_MODE_DIFF_PTRACK )
320
- pg_ptrack_clear ();
321
321
/* Notify end of backup */
322
322
pg_stop_backup (& current );
323
323
@@ -568,6 +568,38 @@ pg_ptrack_clear(void)
568
568
dbname = old_dbname ;
569
569
}
570
570
571
+ static char *
572
+ pg_ptrack_get_and_clear (Oid tablespace_oid ,Oid db_oid ,Oid rel_oid ,size_t * result_size )
573
+ {
574
+ PGresult * res_db ,* res ;
575
+ const char * old_dbname = dbname ;
576
+ char * params [2 ];
577
+ char * result ;
578
+
579
+ reconnect ();
580
+ params [0 ]= palloc (64 );
581
+ params [1 ]= palloc (64 );
582
+ sprintf (params [0 ],"%i" ,db_oid );
583
+ sprintf (params [1 ],"%i" ,rel_oid );
584
+ res_db = execute ("SELECT datname FROM pg_database WHERE oid=$1" ,1 , (const char * * )params );
585
+ disconnect ();
586
+ dbname = pstrdup (PQgetvalue (res_db ,0 ,0 ));
587
+ PQclear (res_db );
588
+
589
+ reconnect ();
590
+ sprintf (params [0 ],"%i" ,tablespace_oid );
591
+ res = execute ("SELECT pg_ptrack_get_and_clear($1, $2)" ,2 , (const char * * )params );
592
+ result = (char * )PQunescapeBytea ((unsignedchar * )PQgetvalue (res ,0 ,0 ),result_size );
593
+ PQclear (res );
594
+ pfree (params [0 ]);
595
+ pfree (params [1 ]);
596
+
597
+ pfree ((char * )dbname );
598
+ dbname = old_dbname ;
599
+
600
+ return result ;
601
+ }
602
+
571
603
static void
572
604
wait_for_archive (pgBackup * backup ,const char * sql )
573
605
{
@@ -907,7 +939,7 @@ add_files(parray *files, const char *root, bool add_root, bool is_pgdata)
907
939
relative = file -> path + strlen (root )+ 1 ;
908
940
if (is_pgdata &&
909
941
!path_is_prefix_of_path ("base" ,relative )&&
910
- !path_is_prefix_of_path ("global" ,relative )&&
942
+ /* !path_is_prefix_of_path("global", relative) &&*/
911
943
!path_is_prefix_of_path ("pg_tblspc" ,relative ))
912
944
continue ;
913
945
@@ -1062,35 +1094,45 @@ void make_pagemap_from_ptrack(parray *files)
1062
1094
pgFile * p = (pgFile * )parray_get (files ,i );
1063
1095
if (p -> ptrack_path != NULL )
1064
1096
{
1065
- DataPage page ;
1066
- char * flat_memory ,* flat_mamory_cur ;
1097
+ char * flat_memory ;
1098
+ char * tmp_path = p -> ptrack_path ;
1099
+ char * tablespace ;
1100
+ size_t path_length = strlen (p -> ptrack_path );
1067
1101
size_t flat_size = 0 ;
1068
1102
size_t start_addr ;
1069
- struct stat st ;
1103
+ Oid db_oid ,rel_oid ,tablespace_oid = 0 ;
1104
+ int sep_iter ,sep_count = 0 ;
1105
+ tablespace = palloc0 (64 );
1070
1106
1071
- FILE * ptrack_file = fopen ( p -> ptrack_path , "r" );
1072
- if ( ptrack_file == NULL )
1107
+ /* Find target path*/
1108
+ for ( sep_iter = ( int ) path_length ; sep_iter >= 0 ; sep_iter -- )
1073
1109
{
1074
- elog (ERROR ,"cannot open ptrack file \"%s\": %s" ,p -> ptrack_path ,
1075
- strerror (errno ));
1110
+ if (IS_DIR_SEP (tmp_path [sep_iter ]))
1111
+ {
1112
+ sep_count ++ ;
1113
+ }
1114
+ if (sep_count == 3 )
1115
+ {
1116
+ tmp_path += sep_iter + 1 ;
1117
+ break ;
1118
+ }
1076
1119
}
1120
+ /* For unix only now */
1121
+ sscanf (tmp_path ,"%[^/]/%u/%u_ptrack" ,tablespace ,& db_oid ,& rel_oid );
1122
+ if (strcmp (tablespace ,"base" )!= 0 && strcmp (tablespace ,"global" )!= 0 )
1123
+ sscanf (tablespace ,"%i" ,& tablespace_oid );
1077
1124
1078
- fstat (fileno (ptrack_file ),& st );
1079
- flat_size = st .st_size - (st .st_size /BLCKSZ )* MAXALIGN (SizeOfPageHeaderData );
1080
- flat_mamory_cur = flat_memory = pg_malloc (flat_size );
1125
+ flat_memory = pg_ptrack_get_and_clear (tablespace_oid ,
1126
+ db_oid ,
1127
+ rel_oid ,
1128
+ & flat_size );
1081
1129
1082
- while (fread (page .data ,BLCKSZ ,1 ,ptrack_file )== 1 )
1083
- {
1084
- char * map = PageGetContents (page .data );
1085
- memcpy (flat_memory ,map ,MAPSIZE );
1086
- flat_mamory_cur += MAPSIZE ;
1087
- }
1088
- fclose (ptrack_file );
1089
1130
start_addr = (RELSEG_SIZE /8 )* p -> segno ;
1090
1131
p -> pagemap .bitmapsize = start_addr + RELSEG_SIZE /8 > flat_size ?flat_size - start_addr :RELSEG_SIZE /8 ;
1091
1132
p -> pagemap .bitmap = pg_malloc (p -> pagemap .bitmapsize );
1092
1133
memcpy (p -> pagemap .bitmap ,flat_memory + start_addr ,p -> pagemap .bitmapsize );
1093
1134
pg_free (flat_memory );
1135
+ pg_free (tablespace );
1094
1136
}
1095
1137
}
1096
1138
}