diff options
author | Vladislav Vaintroub <wlad@montyprogram.com> | 2013-04-06 00:36:10 +0200 |
---|---|---|
committer | Vladislav Vaintroub <wlad@montyprogram.com> | 2013-04-06 00:36:10 +0200 |
commit | ed949df15a27117b52d3746caef663d2ac367608 (patch) | |
tree | a017bb865f339c4b3932393b5349e96cad28028d /storage/innobase/fil | |
parent | 0aa607a01aebc0c98e9f38752af8b1acd1fc3bc2 (diff) | |
download | mariadb-git-ed949df15a27117b52d3746caef663d2ac367608.tar.gz |
MDEV-4338 - Support FusionIO/directFS atomic writes
Diffstat (limited to 'storage/innobase/fil')
-rw-r--r-- | storage/innobase/fil/fil0fil.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/storage/innobase/fil/fil0fil.c b/storage/innobase/fil/fil0fil.c index 2f875663039..c3a206fb009 100644 --- a/storage/innobase/fil/fil0fil.c +++ b/storage/innobase/fil/fil0fil.c @@ -4023,6 +4023,24 @@ fil_extend_space_to_desired_size( start_page_no = space->size; file_start_page_no = space->size - node->size; +#ifdef HAVE_POSIX_FALLOCATE + if (srv_use_posix_fallocate) { + offset_high = size_after_extend * page_size / (4ULL*1024*1024*1024); + offset_low = size_after_extend * page_size % (4ULL*1024*1024*1024); + + mutex_exit(&fil_system->mutex); + success = os_file_set_size(node->name, node->handle, + offset_low, offset_high); + mutex_enter(&fil_system->mutex); + if (success) { + node->size += (size_after_extend - start_page_no); + space->size += (size_after_extend - start_page_no); + os_has_said_disk_full = FALSE; + } + goto complete_io; + } +#endif + /* Extend at most 64 pages at a time */ buf_size = ut_min(64, size_after_extend - start_page_no) * page_size; buf2 = mem_alloc(buf_size + page_size); @@ -4075,6 +4093,10 @@ fil_extend_space_to_desired_size( mem_free(buf2); +#ifdef HAVE_POSIX_FALLOCATE +complete_io: +#endif + fil_node_complete_io(node, fil_system, OS_FILE_WRITE); *actual_size = space->size; |