Bug #73111 Suppression typo causing spurious MTR Valgrind failures
Submitted: 25 Jun 2014 9:41 Modified: 15 Apr 2018 18:17
Reporter: Laurynas Biveinis (OCA) Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: Tests Severity:S3 (Non-critical)
Version:5.5 OS:Linux
Assigned to: CPU Architecture:Any
Tags: mtr, valgrind

[25 Jun 2014 9:41] Laurynas Biveinis
Description:
main.ctype_eucjpms                       [ fail ]  Found warnings/errors in server log file!
        Test ended at 2014-06-25 11:34:38
line
==1327== Thread 13:
==1327== Syscall param write(buf) points to uninitialised byte(s)
==1327==    at 0x504835D: ??? (syscall-template.S:81)
==1327==    by 0x7E52DE: my_write (my_write.c:43)
==1327==    by 0x7CDD16: my_b_flush_io_cache (mysql_file.h:1134)
==1327==    by 0x7CE390: _my_b_write (mf_iocache.c:1549)
==1327==    by 0x6A06D1: write_keys(st_sort_param*, unsigned char**, unsigned int, st_io_cache*, st_io_cache*) (filesort.cc:760)
==1327==    by 0x6A29CC: filesort(THD*, TABLE*, st_sort_field*, unsigned int, SQL_SELECT*, unsigned long long, bool, unsigned long long*) (filesort.cc:662)
==1327==    by 0x5BDD1F: create_sort_index(THD*, JOIN*, st_order*, unsigned long long, unsigned long long, bool) (sql_select.cc:14254)
==1327==    by 0x5D0C4C: JOIN::exec() (sql_select.cc:2354)
==1327==    by 0x5CAD39: mysql_select(THD*, Item***, TABLE_LIST*, unsigned int, List<Item>&, Item*, unsigned int, st_order*, st_order*, Item*, st_order*, unsigned long long, select_result*, st_select_lex_unit*, st_select_lex*) (sql_select.cc:2604)
==1327==    by 0x5CAF30: handle_select(THD*, LEX*, select_result*, unsigned long) (sql_select.cc:297)
==1327==    by 0x5815B6: execute_sqlcom_select(THD*, TABLE_LIST*) (sql_parse.cc:4625)
==1327==    by 0x587A80: mysql_execute_command(THD*) (sql_parse.cc:2176)
==1327==    by 0x58F20B: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:5662)
==1327==    by 0x590A96: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1038)
==1327==    by 0x592905: do_command(THD*) (sql_parse.cc:773)
==1327==    by 0x63DEAD: do_handle_one_connection(THD*) (sql_connect.cc:862)
==1327==  Address 0x10abaf57 is 23 bytes inside a block of size 65,536 alloc'd
==1327==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1327==    by 0x7E13D4: my_malloc (my_malloc.c:38)
==1327==    by 0x7CD4E1: init_io_cache (mf_iocache.c:232)
==1327==    by 0x7CAB06: open_cached_file (mf_cache.c:69)
==1327==    by 0x6A0640: write_keys(st_sort_param*, unsigned char**, unsigned int, st_io_cache*, st_io_cache*) (filesort.cc:750)
==1327==    by 0x6A29CC: filesort(THD*, TABLE*, st_sort_field*, unsigned int, SQL_SELECT*, unsigned long long, bool, unsigned long long*) (filesort.cc:662)
==1327==    by 0x5BDD1F: create_sort_index(THD*, JOIN*, st_order*, unsigned long long, unsigned long long, bool) (sql_select.cc:14254)
==1327==    by 0x5D0C4C: JOIN::exec() (sql_select.cc:2354)
==1327==    by 0x5CAD39: mysql_select(THD*, Item***, TABLE_LIST*, unsigned int, List<Item>&, Item*, unsigned int, st_order*, st_order*, Item*, st_order*, unsigned long long, select_result*, st_select_lex_unit*, st_select_lex*) (sql_select.cc:2604)
==1327==    by 0x5CAF30: handle_select(THD*, LEX*, select_result*, unsigned long) (sql_select.cc:297)
==1327==    by 0x5815B6: execute_sqlcom_select(THD*, TABLE_LIST*) (sql_parse.cc:4625)
==1327==    by 0x587A80: mysql_execute_command(THD*) (sql_parse.cc:2176)
==1327==    by 0x58F20B: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:5662)
==1327==    by 0x590A96: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1038)
==1327==    by 0x592905: do_command(THD*) (sql_parse.cc:773)
==1327==    by 0x63DEAD: do_handle_one_connection(THD*) (sql_connect.cc:862)

