diff --git a/mysql-test/main/flush_logs_not_windows.result b/mysql-test/main/flush_logs_not_windows.result new file mode 100644 index 00000000000..920fddb8f97 --- /dev/null +++ b/mysql-test/main/flush_logs_not_windows.result @@ -0,0 +1,3 @@ +flush logs; +ERROR HY000: Can't create file 'MYSQLTEST_VARDIR/log/mysqld.1.err' (errno: 13 "Permission denied") +flush logs; diff --git a/mysql-test/main/flush_logs_not_windows.test b/mysql-test/main/flush_logs_not_windows.test new file mode 100644 index 00000000000..af50e4bb9e8 --- /dev/null +++ b/mysql-test/main/flush_logs_not_windows.test @@ -0,0 +1,13 @@ +source include/not_windows.inc; +source include/not_embedded.inc; +# +# MDEV-17710 "unknown error" with FLUSH LOGS if log directory is not writeable +# +move_file $MYSQLTEST_VARDIR/log/mysqld.1.err $MYSQLTEST_VARDIR/log/mysqld.1.err-bak; +system chmod u-w $MYSQLTEST_VARDIR/log; +replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR; +error ER_CANT_CREATE_FILE; +flush logs; +system chmod u+w $MYSQLTEST_VARDIR/log; +move_file $MYSQLTEST_VARDIR/log/mysqld.1.err-bak $MYSQLTEST_VARDIR/log/mysqld.1.err; +flush logs; diff --git a/sql/log.cc b/sql/log.cc index ac885746c62..819ece8f98f 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -8644,14 +8644,14 @@ void sql_perror(const char *message) redirect stdout and stderr to a file. The streams are reopened only for appending (writing at end of file). */ -extern "C" my_bool reopen_fstreams(const char *filename, - FILE *outstream, FILE *errstream) +bool reopen_fstreams(const char *filename, FILE *outstream, FILE *errstream) { - if (outstream && !my_freopen(filename, "a", outstream)) - return TRUE; - - if (errstream && !my_freopen(filename, "a", errstream)) + if ((outstream && !my_freopen(filename, "a", outstream)) || + (errstream && !my_freopen(filename, "a", errstream))) + { + my_error(ER_CANT_CREATE_FILE, MYF(0), filename, errno); return TRUE; + } /* The error stream must be unbuffered. */ if (errstream) diff --git a/sql/log.h b/sql/log.h index 7dfdb36c442..91a7dcd80ab 100644 --- a/sql/log.h +++ b/sql/log.h @@ -26,6 +26,7 @@ class Relay_log_info; class Format_description_log_event; +bool reopen_fstreams(const char *filename, FILE *outstream, FILE *errstream); void setup_log_handling(); bool trans_has_updated_trans_table(const THD* thd); bool stmt_has_updated_trans_table(const THD *thd); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 1c948f4563f..a824d0898d6 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -209,9 +209,6 @@ typedef fp_except fp_except_t; #define fcntl(X,Y,Z) 0 #endif -extern "C" my_bool reopen_fstreams(const char *filename, - FILE *outstream, FILE *errstream); - inline void setup_fpu() { #if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H) && !defined(HAVE_FEDISABLEEXCEPT) diff --git a/sql/sql_reload.cc b/sql/sql_reload.cc index abdf9d76d15..bb8b5e94173 100644 --- a/sql/sql_reload.cc +++ b/sql/sql_reload.cc @@ -124,14 +124,7 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options, if (options & REFRESH_ERROR_LOG) if (unlikely(flush_error_log())) - { - /* - When flush_error_log() failed, my_error() has not been called. - So, we have to do it here to keep the protocol. - */ - my_error(ER_UNKNOWN_ERROR, MYF(0)); result= 1; - } if ((options & REFRESH_SLOW_LOG) && global_system_variables.sql_log_slow) logger.flush_slow_log();