Skip to content

Commit 0322c97

Browse files
committed
[Issue #228]: bufferization of writes to page header map
1 parent a7eb948 commit 0322c97

File tree

4 files changed

+19
-11
lines changed

4 files changed

+19
-11
lines changed

src/catalog.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -475,11 +475,12 @@ catalog_get_backup_list(const char *instance_name, time_t requested_backup_id)
475475
join_path_components(backup->database_dir, backup->root_dir, DATABASE_DIR);
476476

477477
/* block header map, TODO: move to separate function */
478+
backup->hdr_map.fp = NULL;
479+
backup->hdr_map.buf = NULL;
478480
backup->hdr_map.path = pgut_malloc(MAXPGPATH);
479-
join_path_components(backup->hdr_map.path, backup->database_dir, HEADER_MAP);
481+
join_path_components(backup->hdr_map.path, backup->root_dir, HEADER_MAP);
480482
backup->hdr_map.path_tmp = pgut_malloc(MAXPGPATH);
481-
join_path_components(backup->hdr_map.path_tmp, backup->database_dir, HEADER_MAP_TMP);
482-
backup->hdr_map.fp = NULL;
483+
join_path_components(backup->hdr_map.path_tmp, backup->root_dir, HEADER_MAP_TMP);
483484

484485
/* TODO: save encoded backup id */
485486
backup->backup_id = backup->start_time;
@@ -855,11 +856,12 @@ pgBackupCreateDir(pgBackup *backup)
855856
join_path_components(backup->database_dir, backup->root_dir, DATABASE_DIR);
856857

857858
/* block header map */
859+
backup->hdr_map.fp = NULL;
860+
backup->hdr_map.buf = NULL;
858861
backup->hdr_map.path = pgut_malloc(MAXPGPATH);
859-
join_path_components(backup->hdr_map.path, backup->database_dir, HEADER_MAP);
862+
join_path_components(backup->hdr_map.path, backup->root_dir, HEADER_MAP);
860863
backup->hdr_map.path_tmp = pgut_malloc(MAXPGPATH);
861-
join_path_components(backup->hdr_map.path_tmp, backup->database_dir, HEADER_MAP_TMP);
862-
backup->hdr_map.fp = NULL;
864+
join_path_components(backup->hdr_map.path_tmp, backup->root_dir, HEADER_MAP_TMP);
863865

864866
/* create directories for actual backup files */
865867
for (i = 0; i < parray_num(subdirs); i++)

src/data.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2198,8 +2198,9 @@ write_page_headers(BackupPageHeader2 *headers, pgFile *file, HeaderMap *hdr_map,
21982198
elog(ERROR, "Cannot open header file \"%s\": %s",
21992199
map_path, strerror(errno));
22002200

2201-
/* disable buffering for header file */
2202-
setvbuf(hdr_map->fp, NULL, _IONBF, BUFSIZ);
2201+
/* enable buffering for header file */
2202+
hdr_map->buf = pgut_malloc(STDIO_BUFSIZE);
2203+
setvbuf(hdr_map->fp, hdr_map->buf, _IOFBF, STDIO_BUFSIZE);
22032204

22042205
/* update file permission */
22052206
if (chmod(map_path, FILE_PERMISSION) == -1)

src/merge.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,10 @@ merge_chain(parray *parent_chain, pgBackup *full_backup, pgBackup *dest_backup)
720720
if (rename(full_backup->hdr_map.path_tmp, full_backup->hdr_map.path) == -1)
721721
elog(ERROR, "Could not rename file \"%s\" to \"%s\": %s",
722722
full_backup->hdr_map.path_tmp, full_backup->hdr_map.path, strerror(errno));
723+
724+
full_backup->hdr_map.fp = NULL;
725+
pg_free(full_backup->hdr_map.buf);
726+
full_backup->hdr_map.buf = NULL;
723727
}
724728

725729
/*
@@ -866,8 +870,8 @@ merge_chain(parray *parent_chain, pgBackup *full_backup, pgBackup *dest_backup)
866870

867871
/* Reinit some path variables */
868872
join_path_components(full_backup->database_dir, full_backup->root_dir, DATABASE_DIR);
869-
join_path_components(full_backup->hdr_map.path, full_backup->database_dir, HEADER_MAP);
870-
join_path_components(full_backup->hdr_map.path_tmp, full_backup->database_dir, HEADER_MAP_TMP);
873+
join_path_components(full_backup->hdr_map.path, full_backup->root_dir, HEADER_MAP);
874+
join_path_components(full_backup->hdr_map.path_tmp, full_backup->root_dir, HEADER_MAP_TMP);
871875
full_backup->hdr_map.fp = NULL;
872876

873877
/* If we crash here, it will produce full backup in MERGED

src/pg_probackup.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ typedef struct HeaderMap
365365
{
366366
char *path;
367367
char *path_tmp; /* used only in merge */
368+
char *buf; /* buffer */
368369
FILE *fp;
369370
off_t offset;
370371
pthread_mutex_t mutex;
@@ -449,7 +450,7 @@ struct pgBackup
449450

450451
pg_crc32 content_crc;
451452

452-
/* mutex used for write access to block header map */
453+
/* map used for access to page headers */
453454
HeaderMap hdr_map;
454455
};
455456

0 commit comments

Comments
 (0)