-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmysql-log-fifo.patch
127 lines (114 loc) · 5.47 KB
/
mysql-log-fifo.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
MySQL port of the following MariaDB patch:
commit 8e781601f46938cb4228bd9a966a9d6871c06859
Author: Sergei Golubchik <[email protected]>
Date: Fri Apr 24 21:41:00 2015 +0200
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.
RHBZ: #1219496
diff -up mysql-5.6.24/mysql-test/r/log_errchk.result.logfifo mysql-5.6.24/mysql-test/r/log_errchk.result
--- mysql-5.6.24/mysql-test/r/log_errchk.result.logfifo 2015-03-25 17:34:52.000000000 +0100
+++ mysql-5.6.24/mysql-test/r/log_errchk.result 2015-05-07 16:06:04.280715628 +0200
@@ -1,5 +1,4 @@
-call mtr.add_suppression("Could not open");
-# Case 1: Setting fife file to general_log_file and slow_query_log_file
+# Case 1: Setting fifo 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'
@@ -7,4 +6,6 @@ SET GLOBAL slow_query_log_file="MYSQLTES
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.
+call mtr.add_suppression("Could not open .* 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.
diff -up mysql-5.6.24/mysql-test/t/log_errchk.test.logfifo mysql-5.6.24/mysql-test/t/log_errchk.test
--- mysql-5.6.24/mysql-test/t/log_errchk.test.logfifo 2015-03-25 17:34:52.000000000 +0100
+++ mysql-5.6.24/mysql-test/t/log_errchk.test 2015-05-07 16:05:16.904547519 +0200
@@ -7,8 +7,8 @@
# Bug#14757009 : WHEN THE GENERAL_LOG IS A SOCKET AND THE READER GOES AWAY,
# MYSQL QUITS WORKING.
#
-call mtr.add_suppression("Could not open");
-
+# MariaDB: MDEV-6870 Not possible to use FIFO file as a general_log file
+#
--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
@@ -16,10 +16,9 @@ call mtr.add_suppression("Could not open
--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 # Case 1: Setting fifo 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.
+# Setting fifo file to general log reports an error because the other end is closed
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--error ER_WRONG_VALUE_FOR_VAR
--eval SET GLOBAL general_log_file="$gen_log_file";
@@ -39,11 +38,12 @@ call mtr.add_suppression("Could not open
--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.
+# Error 6 is reported, because the other end is closed
+call mtr.add_suppression("Could not open .* for logging \\(error 6\\)");
+call mtr.add_suppression("File '.*' not found \\(Errcode: 6\\)");
--perl
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");
my $count = 0;
while (<FILE>) {
diff -up mysql-5.6.24/sql/log.cc.logfifo mysql-5.6.24/sql/log.cc
--- mysql-5.6.24/sql/log.cc.logfifo 2015-03-25 17:34:53.000000000 +0100
+++ mysql-5.6.24/sql/log.cc 2015-05-07 16:03:06.967086459 +0200
@@ -1526,6 +1526,7 @@ bool MYSQL_LOG::open(
MY_STAT f_stat;
File file= -1;
my_off_t pos= 0;
+ bool is_fifo = false;
int open_flags= O_CREAT | O_BINARY;
DBUG_ENTER("MYSQL_LOG::open");
DBUG_PRINT("enter", ("log_type: %d", (int) log_type_arg));
@@ -1543,15 +1544,17 @@ bool MYSQL_LOG::open(
DBUG_EVALUATE_IF("fault_injection_init_name", log_type == LOG_BIN, 0))
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;
+ is_fifo = my_stat(log_file_name, &f_stat, MYF(0)) &&
+ MY_S_ISFIFO(f_stat.st_mode);
if (io_cache_type == SEQ_READ_APPEND)
open_flags |= O_RDWR | O_APPEND;
else
open_flags |= O_WRONLY | (log_type == LOG_BIN ? 0 : O_APPEND);
+ if (is_fifo)
+ open_flags |= O_NONBLOCK;
+
db[0]= 0;
#ifdef HAVE_PSI_INTERFACE
@@ -1564,7 +1567,9 @@ bool MYSQL_LOG::open(
MYF(MY_WME | ME_WAITTANG))) < 0)
goto err;
- if ((pos= mysql_file_tell(file, MYF(MY_WME))) == MY_FILEPOS_ERROR)
+ if (is_fifo)
+ pos= 0;
+ else if ((pos= mysql_file_tell(file, MYF(MY_WME))) == MY_FILEPOS_ERROR)
{
if (my_errno == ESPIPE)
pos= 0;
@@ -1681,7 +1686,7 @@ void MYSQL_LOG::close(uint exiting)
{
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)
{
char errbuf[MYSYS_STRERROR_SIZE];
write_error= 1;