Commit 8e781601 authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-6870 Not possible to use FIFO file as a general_log file

Remove the too restrictive bugfix for bug#67088.
FIFO can be used for general/slow logs, but lseek() and fsync() on
FIFO fail. And open() needs to be non-blocking, in case the other
end isn't reading.
parent c05d4310
call mtr.add_suppression("Could not use"); # Case 1: Setting fifo file to general_log_file and slow_query_log_file
# Case 1: Setting fife file to general_log_file and slow_query_log_file
# system variable. # system variable.
SET GLOBAL general_log_file="MYSQLTEST_VARDIR/tmp/general_log.fifo";; SET GLOBAL general_log_file="MYSQLTEST_VARDIR/tmp/general_log.fifo";;
ERROR 42000: Variable 'general_log_file' can't be set to the value of 'MYSQLTEST_VARDIR/tmp/general_log.fifo' ERROR 42000: Variable 'general_log_file' can't be set to the value of 'MYSQLTEST_VARDIR/tmp/general_log.fifo'
...@@ -7,4 +6,6 @@ SET GLOBAL slow_query_log_file="MYSQLTEST_VARDIR/tmp/slow_log.fifo";; ...@@ -7,4 +6,6 @@ SET GLOBAL slow_query_log_file="MYSQLTEST_VARDIR/tmp/slow_log.fifo";;
ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of 'MYSQLTEST_VARDIR/tmp/slow_log.fifo' ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of 'MYSQLTEST_VARDIR/tmp/slow_log.fifo'
# Case 2: Starting server with fifo file as general log file # Case 2: Starting server with fifo file as general log file
# and slow query log file. # and slow query log file.
call mtr.add_suppression("Could not use .* for logging \\(error 6\\)");
call mtr.add_suppression("File '.*' not found \\(Errcode: 6\\)");
Setting fifo file as general log file and slow query log failed. Setting fifo file as general log file and slow query log failed.
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
# Bug#14757009 : WHEN THE GENERAL_LOG IS A SOCKET AND THE READER GOES AWAY, # Bug#14757009 : WHEN THE GENERAL_LOG IS A SOCKET AND THE READER GOES AWAY,
# MYSQL QUITS WORKING. # MYSQL QUITS WORKING.
# #
call mtr.add_suppression("Could not use"); # MDEV-6870 Not possible to use FIFO file as a general_log file
#
--let $gen_log_file= $MYSQLTEST_VARDIR/tmp/general_log.fifo --let $gen_log_file= $MYSQLTEST_VARDIR/tmp/general_log.fifo
--let $slow_query_log_file= $MYSQLTEST_VARDIR/tmp/slow_log.fifo --let $slow_query_log_file= $MYSQLTEST_VARDIR/tmp/slow_log.fifo
...@@ -15,10 +16,9 @@ call mtr.add_suppression("Could not use"); ...@@ -15,10 +16,9 @@ call mtr.add_suppression("Could not use");
--exec mkfifo $gen_log_file --exec mkfifo $gen_log_file
--exec mkfifo $slow_query_log_file --exec mkfifo $slow_query_log_file
--echo # Case 1: Setting fife file to general_log_file and slow_query_log_file --echo # Case 1: Setting fifo file to general_log_file and slow_query_log_file
--echo # system variable. --echo # system variable.
# Only regular files can be set to general log. Setting fifo file to general log # Setting fifo file to general log reports an error because the other end is closed
# reports an error.
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--error ER_WRONG_VALUE_FOR_VAR --error ER_WRONG_VALUE_FOR_VAR
--eval SET GLOBAL general_log_file="$gen_log_file"; --eval SET GLOBAL general_log_file="$gen_log_file";
...@@ -38,11 +38,12 @@ call mtr.add_suppression("Could not use"); ...@@ -38,11 +38,12 @@ call mtr.add_suppression("Could not use");
--exec echo "restart: --general-log-file=$gen_log_file --slow-query-log-file=$slow_query_log_file" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --exec echo "restart: --general-log-file=$gen_log_file --slow-query-log-file=$slow_query_log_file" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--source include/wait_until_connected_again.inc --source include/wait_until_connected_again.inc
# With fix error should be reported in the error log file if file is not a # Error 6 is reported, because the other end is closed
# regular file. call mtr.add_suppression("Could not use .* for logging \\(error 6\\)");
call mtr.add_suppression("File '.*' not found \\(Errcode: 6\\)");
--perl --perl
my $file= $ENV{'GREP_FILE'}; my $file= $ENV{'GREP_FILE'};
my $pattern= "Turning logging off for the whole duration"; my $pattern= "for logging \\(error 6\\)\\. Turning logging off for the whole duration";
open(FILE, "$file") or die("Unable to open $file: $!\n"); open(FILE, "$file") or die("Unable to open $file: $!\n");
my $count = 0; my $count = 0;
while (<FILE>) { while (<FILE>) {
......
...@@ -2360,6 +2360,7 @@ bool MYSQL_LOG::open( ...@@ -2360,6 +2360,7 @@ bool MYSQL_LOG::open(
MY_STAT f_stat; MY_STAT f_stat;
File file= -1; File file= -1;
my_off_t seek_offset; my_off_t seek_offset;
bool is_fifo = false;
int open_flags= O_CREAT | O_BINARY; int open_flags= O_CREAT | O_BINARY;
DBUG_ENTER("MYSQL_LOG::open"); DBUG_ENTER("MYSQL_LOG::open");
DBUG_PRINT("enter", ("log_type: %d", (int) log_type_arg)); DBUG_PRINT("enter", ("log_type: %d", (int) log_type_arg));
...@@ -2376,15 +2377,17 @@ bool MYSQL_LOG::open( ...@@ -2376,15 +2377,17 @@ bool MYSQL_LOG::open(
log_type_arg, io_cache_type_arg)) log_type_arg, io_cache_type_arg))
goto err; goto err;
/* File is regular writable file */ is_fifo = my_stat(log_file_name, &f_stat, MYF(0)) &&
if (my_stat(log_file_name, &f_stat, MYF(0)) && !MY_S_ISREG(f_stat.st_mode)) MY_S_ISFIFO(f_stat.st_mode);
goto err;
if (io_cache_type == SEQ_READ_APPEND) if (io_cache_type == SEQ_READ_APPEND)
open_flags |= O_RDWR | O_APPEND; open_flags |= O_RDWR | O_APPEND;
else else
open_flags |= O_WRONLY | (log_type == LOG_BIN ? 0 : O_APPEND); open_flags |= O_WRONLY | (log_type == LOG_BIN ? 0 : O_APPEND);
if (is_fifo)
open_flags |= O_NONBLOCK;
db[0]= 0; db[0]= 0;
#ifdef HAVE_PSI_INTERFACE #ifdef HAVE_PSI_INTERFACE
...@@ -2396,7 +2399,9 @@ bool MYSQL_LOG::open( ...@@ -2396,7 +2399,9 @@ bool MYSQL_LOG::open(
MYF(MY_WME | ME_WAITTANG))) < 0) MYF(MY_WME | ME_WAITTANG))) < 0)
goto err; goto err;
if ((seek_offset= mysql_file_tell(file, MYF(MY_WME)))) if (is_fifo)
seek_offset= 0;
else if ((seek_offset= mysql_file_tell(file, MYF(MY_WME))))
goto err; goto err;
if (init_io_cache(&log_file, file, IO_SIZE, io_cache_type, seek_offset, 0, if (init_io_cache(&log_file, file, IO_SIZE, io_cache_type, seek_offset, 0,
...@@ -2488,7 +2493,7 @@ void MYSQL_LOG::close(uint exiting) ...@@ -2488,7 +2493,7 @@ void MYSQL_LOG::close(uint exiting)
{ {
end_io_cache(&log_file); end_io_cache(&log_file);
if (mysql_file_sync(log_file.file, MYF(MY_WME)) && ! write_error) if (log_type == LOG_BIN && mysql_file_sync(log_file.file, MYF(MY_WME)) && ! write_error)
{ {
write_error= 1; write_error= 1;
sql_print_error(ER_THD_OR_DEFAULT(current_thd, ER_ERROR_ON_WRITE), name, errno); sql_print_error(ER_THD_OR_DEFAULT(current_thd, ER_ERROR_ON_WRITE), name, errno);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment