[Issue #228]: bufferization of writes to page header map

This commit is contained in:
Grigory Smolkin
2020-06-20 19:08:14 +03:00
parent a7eb948a75
commit 0322c97a5e
4 changed files with 21 additions and 13 deletions
+10 -8
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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;
};