mirror of
https://github.com/postgrespro/pg_probackup.git
synced 2026-06-21 01:34:15 +02:00
[Issue #228]: bufferization of writes to page header map
This commit is contained in:
+10
-8
@@ -475,11 +475,12 @@ catalog_get_backup_list(const char *instance_name, time_t requested_backup_id)
|
||||
join_path_components(backup->database_dir, backup->root_dir, DATABASE_DIR);
|
||||
|
||||
/* block header map, TODO: move to separate function */
|
||||
backup->hdr_map.path = pgut_malloc(MAXPGPATH);
|
||||
join_path_components(backup->hdr_map.path, backup->database_dir, HEADER_MAP);
|
||||
backup->hdr_map.path_tmp = pgut_malloc(MAXPGPATH);
|
||||
join_path_components(backup->hdr_map.path_tmp, backup->database_dir, HEADER_MAP_TMP);
|
||||
backup->hdr_map.fp = NULL;
|
||||
backup->hdr_map.buf = NULL;
|
||||
backup->hdr_map.path = pgut_malloc(MAXPGPATH);
|
||||
join_path_components(backup->hdr_map.path, backup->root_dir, HEADER_MAP);
|
||||
backup->hdr_map.path_tmp = pgut_malloc(MAXPGPATH);
|
||||
join_path_components(backup->hdr_map.path_tmp, backup->root_dir, HEADER_MAP_TMP);
|
||||
|
||||
/* TODO: save encoded backup id */
|
||||
backup->backup_id = backup->start_time;
|
||||
@@ -855,11 +856,12 @@ pgBackupCreateDir(pgBackup *backup)
|
||||
join_path_components(backup->database_dir, backup->root_dir, DATABASE_DIR);
|
||||
|
||||
/* block header map */
|
||||
backup->hdr_map.path = pgut_malloc(MAXPGPATH);
|
||||
join_path_components(backup->hdr_map.path, backup->database_dir, HEADER_MAP);
|
||||
backup->hdr_map.path_tmp = pgut_malloc(MAXPGPATH);
|
||||
join_path_components(backup->hdr_map.path_tmp, backup->database_dir, HEADER_MAP_TMP);
|
||||
backup->hdr_map.fp = NULL;
|
||||
backup->hdr_map.buf = NULL;
|
||||
backup->hdr_map.path = pgut_malloc(MAXPGPATH);
|
||||
join_path_components(backup->hdr_map.path, backup->root_dir, HEADER_MAP);
|
||||
backup->hdr_map.path_tmp = pgut_malloc(MAXPGPATH);
|
||||
join_path_components(backup->hdr_map.path_tmp, backup->root_dir, HEADER_MAP_TMP);
|
||||
|
||||
/* create directories for actual backup files */
|
||||
for (i = 0; i < parray_num(subdirs); i++)
|
||||
|
||||
+3
-2
@@ -2198,8 +2198,9 @@ write_page_headers(BackupPageHeader2 *headers, pgFile *file, HeaderMap *hdr_map,
|
||||
elog(ERROR, "Cannot open header file \"%s\": %s",
|
||||
map_path, strerror(errno));
|
||||
|
||||
/* disable buffering for header file */
|
||||
setvbuf(hdr_map->fp, NULL, _IONBF, BUFSIZ);
|
||||
/* enable buffering for header file */
|
||||
hdr_map->buf = pgut_malloc(STDIO_BUFSIZE);
|
||||
setvbuf(hdr_map->fp, hdr_map->buf, _IOFBF, STDIO_BUFSIZE);
|
||||
|
||||
/* update file permission */
|
||||
if (chmod(map_path, FILE_PERMISSION) == -1)
|
||||
|
||||
+6
-2
@@ -720,6 +720,10 @@ merge_chain(parray *parent_chain, pgBackup *full_backup, pgBackup *dest_backup)
|
||||
if (rename(full_backup->hdr_map.path_tmp, full_backup->hdr_map.path) == -1)
|
||||
elog(ERROR, "Could not rename file \"%s\" to \"%s\": %s",
|
||||
full_backup->hdr_map.path_tmp, full_backup->hdr_map.path, strerror(errno));
|
||||
|
||||
full_backup->hdr_map.fp = NULL;
|
||||
pg_free(full_backup->hdr_map.buf);
|
||||
full_backup->hdr_map.buf = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -866,8 +870,8 @@ merge_rename:
|
||||
|
||||
/* Reinit some path variables */
|
||||
join_path_components(full_backup->database_dir, full_backup->root_dir, DATABASE_DIR);
|
||||
join_path_components(full_backup->hdr_map.path, full_backup->database_dir, HEADER_MAP);
|
||||
join_path_components(full_backup->hdr_map.path_tmp, full_backup->database_dir, HEADER_MAP_TMP);
|
||||
join_path_components(full_backup->hdr_map.path, full_backup->root_dir, HEADER_MAP);
|
||||
join_path_components(full_backup->hdr_map.path_tmp, full_backup->root_dir, HEADER_MAP_TMP);
|
||||
full_backup->hdr_map.fp = NULL;
|
||||
|
||||
/* If we crash here, it will produce full backup in MERGED
|
||||
|
||||
+2
-1
@@ -365,6 +365,7 @@ typedef struct HeaderMap
|
||||
{
|
||||
char *path;
|
||||
char *path_tmp; /* used only in merge */
|
||||
char *buf; /* buffer */
|
||||
FILE *fp;
|
||||
off_t offset;
|
||||
pthread_mutex_t mutex;
|
||||
@@ -449,7 +450,7 @@ struct pgBackup
|
||||
|
||||
pg_crc32 content_crc;
|
||||
|
||||
/* mutex used for write access to block header map */
|
||||
/* map used for access to page headers */
|
||||
HeaderMap hdr_map;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user