Affected tests: ctype_eucjpms, ctype_sjis, ctype_tis620 ctype_ujis ctype_ujis_ucs2 ctype_cp932_binlog_stm subselect sum_distinct, all in main suite.

How to repeat:
Server built with -DWITH_DEBUG=ON -DWITH_VALGRIND=ON -DCMAKE_C_FLAGS=-DHAVE_purify -DCMAKE_CXX_FLAGS=-DHAVE_purify -DBUILD_CONFIG=mysql_release -DFEATURE_SET=community -DWITH_EMBEDDED_SERVER=OFF -DENABLE_DTRACE=OFF -DWITH_EXAMPLE_STORAGE_ENGINE=1 -DWITH_SSL=system

Suggested fix:
There are existing suppressions that attempt to address this, the closest one being

{
   Bug#12856915 VALGRIND FAILURE IN FILESORT/CREATE_SORT_INDEX / one
   Memcheck:Param
   write(buf)
   obj:*/libpthread*.so
   fun:my_write
   ...
   fun:my_b_flush_io_cache
   fun:_my_b_write
   fun:_Z10write_keysP13st_sort_paramPPhjP11st_io_cacheS4_
   fun:_Z13find_all_keysP13st_sort_paramP10SQL_SELECTPPhP11st_io_cacheS6_
   fun:_Z8filesortP3THDP5TABLEP13st_sort_fieldjP10SQL_SELECTybPy
}

It does not account for find_all_keys missing in the stacktrace, and write_keys needs slightly different mangling at least on my system. Changing it as follows fixes the issue.

=== modified file 'mysql-test/valgrind.supp'
--- mysql-test/valgrind.supp	2012-02-14 07:11:28 +0000
+++ mysql-test/valgrind.supp	2014-06-25 09:16:58 +0000
@@ -892,8 +892,8 @@
    ...
    fun:my_b_flush_io_cache
    fun:_my_b_write
-   fun:_Z*10write_keysP13st_sort_paramPPhjP11st_io_cacheS4_
-   fun:_Z*13find_all_keysP13st_sort_paramP10SQL_SELECTPPhP11st_io_cacheS6_
+   fun:_ZL10write_keysP13st_sort_paramPPhjP11st_io_cacheS4_
+   ...
    fun:_Z8filesortP3THDP5TABLEP13st_sort_fieldjP10SQL_SELECTybPy
 }
[27 Jun 2014 14:06] Valeriy Kravchuk
I wonder what exact 5.5.x version and on what exact Linux was tested. I can not built recent MySQL 5.5.38 I've got from bzr on updated Ubuntu 14.04 after using the cmake command presented here.
[27 Jun 2014 14:07] Laurynas Biveinis
Right, one needs to apply a patch for bug 71250 first. For some reason this bug is not fixed in 5.6- yet. I used Ubuntu 14.04.
[12 Jul 2014 13:52] Laurynas Biveinis
The "slightly different mangling" is in fact wildcard, I missed the header comment for the suppression telling that. The fix then reduces to

=== modified file 'mysql-test/valgrind.supp'
--- mysql-test/valgrind.supp	2012-04-19 16:51:34 +0000
+++ mysql-test/valgrind.supp	2014-07-12 13:40:16 +0000
@@ -902,7 +902,7 @@
    fun:my_b_flush_io_cache
    fun:_my_b_write
    fun:_Z*10write_keysP13st_sort_paramPPhjP11st_io_cacheS4_
-   fun:_Z*13find_all_keysP13st_sort_paramP10SQL_SELECTPPhP11st_io_cacheS6_
+   ...
    fun:_Z8filesortP3THDP5TABLEP13st_sort_fieldjP10SQL_SELECTybPy
 }
[9 Apr 2015 11:46] MySQL Verification Team
I couldn't repeat with recent source server. Besides the compile options is there another condition to repeat it?. Thanks.
[9 Apr 2015 12:43] MySQL Verification Team
Forgot to paste:

[miguel@vbcentos65 mysql-test]$ ./mtr ctype_eucjpms
Logging: ./mtr  ctype_eucjpms
150409  8:41:37 [Note] Plugin 'FEDERATED' is disabled.
MySQL Version 5.5.43
Checking supported features...
 - SSL connections supported
 - binaries are debug compiled
