Bug #46714 MyISAM storage engine pollutes the diagnostics area with duplicate warnings
Description:
This bug was introduced in scope of WL#1895 "Print message to error log in
case of detected MyISAM corruption".
Function mi_report_error() not only writes a message to the error log,
but generates a warning. However, a warning is also always generated
on the upper layer, ergo we get two warnings.
The warning generated by mi_report_error() has a wrong warning code -- not
one of the ER_ listed in ha_errmsg.cc, but the internal myisam error code, like 126 or 145.
How to repeat:
Add SHOW WARNINGS statement to myisam_keycache_coverate.test:
=== modified file 'mysql-test/t/myisam_keycache_coverage.test'
--- mysql-test/t/myisam_keycache_coverage.test 2009-04-14 13:40:06 +0000
+++ mysql-test/t/myisam_keycache_coverage.test 2009-08-14 10:48:04 +0000
@@ -35,6 +35,7 @@ SET debug='+d,key_cache_read_block_error
--replace_regex /'.*[\/\\]/'/
--error 126
SELECT COUNT(*) FROM t1 FORCE INDEX(i1) WHERE c2 < 5;
+show warnings;
--echo # Reset debug variable to its original value.
--disable_query_log
eval SET debug= '$debug';
You will see that there are duplicate warnings:
main.myisam_keycache_coverage [ fail ]
Test ended at 2009-08-14 14:48:17
CURRENT_TEST: main.myisam_keycache_coverage
--- /opt/local/work/5.4-azalea/mysql-test/r/myisam_keycache_coverage.result 2009-07-14 23:38:07.291880919 +0300
+++ /opt/local/work/5.4-azalea/mysql-test/r/myisam_keycache_coverage.reject 2009-08-14 13:48:17.436835210 +0300
@@ -28,6 +28,10 @@
SET debug='+d,key_cache_read_block_error';
SELECT COUNT(*) FROM t1 FORCE INDEX(i1) WHERE c2 < 5;
ERROR HY000: Incorrect key file for table 't1.MYI'; try to repair it
+show warnings;
+Level Code Message
+Error 126 Incorrect key file for table './test/t1.MYI'; try to repair it
+Error 1034 Incorrect key file for table 't1'; try to repair it
# Reset debug variable to its original value.
FLUSH TABLE t1;
#
Suggested fix:
Patch:
=== modified file 'include/my_sys.h'
--- include/my_sys.h 2009-07-16 12:51:04 +0000
+++ include/my_sys.h 2009-08-14 10:47:19 +0000
@@ -107,8 +107,9 @@ extern int NEAR my_errno; /* Last error
#define ME_COLOUR2 ((2 << ME_HIGHBYTE))
#define ME_COLOUR3 ((3 << ME_HIGHBYTE))
#define ME_FATALERROR 1024 /* Fatal statement error */
-#define ME_JUST_INFO 8192 /**< not error but just info */
-#define ME_JUST_WARNING 16384 /**< not error but just warning */
+#define ME_JUST_INFO 8192 /**< not error but just info in error log */
+#define ME_JUST_WARNING 16384 /**< not error but just warning in error log */
+#define ME_JUST_ERROR 32768 /**< just error message in error log */
/* Bits in last argument to fn_format */
#define MY_REPLACE_DIR 1 /* replace dir in name with 'dir' */
=== modified file 'mysql-test/t/myisam_keycache_coverage.test'
--- mysql-test/t/myisam_keycache_coverage.test 2009-04-14 13:40:06 +0000
+++ mysql-test/t/myisam_keycache_coverage.test 2009-08-14 10:46:36 +0000
@@ -36,6 +36,7 @@ SET debug='+d,key_cache_read_block_error
--error 126
SELECT COUNT(*) FROM t1 FORCE INDEX(i1) WHERE c2 < 5;
--echo # Reset debug variable to its original value.
+show warnings;
--disable_query_log
eval SET debug= '$debug';
--enable_query_log
=== modified file 'sql/mysqld.cc'
--- sql/mysqld.cc 2009-08-12 20:20:51 +0000
+++ sql/mysqld.cc 2009-08-14 10:05:12 +0000
@@ -3083,6 +3083,12 @@ void my_message_sql(uint error, const ch
DBUG_VOID_RETURN;
}
+ if (MyFlags & ME_JUST_ERROR)
+ {
+ sql_print_error("%s: %s", my_progname, str);
+ DBUG_VOID_RETURN;
+ }
+
if (thd)
{
if (MyFlags & ME_FATALERROR)
=== modified file 'storage/myisam/mi_info.c'
--- storage/myisam/mi_info.c 2008-04-09 00:56:49 +0000
+++ storage/myisam/mi_info.c 2009-08-14 10:05:36 +0000
@@ -126,7 +126,7 @@ void mi_report_error(int errcode, const
if ((lgt= strlen(file_name)) > 64)
file_name+= lgt - 64;
- my_error(errcode, MYF(ME_NOREFRESH), file_name);
+ my_error(errcode, MYF(ME_JUST_ERROR), file_name);
DBUG_VOID_RETURN;
}
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.054 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: This bug was introduced in scope of WL#1895 "Print message to error log in case of detected MyISAM corruption". Function mi_report_error() not only writes a message to the error log, but generates a warning. However, a warning is also always generated on the upper layer, ergo we get two warnings. The warning generated by mi_report_error() has a wrong warning code -- not one of the ER_ listed in ha_errmsg.cc, but the internal myisam error code, like 126 or 145. How to repeat: Add SHOW WARNINGS statement to myisam_keycache_coverate.test: === modified file 'mysql-test/t/myisam_keycache_coverage.test' --- mysql-test/t/myisam_keycache_coverage.test 2009-04-14 13:40:06 +0000 +++ mysql-test/t/myisam_keycache_coverage.test 2009-08-14 10:48:04 +0000 @@ -35,6 +35,7 @@ SET debug='+d,key_cache_read_block_error --replace_regex /'.*[\/\\]/'/ --error 126 SELECT COUNT(*) FROM t1 FORCE INDEX(i1) WHERE c2 < 5; +show warnings; --echo # Reset debug variable to its original value. --disable_query_log eval SET debug= '$debug'; You will see that there are duplicate warnings: main.myisam_keycache_coverage [ fail ] Test ended at 2009-08-14 14:48:17 CURRENT_TEST: main.myisam_keycache_coverage --- /opt/local/work/5.4-azalea/mysql-test/r/myisam_keycache_coverage.result 2009-07-14 23:38:07.291880919 +0300 +++ /opt/local/work/5.4-azalea/mysql-test/r/myisam_keycache_coverage.reject 2009-08-14 13:48:17.436835210 +0300 @@ -28,6 +28,10 @@ SET debug='+d,key_cache_read_block_error'; SELECT COUNT(*) FROM t1 FORCE INDEX(i1) WHERE c2 < 5; ERROR HY000: Incorrect key file for table 't1.MYI'; try to repair it +show warnings; +Level Code Message +Error 126 Incorrect key file for table './test/t1.MYI'; try to repair it +Error 1034 Incorrect key file for table 't1'; try to repair it # Reset debug variable to its original value. FLUSH TABLE t1; # Suggested fix: Patch: === modified file 'include/my_sys.h' --- include/my_sys.h 2009-07-16 12:51:04 +0000 +++ include/my_sys.h 2009-08-14 10:47:19 +0000 @@ -107,8 +107,9 @@ extern int NEAR my_errno; /* Last error #define ME_COLOUR2 ((2 << ME_HIGHBYTE)) #define ME_COLOUR3 ((3 << ME_HIGHBYTE)) #define ME_FATALERROR 1024 /* Fatal statement error */ -#define ME_JUST_INFO 8192 /**< not error but just info */ -#define ME_JUST_WARNING 16384 /**< not error but just warning */ +#define ME_JUST_INFO 8192 /**< not error but just info in error log */ +#define ME_JUST_WARNING 16384 /**< not error but just warning in error log */ +#define ME_JUST_ERROR 32768 /**< just error message in error log */ /* Bits in last argument to fn_format */ #define MY_REPLACE_DIR 1 /* replace dir in name with 'dir' */ === modified file 'mysql-test/t/myisam_keycache_coverage.test' --- mysql-test/t/myisam_keycache_coverage.test 2009-04-14 13:40:06 +0000 +++ mysql-test/t/myisam_keycache_coverage.test 2009-08-14 10:46:36 +0000 @@ -36,6 +36,7 @@ SET debug='+d,key_cache_read_block_error --error 126 SELECT COUNT(*) FROM t1 FORCE INDEX(i1) WHERE c2 < 5; --echo # Reset debug variable to its original value. +show warnings; --disable_query_log eval SET debug= '$debug'; --enable_query_log === modified file 'sql/mysqld.cc' --- sql/mysqld.cc 2009-08-12 20:20:51 +0000 +++ sql/mysqld.cc 2009-08-14 10:05:12 +0000 @@ -3083,6 +3083,12 @@ void my_message_sql(uint error, const ch DBUG_VOID_RETURN; } + if (MyFlags & ME_JUST_ERROR) + { + sql_print_error("%s: %s", my_progname, str); + DBUG_VOID_RETURN; + } + if (thd) { if (MyFlags & ME_FATALERROR) === modified file 'storage/myisam/mi_info.c' --- storage/myisam/mi_info.c 2008-04-09 00:56:49 +0000 +++ storage/myisam/mi_info.c 2009-08-14 10:05:36 +0000 @@ -126,7 +126,7 @@ void mi_report_error(int errcode, const if ((lgt= strlen(file_name)) > 64) file_name+= lgt - 64; - my_error(errcode, MYF(ME_NOREFRESH), file_name); + my_error(errcode, MYF(ME_JUST_ERROR), file_name); DBUG_VOID_RETURN; }