@@ -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 ((unsigned char * )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
}
0 commit comments