Collecting tests...
Removing old var directory...
Creating var directory '/home/miguel/test/mysql-5.5/mysql-test/var'...
Installing system database...

==============================================================================

TEST                                      RESULT   TIME (ms) or COMMENT
--------------------------------------------------------------------------

worker[1] Using MTR_BUILD_THREAD 300, with reserved ports 13000..13009
main.ctype_eucjpms                       [ pass ]   1219
--------------------------------------------------------------------------
The servers were restarted 0 times
Spent 1.219 of 8 seconds executing testcases

Completed: All 1 tests were successful.
[10 Apr 2015 8:28] Laurynas Biveinis
Miguel, the error is of Valgrind kind, and your test run did not invoke Valgrind. Then, if CentOS does not show it, try Ubuntu 14.04. It's still here today:

$ git rev-parse HEAD
e02fe87f00dc9fdb0fb6ab13f2e87485f79f3341
$ cmake ../mysql-server/ -DWITH_DEBUG=ON -DWITH_VALGRIND=ON -DCMAKE_C_FLAGS=-DHAVE_purify -DCMAKE_CXX_FLAGS=-DHAVE_purify -DBUILD_CONFIG=mysql_release -DFEATURE_SET=community -DWITH_EMBEDDED_SERVER=OFF -DENABLE_DTRACE=OFF -DWITH_EXAMPLE_STORAGE_ENGINE=1 -DWITH_SSL=system
...
$ ./mtr ctype_eucjpms --valgrind
...
main.ctype_eucjpms                       [ fail ]  Found warnings/errors in server log file!
        Test ended at 2015-04-10 11:18:38
line
==10255== Thread 13:
==10255== Syscall param write(buf) points to uninitialised byte(s)
==10255==    at 0x504835D: ??? (syscall-template.S:81)
==10255==    by 0x7E797E: my_write (my_write.c:43)
==10255==    by 0x7D0326: my_b_flush_io_cache (mysql_file.h:1134)
==10255==    by 0x7D09A0: _my_b_write (mf_iocache.c:1549)
==10255==    by 0x6A1BE1: write_keys(st_sort_param*, unsigned char**, unsigned int, st_io_cache*, st_io_cache*) (filesort.cc:760)
==10255==    by 0x6A3EDC: filesort(THD*, TABLE*, st_sort_field*, unsigned int, SQL_SELECT*, unsigned long long, bool, unsigned long long*) (filesort.cc:662)
==10255==    by 0x5BED9E: create_sort_index(THD*, JOIN*, st_order*, unsigned long long, unsigned long long, bool) (sql_select.cc:14262)
==10255==    by 0x5D1CCC: JOIN::exec() (sql_select.cc:2354)
==10255==    by 0x5CBDB9: mysql_select(THD*, Item***, TABLE_LIST*, unsigned int, List<Item>&, Item*, unsigned int, st_order*, st_order*, Item*, st_order*, unsigned long long, select_result*, st_select_lex_unit*, st_select_lex*) (sql_select.cc:2604)
==10255==    by 0x5CBFB0: handle_select(THD*, LEX*, select_result*, unsigned long) (sql_select.cc:297)
==10255==    by 0x582516: execute_sqlcom_select(THD*, TABLE_LIST*) (sql_parse.cc:4625)
==10255==    by 0x588719: mysql_execute_command(THD*) (sql_parse.cc:2176)
==10255==    by 0x58FE9B: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:5777)
==10255==    by 0x591726: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1038)
==10255==    by 0x593595: do_command(THD*) (sql_parse.cc:773)
==10255==    by 0x63F30D: do_handle_one_connection(THD*) (sql_connect.cc:862)
==10255==  Address 0x102becb7 is 23 bytes inside a block of size 65,536 alloc'd
==10255==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10255==    by 0x7E3A74: my_malloc (my_malloc.c:38)
==10255==    by 0x7CFAF1: init_io_cache (mf_iocache.c:232)
==10255==    by 0x7CD116: open_cached_file (mf_cache.c:69)
==10255==    by 0x6A1B50: write_keys(st_sort_param*, unsigned char**, unsigned int, st_io_cache*, st_io_cache*) (filesort.cc:750)
==10255==    by 0x6A3EDC: filesort(THD*, TABLE*, st_sort_field*, unsigned int, SQL_SELECT*, unsigned long long, bool, unsigned long long*) (filesort.cc:662)
==10255==    by 0x5BED9E: create_sort_index(THD*, JOIN*, st_order*, unsigned long long, unsigned long long, bool) (sql_select.cc:14262)
==10255==    by 0x5D1CCC: JOIN::exec() (sql_select.cc:2354)
==10255==    by 0x5CBDB9: mysql_select(THD*, Item***, TABLE_LIST*, unsigned int, List<Item>&, Item*, unsigned int, st_order*, st_order*, Item*, st_order*, unsigned long long, select_result*, st_select_lex_unit*, st_select_lex*) (sql_select.cc:2604)
==10255==    by 0x5CBFB0: handle_select(THD*, LEX*, select_result*, unsigned long) (sql_select.cc:297)
==10255==    by 0x582516: execute_sqlcom_select(THD*, TABLE_LIST*) (sql_parse.cc:4625)
==10255==    by 0x588719: mysql_execute_command(THD*) (sql_parse.cc:2176)
==10255==    by 0x58FE9B: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:5777)
==10255==    by 0x591726: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1038)
==10255==    by 0x593595: do_command(THD*) (sql_parse.cc:773)
==10255==    by 0x63F30D: do_handle_one_connection(THD*) (sql_connect.cc:862)
^ Found warnings in /home/laurynas/percona/obj-5.5-valgrind/mysql-test/var/log/mysqld.1.err
[10 Apr 2015 8:29] Laurynas Biveinis
The previous command output only show the initial Valgrind errors for this bug. It will also include numerous errors of bug 73126.
[15 Apr 2018 18:17] MySQL Verification Team
With recent source server there is still fail test, not exactly valgrind warnings:

