diff options
author | Seppo Jaakola <seppo.jaakola@codership.com> | 2013-05-26 11:26:58 +0300 |
---|---|---|
committer | Seppo Jaakola <seppo.jaakola@codership.com> | 2013-05-26 11:26:58 +0300 |
commit | bd0eae595fc5d050913ea01bd4c6a8e47f379176 (patch) | |
tree | dc2915fa2f49d6c015d7f6f4d54fda9ae0ae046e /storage/xtradb/os | |
parent | 9d1546fe2cdced5efb4af831fa2e560b7f80fb54 (diff) | |
parent | cb246b20d6e0dad16797b9e09bef6f0431b88d37 (diff) | |
download | mariadb-git-bd0eae595fc5d050913ea01bd4c6a8e47f379176.tar.gz |
References: MDEV-4572 - merge with mariaDB 5.5.31
bzr merge lp:maria/5.5 -rtag:mariadb-5.5.31
Text conflict in cmake/cpack_rpm.cmake
Text conflict in debian/dist/Debian/control
Text conflict in debian/dist/Ubuntu/control
Text conflict in sql/CMakeLists.txt
Conflict adding file sql/db.opt. Moved existing file to sql/db.opt.moved.
Conflict adding file sql/db.opt.moved. Moved existing file to sql/db.opt.moved.moved.
Text conflict in sql/mysqld.cc
Text conflict in support-files/mysql.spec.sh
8 conflicts encountered.
Diffstat (limited to 'storage/xtradb/os')
-rw-r--r-- | storage/xtradb/os/os0file.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/storage/xtradb/os/os0file.c b/storage/xtradb/os/os0file.c index 97777e21df8..8cdafb0aaef 100644 --- a/storage/xtradb/os/os0file.c +++ b/storage/xtradb/os/os0file.c @@ -1467,6 +1467,42 @@ os_file_set_nocache( #endif } + +#ifdef __linux__ +#include <sys/ioctl.h> +#ifndef DFS_IOCTL_ATOMIC_WRITE_SET +#define DFS_IOCTL_ATOMIC_WRITE_SET _IOW(0x95, 2, uint) +#endif +static int os_file_set_atomic_writes(os_file_t file, const char *name) +{ + int atomic_option = 1; + + int ret = ioctl (file, DFS_IOCTL_ATOMIC_WRITE_SET, &atomic_option); + + if (ret) { + fprintf(stderr, + "InnoDB : can't use atomic write on %s, errno %d\n", + name, errno); + return ret; + } + return ret; +} +#else +static int os_file_set_atomic_writes(os_file_t file, const char *name) +{ + fprintf(stderr, + "InnoDB : can't use atomic writes on %s - not implemented on this platform." + "innodb_use_atomic_writes needs to be 0.\n", + name); +#ifdef _WIN32 + SetLastError(ERROR_INVALID_FUNCTION); +#else + errno = EINVAL; +#endif + return -1; +} +#endif + /****************************************************************//** NOTE! Use the corresponding macro os_file_create(), not directly this function! @@ -1631,6 +1667,13 @@ try_again: } } + if (srv_use_atomic_writes && type == OS_DATA_FILE && + os_file_set_atomic_writes(file, name)) { + CloseHandle(file); + *success = FALSE; + file = INVALID_HANDLE_VALUE; + } + return(file); #else /* __WIN__ */ os_file_t file; @@ -1752,6 +1795,12 @@ try_again: file = -1; } #endif /* USE_FILE_LOCK */ + if (srv_use_atomic_writes && type == OS_DATA_FILE + && os_file_set_atomic_writes(file, name)) { + close(file); + *success = FALSE; + file = -1; + } return(file); #endif /* __WIN__ */ @@ -2099,6 +2148,28 @@ os_file_set_size( current_size = 0; desired_size = (ib_int64_t)size + (((ib_int64_t)size_high) << 32); +#ifdef HAVE_POSIX_FALLOCATE + if (srv_use_posix_fallocate) { + if (posix_fallocate(file, current_size, desired_size) == -1) { + fprintf(stderr, + "InnoDB: Error: preallocating data for" + " file %s failed at\n" + "InnoDB: offset 0 size %lld %lld. Operating system" + " error number %d.\n" + "InnoDB: Check that the disk is not full" + " or a disk quota exceeded.\n" + "InnoDB: Some operating system error numbers" + " are described at\n" + "InnoDB: " + REFMAN "operating-system-error-codes.html\n", + name, (long long)size_high, (long long)size, errno); + + return (FALSE); + } + return (TRUE); + } +#endif + /* Write up to 1 megabyte at a time. */ buf_size = ut_min(64, (ulint) (desired_size / UNIV_PAGE_SIZE)) * UNIV_PAGE_SIZE; |