MDEV-16548 - Innodb fails to start on older kernels that don't support F_DUPFD_CLOEXEC

InnoDB duplicates file descriptor returned by create_temp_file() to
workaround further inconsistent use of this descriptor.

Use mysys file descriptors consistently for innobase_mysql_tmpfile(NULL).
Mostly close it by appropriate mysys wrappers.
This commit is contained in:
Sergey Vojtovich 2019-05-23 12:55:03 +04:00
parent 893472d005
commit 5f5a0b3bb6
4 changed files with 16 additions and 23 deletions

View File

@ -6436,7 +6436,7 @@ void dict_sys_t::close()
if (dict_foreign_err_file) if (dict_foreign_err_file)
{ {
fclose(dict_foreign_err_file); my_fclose(dict_foreign_err_file, MYF(MY_WME));
dict_foreign_err_file = NULL; dict_foreign_err_file = NULL;
} }

View File

@ -557,7 +557,7 @@ void lock_sys_t::close()
if (!m_initialised) return; if (!m_initialised) return;
if (lock_latest_err_file != NULL) { if (lock_latest_err_file != NULL) {
fclose(lock_latest_err_file); my_fclose(lock_latest_err_file, MYF(MY_WME));
lock_latest_err_file = NULL; lock_latest_err_file = NULL;
} }

View File

@ -1131,23 +1131,14 @@ os_file_create_tmpfile()
{ {
FILE* file = NULL; FILE* file = NULL;
WAIT_ALLOW_WRITES(); WAIT_ALLOW_WRITES();
os_file_t fd = innobase_mysql_tmpfile(NULL); File fd = mysql_tmpfile("ib");
if (fd != OS_FILE_CLOSED) { if (fd >= 0) {
#ifdef _WIN32 file = my_fdopen(fd, 0, O_RDWR|O_TRUNC|O_CREAT|FILE_BINARY,
int crt_fd = _open_osfhandle((intptr_t)HANDLE(fd), 0); MYF(MY_WME));
if (crt_fd != -1) {
file = fdopen(crt_fd, "w+b");
if (!file) {
close(crt_fd);
}
}
#else
file = fdopen(fd, "w+b");
if (!file) { if (!file) {
close(fd); my_close(fd, MYF(MY_WME));
} }
#endif
} }
if (file == NULL) { if (file == NULL) {
@ -2145,7 +2136,7 @@ and native aio.
bool bool
AIO::is_linux_native_aio_supported() AIO::is_linux_native_aio_supported()
{ {
int fd; File fd;
io_context_t io_ctx; io_context_t io_ctx;
char name[1000]; char name[1000];
@ -2158,7 +2149,7 @@ AIO::is_linux_native_aio_supported()
} else if (!srv_read_only_mode) { } else if (!srv_read_only_mode) {
/* Now check if tmpdir supports native aio ops. */ /* Now check if tmpdir supports native aio ops. */
fd = innobase_mysql_tmpfile(NULL); fd = mysql_tmpfile("ib");
if (fd < 0) { if (fd < 0) {
ib::warn() ib::warn()
@ -2185,7 +2176,7 @@ AIO::is_linux_native_aio_supported()
strcpy(name + dirnamelen, "ib_logfile0"); strcpy(name + dirnamelen, "ib_logfile0");
fd = open(name, O_RDONLY | O_CLOEXEC); fd = my_open(name, O_RDONLY | O_CLOEXEC, MYF(0));
if (fd == -1) { if (fd == -1) {
@ -2230,7 +2221,7 @@ AIO::is_linux_native_aio_supported()
} }
ut_free(buf); ut_free(buf);
close(fd); my_close(fd, MYF(MY_WME));
switch (err) { switch (err) {
case 1: case 1:

View File

@ -1422,7 +1422,9 @@ dberr_t srv_start(bool create_new_db)
fil_path_to_mysql_datadir, fil_path_to_mysql_datadir,
os_proc_get_number()); os_proc_get_number());
srv_monitor_file = fopen(srv_monitor_file_name, "w+"); srv_monitor_file = my_fopen(srv_monitor_file_name,
O_RDWR|O_TRUNC|O_CREAT,
MYF(MY_WME));
if (!srv_monitor_file) { if (!srv_monitor_file) {
ib::error() << "Unable to create " ib::error() << "Unable to create "
@ -2458,7 +2460,7 @@ void innodb_shutdown()
srv_shutdown_all_bg_threads(); srv_shutdown_all_bg_threads();
if (srv_monitor_file) { if (srv_monitor_file) {
fclose(srv_monitor_file); my_fclose(srv_monitor_file, MYF(MY_WME));
srv_monitor_file = 0; srv_monitor_file = 0;
if (srv_monitor_file_name) { if (srv_monitor_file_name) {
unlink(srv_monitor_file_name); unlink(srv_monitor_file_name);
@ -2467,7 +2469,7 @@ void innodb_shutdown()
} }
if (srv_misc_tmpfile) { if (srv_misc_tmpfile) {
fclose(srv_misc_tmpfile); my_fclose(srv_misc_tmpfile, MYF(MY_WME));
srv_misc_tmpfile = 0; srv_misc_tmpfile = 0;
} }