mirror of
https://github.com/MariaDB/server.git
synced 2025-08-09 22:24:09 +03:00
MDEV-4133: Review InnoDB tablespace allocation patch by Toshikuni Fukaya. If innodb_use_posix_fallocate is set we use posix_fallocate call to extent tablespace allocation instead of pwrite.
This commit is contained in:
@@ -4782,6 +4782,23 @@ retry:
|
|||||||
start_page_no = space->size;
|
start_page_no = space->size;
|
||||||
file_start_page_no = space->size - node->size;
|
file_start_page_no = space->size - node->size;
|
||||||
|
|
||||||
|
#ifdef HAVE_POSIX_FALLOCATE
|
||||||
|
if (srv_use_posix_fallocate) {
|
||||||
|
ulint n_pages = size_after_extend - start_page_no;
|
||||||
|
|
||||||
|
success = os_file_set_size(node->name, node->handle,
|
||||||
|
n_pages * page_size);
|
||||||
|
|
||||||
|
mutex_enter(&fil_system->mutex);
|
||||||
|
if (success) {
|
||||||
|
node->size += n_pages;
|
||||||
|
space->size += n_pages;
|
||||||
|
os_has_said_disk_full = FALSE;
|
||||||
|
}
|
||||||
|
goto complete_io;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Extend at most 64 pages at a time */
|
/* Extend at most 64 pages at a time */
|
||||||
buf_size = ut_min(64, size_after_extend - start_page_no) * page_size;
|
buf_size = ut_min(64, size_after_extend - start_page_no) * page_size;
|
||||||
buf2 = static_cast<byte*>(mem_alloc(buf_size + page_size));
|
buf2 = static_cast<byte*>(mem_alloc(buf_size + page_size));
|
||||||
@@ -4835,10 +4852,15 @@ retry:
|
|||||||
|
|
||||||
space->size += pages_added;
|
space->size += pages_added;
|
||||||
node->size += pages_added;
|
node->size += pages_added;
|
||||||
node->being_extended = FALSE;
|
|
||||||
|
|
||||||
|
#ifdef HAVE_POSIX_FALLOCATE
|
||||||
|
complete_io:
|
||||||
|
fil_node_complete_io(node, fil_system, OS_FILE_READ);
|
||||||
|
#else
|
||||||
fil_node_complete_io(node, fil_system, OS_FILE_WRITE);
|
fil_node_complete_io(node, fil_system, OS_FILE_WRITE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
node->being_extended = FALSE;
|
||||||
*actual_size = space->size;
|
*actual_size = space->size;
|
||||||
|
|
||||||
#ifndef UNIV_HOTBACKUP
|
#ifndef UNIV_HOTBACKUP
|
||||||
|
@@ -3197,6 +3197,7 @@ innobase_change_buffering_inited_ok:
|
|||||||
srv_use_posix_fallocate = (ibool) innobase_use_fallocate;
|
srv_use_posix_fallocate = (ibool) innobase_use_fallocate;
|
||||||
#endif
|
#endif
|
||||||
srv_use_atomic_writes = (ibool) innobase_use_atomic_writes;
|
srv_use_atomic_writes = (ibool) innobase_use_atomic_writes;
|
||||||
|
|
||||||
if (innobase_use_atomic_writes) {
|
if (innobase_use_atomic_writes) {
|
||||||
fprintf(stderr, "InnoDB: using atomic writes.\n");
|
fprintf(stderr, "InnoDB: using atomic writes.\n");
|
||||||
|
|
||||||
@@ -3211,13 +3212,13 @@ innobase_change_buffering_inited_ok:
|
|||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
if(!innobase_file_flush_method ||
|
if(!innobase_file_flush_method ||
|
||||||
!strstr(innobase_file_flush_method, "O_DIRECT")) {
|
!strstr(innobase_file_flush_method, "O_DIRECT")) {
|
||||||
innobase_file_flush_method =
|
innobase_file_flush_method =
|
||||||
srv_file_flush_method_str = (char*)"O_DIRECT";
|
srv_file_flush_method_str = (char*)"O_DIRECT";
|
||||||
fprintf(stderr, "InnoDB: using O_DIRECT due to atomic writes.\n");
|
fprintf(stderr, "InnoDB: using O_DIRECT due to atomic writes.\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_POSIX_FALLOCATE
|
#ifdef HAVE_POSIX_FALLOCATE
|
||||||
/* Due to a bug in directFS, using atomics needs
|
/* Due to a bug in directFS, using atomics needs
|
||||||
* posix_fallocate to extend the file
|
* posix_fallocate to extend the file
|
||||||
* pwrite() past end of the file won't work
|
* pwrite() past end of the file won't work
|
||||||
*/
|
*/
|
||||||
@@ -16892,7 +16893,11 @@ ib_senderrf(
|
|||||||
str[size - 1] = 0x0;
|
str[size - 1] = 0x0;
|
||||||
vsnprintf(str, size, format, args);
|
vsnprintf(str, size, format, args);
|
||||||
#elif HAVE_VASPRINTF
|
#elif HAVE_VASPRINTF
|
||||||
(void) vasprintf(&str, format, args);
|
if (vasprintf(&str, format, args) == -1) {
|
||||||
|
/* In case of failure use a fixed length string */
|
||||||
|
str = static_cast<char*>(malloc(BUFSIZ));
|
||||||
|
my_vsnprintf(str, BUFSIZ, format, args);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
/* Use a fixed length string. */
|
/* Use a fixed length string. */
|
||||||
str = static_cast<char*>(malloc(BUFSIZ));
|
str = static_cast<char*>(malloc(BUFSIZ));
|
||||||
@@ -16968,7 +16973,11 @@ ib_errf(
|
|||||||
str[size - 1] = 0x0;
|
str[size - 1] = 0x0;
|
||||||
vsnprintf(str, size, format, args);
|
vsnprintf(str, size, format, args);
|
||||||
#elif HAVE_VASPRINTF
|
#elif HAVE_VASPRINTF
|
||||||
(void) vasprintf(&str, format, args);
|
if (vasprintf(&str, format, args) == -1) {
|
||||||
|
/* In case of failure use a fixed length string */
|
||||||
|
str = static_cast<char*>(malloc(BUFSIZ));
|
||||||
|
my_vsnprintf(str, BUFSIZ, format, args);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
/* Use a fixed length string. */
|
/* Use a fixed length string. */
|
||||||
str = static_cast<char*>(malloc(BUFSIZ));
|
str = static_cast<char*>(malloc(BUFSIZ));
|
||||||
@@ -17002,7 +17011,11 @@ ib_logf(
|
|||||||
str[size - 1] = 0x0;
|
str[size - 1] = 0x0;
|
||||||
vsnprintf(str, size, format, args);
|
vsnprintf(str, size, format, args);
|
||||||
#elif HAVE_VASPRINTF
|
#elif HAVE_VASPRINTF
|
||||||
(void) vasprintf(&str, format, args);
|
if (vasprintf(&str, format, args) == -1) {
|
||||||
|
/* In case of failure use a fixed length string */
|
||||||
|
str = static_cast<char*>(malloc(BUFSIZ));
|
||||||
|
my_vsnprintf(str, BUFSIZ, format, args);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
/* Use a fixed length string. */
|
/* Use a fixed length string. */
|
||||||
str = static_cast<char*>(malloc(BUFSIZ));
|
str = static_cast<char*>(malloc(BUFSIZ));
|
||||||
|
@@ -2099,6 +2099,23 @@ os_file_set_size(
|
|||||||
|
|
||||||
current_size = 0;
|
current_size = 0;
|
||||||
|
|
||||||
|
#ifdef HAVE_POSIX_FALLOCATE
|
||||||
|
if (srv_use_posix_fallocate) {
|
||||||
|
|
||||||
|
if (posix_fallocate(file, current_size, size) == -1) {
|
||||||
|
|
||||||
|
fprintf(stderr, "InnoDB: Error: preallocating file "
|
||||||
|
"space for file \'%s\' failed. Current size "
|
||||||
|
"%lu, desired size %lu\n",
|
||||||
|
name, current_size, size);
|
||||||
|
os_file_handle_error_no_exit(name, "posix_fallocate", FALSE);
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
return(TRUE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Write up to 1 megabyte at a time. */
|
/* Write up to 1 megabyte at a time. */
|
||||||
buf_size = ut_min(64, (ulint) (size / UNIV_PAGE_SIZE))
|
buf_size = ut_min(64, (ulint) (size / UNIV_PAGE_SIZE))
|
||||||
* UNIV_PAGE_SIZE;
|
* UNIV_PAGE_SIZE;
|
||||||
|
@@ -2136,7 +2136,12 @@ corruption:
|
|||||||
if (index->online_log->head.blocks) {
|
if (index->online_log->head.blocks) {
|
||||||
#ifdef HAVE_FTRUNCATE
|
#ifdef HAVE_FTRUNCATE
|
||||||
/* Truncate the file in order to save space. */
|
/* Truncate the file in order to save space. */
|
||||||
ftruncate(index->online_log->fd, 0);
|
if (ftruncate(index->online_log->fd, 0) == -1) {
|
||||||
|
fprintf(stderr, "InnoDB: Error: Truncate of file "
|
||||||
|
"\'%s\' failed with error %d:%s\n",
|
||||||
|
index->name + 1, errno, strerror(errno));
|
||||||
|
goto corruption;
|
||||||
|
}
|
||||||
#endif /* HAVE_FTRUNCATE */
|
#endif /* HAVE_FTRUNCATE */
|
||||||
index->online_log->head.blocks
|
index->online_log->head.blocks
|
||||||
= index->online_log->tail.blocks = 0;
|
= index->online_log->tail.blocks = 0;
|
||||||
@@ -2922,7 +2927,12 @@ corruption:
|
|||||||
if (index->online_log->head.blocks) {
|
if (index->online_log->head.blocks) {
|
||||||
#ifdef HAVE_FTRUNCATE
|
#ifdef HAVE_FTRUNCATE
|
||||||
/* Truncate the file in order to save space. */
|
/* Truncate the file in order to save space. */
|
||||||
ftruncate(index->online_log->fd, 0);
|
if (ftruncate(index->online_log->fd, 0) == -1) {
|
||||||
|
fprintf(stderr, "InnoDB: Error: Truncate of file "
|
||||||
|
"\'%s\' failed with error %d:%s\n",
|
||||||
|
index->name + 1, errno, strerror(errno));
|
||||||
|
goto corruption;
|
||||||
|
}
|
||||||
#endif /* HAVE_FTRUNCATE */
|
#endif /* HAVE_FTRUNCATE */
|
||||||
index->online_log->head.blocks
|
index->online_log->head.blocks
|
||||||
= index->online_log->tail.blocks = 0;
|
= index->online_log->tail.blocks = 0;
|
||||||
|
@@ -4938,10 +4938,11 @@ fil_extend_space_to_desired_size(
|
|||||||
|
|
||||||
mem_free(buf2);
|
mem_free(buf2);
|
||||||
|
|
||||||
fil_node_complete_io(node, fil_system, OS_FILE_WRITE);
|
|
||||||
|
|
||||||
#ifdef HAVE_POSIX_FALLOCATE
|
#ifdef HAVE_POSIX_FALLOCATE
|
||||||
complete_io:
|
complete_io:
|
||||||
|
fil_node_complete_io(node, fil_system, OS_FILE_READ);
|
||||||
|
#else
|
||||||
|
fil_node_complete_io(node, fil_system, OS_FILE_WRITE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*actual_size = space->size;
|
*actual_size = space->size;
|
||||||
|
Reference in New Issue
Block a user