miguel@tikal:~/tmp/2018APR04/mysql-5.5/mysql-test $ ./mtr ctype_eucjpms --valgrind
Logging: ./mtr  ctype_eucjpms --valgrind
180415 15:07:29 [Warning] Insecure configuration for --secure-file-priv: Current value does not restrict location of generated files. Consider setting it to a valid, non-empty path.
180415 15:07:29 [Note] /home/miguel/tmp/2018APR04/mysql-5.5/sql/mysqld (mysqld 5.5.61-debug) starting as process 18540 ...
180415 15:07:29 [Note] Plugin 'FEDERATED' is disabled.
MySQL Version 5.5.61
Turning on valgrind for all executables
Running valgrind with options " --show-reachable=yes "
Checking supported features...
 - SSL connections supported
 - binaries are debug compiled
Collecting tests...
Removing old var directory...
Creating var directory '/home/miguel/tmp/2018APR04/mysql-5.5/mysql-test/var'...
Installing system database...

==============================================================================

TEST                                      RESULT   TIME (ms) or COMMENT
--------------------------------------------------------------------------

worker[1] Using MTR_BUILD_THREAD 300, with reserved ports 13000..13009
worker[1] mysql-test-run: WARNING: Process [mysqld.1 - pid: 18562, winpid: 18562, exit: 256] died after mysql-test-run waited 0.2 seconds for /home/miguel/tmp/2018APR04/mysql-5.5/mysql-test/var/run/mysqld.1.pid to be created.
main.ctype_eucjpms                       [ fail ]
        Test ended at 2018-04-15 15:07:34

Server log is:
safe_process[18562]: FATAL ERROR, Failed to exec child
error: 2, No such file or directory

Failed to start mysqld.1

 - saving '/home/miguel/tmp/2018APR04/mysql-5.5/mysql-test/var/log/main.ctype_eucjpms/' to '/home/miguel/tmp/2018APR04/mysql-5.5/mysql-test/var/log/main.ctype_eucjpms/'
valgrind_report                          [ pass ]
--------------------------------------------------------------------------
The servers were restarted 0 times
Spent 0.000 of 6 seconds executing testcases

Completed: Failed 1/2 tests, 50.00% were successful.

Failing test(s): main.ctype_eucjpms

The log files in var/log may give you some hint of what went wrong.

If you want to report this error, please read first the documentation
at http://dev.mysql.com/doc/mysql/en/mysql-test-suite.html

mysql-test-run: *** ERROR: there were failing test cases
miguel@tikal:~/tmp/2018APR04/mysql-5.5/mysql-test $