[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); join_path_components(backup->database_dir, backup->root_dir, DATABASE_DIR);
/* block header map, TODO: move to separate function */ /* 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.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 */ /* TODO: save encoded backup id */
backup->backup_id = backup->start_time; backup->backup_id = backup->start_time;
@@ -855,11 +856,12 @@ pgBackupCreateDir(pgBackup *backup)
join_path_components(backup->database_dir, backup->root_dir, DATABASE_DIR); join_path_components(backup->database_dir, backup->root_dir, DATABASE_DIR);
/* block header map */ /* 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.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 */ /* create directories for actual backup files */
for (i = 0; i < parray_num(subdirs); i++) 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", elog(ERROR, "Cannot open header file \"%s\": %s",
map_path, strerror(errno)); map_path, strerror(errno));
/* disable buffering for header file */ /* enable buffering for header file */
setvbuf(hdr_map->fp, NULL, _IONBF, BUFSIZ); hdr_map->buf = pgut_malloc(STDIO_BUFSIZE);
setvbuf(hdr_map->fp, hdr_map->buf, _IOFBF, STDIO_BUFSIZE);
/* update file permission */ /* update file permission */
if (chmod(map_path, FILE_PERMISSION) == -1) 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) if (rename(full_backup->hdr_map.path_tmp, full_backup->hdr_map.path) == -1)
elog(ERROR, "Could not rename file \"%s\" to \"%s\": %s", 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.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 */ /* Reinit some path variables */
join_path_components(full_backup->database_dir, full_backup->root_dir, DATABASE_DIR); 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, full_backup->root_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_tmp, full_backup->root_dir, HEADER_MAP_TMP);
full_backup->hdr_map.fp = NULL; full_backup->hdr_map.fp = NULL;
/* If we crash here, it will produce full backup in MERGED /* 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;
char *path_tmp; /* used only in merge */ char *path_tmp; /* used only in merge */
char *buf; /* buffer */
FILE *fp; FILE *fp;
off_t offset; off_t offset;
pthread_mutex_t mutex; pthread_mutex_t mutex;
@@ -449,7 +450,7 @@ struct pgBackup
pg_crc32 content_crc; pg_crc32 content_crc;
/* mutex used for write access to block header map */ /* map used for access to page headers */
HeaderMap hdr_map; HeaderMap hdr_map;
}; };