Skip to content

Commit 86fd795

Browse files
committed
[Issue #172] Optimize remote backup in PAGE and PTRACK modes
1 parent 6d0eb79 commit 86fd795

File tree

12 files changed

+1286
-722
lines changed

12 files changed

+1286
-722
lines changed

src/data.c

Lines changed: 290 additions & 317 deletions
Large diffs are not rendered by default.

src/dir.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,7 +1693,6 @@ write_database_map(pgBackup *backup, parray *database_map, parray *backup_files_
16931693
char database_dir[MAXPGPATH];
16941694
char database_map_path[MAXPGPATH];
16951695

1696-
// pgBackupGetPath(backup, path, lengthof(path), DATABASE_DIR);
16971696
join_path_components(database_dir, backup->root_dir, DATABASE_DIR);
16981697
join_path_components(database_map_path, database_dir, DATABASE_MAP);
16991698

@@ -1717,7 +1716,7 @@ write_database_map(pgBackup *backup, parray *database_map, parray *backup_files_
17171716
file->path = pgut_strdup(DATABASE_MAP);
17181717
file->crc = pgFileGetCRC(database_map_path, true, false);
17191718

1720-
file->write_size = file->read_size;
1719+
file->write_size = file->size;
17211720
file->uncompressed_size = file->read_size;
17221721
parray_append(backup_files_list, file);
17231722
}

src/pg_probackup.h

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ extern const char *PROGRAM_EMAIL;
8686
#endif
8787

8888
/* stdio buffer size */
89-
#define STDIO_BUFSIZE 65536
89+
#define STDIO_BUFSIZE 65536
90+
91+
/* retry attempts */
92+
#define PAGE_READ_ATTEMPTS 100
9093

9194
/* Check if an XLogRecPtr value is pointed to 0 offset */
9295
#define XRecOffIsNull(xlrp) \
@@ -170,7 +173,8 @@ typedef struct pgFile
170173
bool exists_in_prev; /* Mark files, both data and regular, that exists in previous backup */
171174
CompressAlg compress_alg; /* compression algorithm applied to the file */
172175
volatile pg_atomic_flag lock;/* lock for synchronization of parallel threads */
173-
datapagemap_t pagemap; /* bitmap of pages updated since previous backup */
176+
datapagemap_t pagemap; /* bitmap of pages updated since previous backup
177+
may take up to 16kB per file */
174178
bool pagemap_isabsent; /* Used to mark files with unknown state of pagemap,
175179
* i.e. datafiles without _ptrack */
176180
} pgFile;
@@ -526,9 +530,9 @@ typedef struct BackupPageHeader
526530

527531
/* Special value for compressed_size field */
528532
#define PageIsOk 0
533+
#define SkipCurrentPage -1
529534
#define PageIsTruncated -2
530-
#define SkipCurrentPage -3
531-
#define PageIsCorrupted -4 /* used by checkdb */
535+
#define PageIsCorrupted -3 /* used by checkdb */
532536

533537

534538
/*
@@ -722,6 +726,18 @@ extern void help_command(char *command);
722726
/* in validate.c */
723727
extern void pgBackupValidate(pgBackup* backup, pgRestoreParams *params);
724728
extern int do_validate_all(void);
729+
extern int validate_one_page(Page page, BlockNumber absolute_blkno,
730+
XLogRecPtr stop_lsn, XLogRecPtr *page_lsn,
731+
uint32 checksum_version);
732+
733+
/* return codes for validate_one_page */
734+
/* TODO: use enum */
735+
#define PAGE_IS_VALID (-1)
736+
#define PAGE_IS_NOT_FOUND (-2)
737+
#define PAGE_IS_ZEROED (-3)
738+
#define PAGE_HEADER_IS_INVALID (-4)
739+
#define PAGE_CHECKSUM_MISMATCH (-5)
740+
#define PAGE_LSN_FROM_FUTURE (-6)
725741

726742
/* in catalog.c */
727743
extern pgBackup *read_backup(const char *instance_name, time_t timestamp);
@@ -945,4 +961,19 @@ extern char *pg_ptrack_get_and_clear(Oid tablespace_oid,
945961
extern XLogRecPtr get_last_ptrack_lsn(PGconn *backup_conn, PGNodeInfo *nodeInfo);
946962
extern parray * pg_ptrack_get_pagemapset(PGconn *backup_conn, const char *ptrack_schema, XLogRecPtr lsn);
947963

964+
/* FIO */
965+
extern int fio_send_pages(FILE* in, FILE* out, pgFile *file, XLogRecPtr horizonLsn,
966+
int calg, int clevel, uint32 checksum_version,
967+
datapagemap_t *pagemap, BlockNumber* err_blknum, char **errormsg);
968+
969+
/* return codes for fio_send_pages */
970+
#define WRITE_FAILED (-1)
971+
#define REMOTE_ERROR (-2)
972+
#define PAGE_CORRUPTION (-3)
973+
#define SEND_OK (-4)
974+
975+
extern void get_header_errormsg(Page page, char **errormsg);
976+
extern void get_checksum_errormsg(Page page, char **errormsg,
977+
BlockNumber absolute_blkno);
978+
948979
#endif /* PG_PROBACKUP_H */

0 commit comments

Comments
 (0)