Commit 97744101 authored by Praveenkumar Hulakund's avatar Praveenkumar Hulakund

Bug#14757009: WHEN THE GENERAL_LOG IS A SOCKET AND THE READER

              GOES AWAY, MYSQL QUITS WORKING.

Analysis:
-----------------
Issue in this bug and in bug 11907705 is, the socket file or
fifo file is set for general log at command line while starting
the server. But currently, only regular file can be set for the 
general log. Instead of reporting any error, the provided files
are opened for writing and continued. Because of this issues
mentioned in the bug reports are seen.

As mentioned, only when any non-regular file is set for general
log at command line while starting the server, these issues are
seen. If general log file is set to non-regular file from CLI
using system variable general_log_file then error is reported.

These issues can also be faced with slow query log file, if it is
set to non-regular file.

Fix:
-----------------
Currently while starting the server if we fail to open log file
then we report an error, disable logging to file and continue.
To fix issue reported code is modified to check whether file
is regular file or not before opening it. If file is not a 
regular file then error is logged to error log and logging to 
file is disabled.
parent 94b31b57
call mtr.add_suppression("Could not use");
# Case 1: Setting fife file to general_log_file and slow_query_log_file
# system variable.
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'
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'
# Case 2: Starting server with fifo file as general log file
# and slow query log file.
Setting fifo file as general log file and slow query log failed.
#
--source include/not_windows.inc
--source include/force_restart.inc
--source include/not_embedded.inc
#
# Bug#14757009 : WHEN THE GENERAL_LOG IS A SOCKET AND THE READER GOES AWAY,
# MYSQL QUITS WORKING.
#
call mtr.add_suppression("Could not use");
--let $gen_log_file= $MYSQLTEST_VARDIR/tmp/general_log.fifo
--let $slow_query_log_file= $MYSQLTEST_VARDIR/tmp/slow_log.fifo
--let GREP_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err
--exec mkfifo $gen_log_file
--exec mkfifo $slow_query_log_file
--echo # Case 1: Setting fife file to general_log_file and slow_query_log_file
--echo # system variable.
# Only regular files can be set to general log. Setting fifo file to general log
# reports an error.
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--error ER_WRONG_VALUE_FOR_VAR
--eval SET GLOBAL general_log_file="$gen_log_file";
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--error ER_WRONG_VALUE_FOR_VAR
--eval SET GLOBAL slow_query_log_file="$slow_query_log_file";
--echo # Case 2: Starting server with fifo file as general log file
--echo # and slow query log file.
# Restart server with fifo file as general log file.
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--shutdown_server 60
--source include/wait_until_disconnected.inc
--enable_reconnect
# Write file to make mysql-test-run.pl start up the server again
--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
# With fix error should be reported in the error log file if file is not a
# regular file.
--perl
my $file= $ENV{'GREP_FILE'};
my $pattern= "Turning logging off for the whole duration";
open(FILE, "$file") or die("Unable to open $file: $!\n");
my $count = 0;
while (<FILE>) {
if ($_ =~ m/$pattern/) {
$count++;
break;
}
}
if ($count >= 2){
print "Setting fifo file as general log file and slow query log failed.\n";
} else {
print "test failed.\n";
}
close(FILE);
EOF
# Cleanup
--remove_file $gen_log_file
--remove_file $slow_query_log_file
...@@ -2322,6 +2322,7 @@ bool MYSQL_LOG::open( ...@@ -2322,6 +2322,7 @@ bool MYSQL_LOG::open(
const char *new_name, enum cache_type io_cache_type_arg) const char *new_name, enum cache_type io_cache_type_arg)
{ {
char buff[FN_REFLEN]; char buff[FN_REFLEN];
MY_STAT f_stat;
File file= -1; File file= -1;
int open_flags= O_CREAT | O_BINARY; int open_flags= O_CREAT | O_BINARY;
DBUG_ENTER("MYSQL_LOG::open"); DBUG_ENTER("MYSQL_LOG::open");
...@@ -2339,6 +2340,10 @@ bool MYSQL_LOG::open( ...@@ -2339,6 +2340,10 @@ 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 */
if (my_stat(log_file_name, &f_stat, MYF(0)) && !MY_S_ISREG(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
......
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