Details
-
Bug
-
Status: Closed (View Workflow)
-
Critical
-
Resolution: Fixed
-
5.5.38, 10.0.12
-
None
-
None
Description
memory leak
Attachments
Activity
As I suspected it is creating a temporary table problem.
4 0x0000000000ce56b6 in alloc_root (mem_root=0x7ffff1828838, length=520) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/mysys/my_alloc.c:159
|
(gdb) frame 5
|
#5 0x000000000067691a in Sql_alloc::operator new[] (size=520, mem_root=0x7ffff1828838) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_list.h:41
|
(gdb) frame 6
|
#6 0x000000000065e69b in create_tmp_table (thd=0x7ffff2262000, param=0x7ffff1b81a78, fields=..., group=0x0, distinct=false, save_sum_fields=true, select_options=2416188160, rows_limit=18446744073709551615, table_alias=0x7ffff181e5b8 "tt0000", do_not_open=true, keep_row_order=false) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_select.cc:14919
|
(gdb) p thd->query()
|
warning: can't find linker symbol for virtual table for `THD' value
|
warning: can't find linker symbol for virtual table for `THD' value
|
warning: can't find linker symbol for virtual table for `THD' value
|
warning: can't find linker symbol for virtual table for `Statement' value
|
warning: can't find linker symbol for virtual table for `Statement' value
|
$1 = 0x7ffff1892b18 "SELECT COUNT(*) as `f00` INTO lResult FROM `tt0000` WHERE `tt0000`.`f0` = NAME_CONST('p0',1)"
|
(gdb) frame 7
|
#7 0x00000000006bf4ae in select_union::create_result_table (this=0x7ffff1b81a58, thd_arg=0x7ffff2262000, column_types=0x7ffff1963740, is_union_distinct=false, options=2416188160, alias=0x7ffff181e5b8 "tt0000", bit_fields_as_long=false, create_table=false, keep_row_order=false) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_union.cc:158
|
(gdb) where
|
#0 0x00007ffff6bccf79 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
|
#1 0x00007ffff6bd0388 in __GI_abort () at abort.c:89
|
#2 0x00007ffff6bc5e36 in __assert_fail_base (fmt=0x7ffff6d17718 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0xef2410 "mem_root->memused < 2*1024*1024", file=file@entry=0xef2380 "/home/bell/maria/bzr/work-maria-5.5-MDEV-6441/mysys/my_alloc.c", line=line@entry=159, function=function@entry=0xef24c4 <__PRETTY_FUNCTION__.9956> "alloc_root") at assert.c:92
|
#3 0x00007ffff6bc5ee2 in __GI___assert_fail (assertion=0xef2410 "mem_root->memused < 2*1024*1024", file=0xef2380 "/home/bell/maria/bzr/work-maria-5.5-MDEV-6441/mysys/my_alloc.c", line=159, function=0xef24c4 <__PRETTY_FUNCTION__.9956> "alloc_root") at assert.c:101
|
#4 0x0000000000ce56b6 in alloc_root (mem_root=0x7ffff1828838, length=520) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/mysys/my_alloc.c:159
|
#5 0x000000000067691a in Sql_alloc::operator new[] (size=520, mem_root=0x7ffff1828838) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_list.h:41
|
#6 0x000000000065e69b in create_tmp_table (thd=0x7ffff2262000, param=0x7ffff1b81a78, fields=..., group=0x0, distinct=false, save_sum_fields=true, select_options=2416188160, rows_limit=18446744073709551615, table_alias=0x7ffff181e5b8 "tt0000", do_not_open=true, keep_row_order=false) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_select.cc:14919
|
#7 0x00000000006bf4ae in select_union::create_result_table (this=0x7ffff1b81a58, thd_arg=0x7ffff2262000, column_types=0x7ffff1963740, is_union_distinct=false, options=2416188160, alias=0x7ffff181e5b8 "tt0000", bit_fields_as_long=false, create_table=false, keep_row_order=false) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_union.cc:158
|
#8 0x00000000005e0635 in mysql_derived_prepare (thd=0x7ffff2262000, lex=0x7ffff1904018, derived=0x7ffff18e9418) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_derived.cc:681
|
#9 0x00000000005df9a9 in mysql_handle_single_derived (lex=0x7ffff1904018, derived=0x7ffff18e9418, phases=2) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_derived.cc:192
|
#10 0x00000000006e25c6 in TABLE_LIST::handle_derived (this=0x7ffff18e9418, lex=0x7ffff1904018, phases=2) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/table.cc:6566
|
#11 0x00000000005fc848 in st_select_lex::handle_derived (this=0x7ffff19047c0, lex=0x7ffff1904018, phases=2) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_lex.cc:3553
|
#12 0x0000000000637738 in JOIN::prepare (this=0x7ffff18ebe18, rref_pointer_array=0x7ffff1904a80, tables_init=0x7ffff18e9418, wild_num=0, conds_init=0x7ffff1845558, og_num=0, order_init=0x0, skip_order_by=false, group_init=0x0, having_init=0x0, proc_param_init=0x0, select_lex_arg=0x7ffff19047c0, unit_arg=0x7ffff19040c8) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_select.cc:636
|
#13 0x000000000064090b in mysql_select (thd=0x7ffff2262000, rref_pointer_array=0x7ffff1904a80, tables=0x7ffff18e9418, wild_num=0, fields=..., conds=0x7ffff1845558, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=2147748608, result=0x7ffff1814218, unit=0x7ffff19040c8, select_lex=0x7ffff19047c0) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_select.cc:3070
|
#14 0x0000000000636e29 in handle_select (thd=0x7ffff2262000, lex=0x7ffff1904018, result=0x7ffff1814218, setup_tables_done_option=0) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_select.cc:319
|
#15 0x000000000060e4e4 in execute_sqlcom_select (thd=0x7ffff2262000, all_tables=0x7ffff18e9418) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_parse.cc:4688
|
#16 0x0000000000607098 in mysql_execute_command (thd=0x7ffff2262000) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_parse.cc:2233
|
#17 0x000000000090f27c in sp_instr_stmt::exec_core (this=0x7ffff181c3f8, thd=0x7ffff2262000, nextp=0x7ffff7f82860) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sp_head.cc:3220
|
#18 0x000000000090ea5f in sp_lex_keeper::reset_lex_and_exec_core (this=0x7ffff181c440, thd=0x7ffff2262000, nextp=0x7ffff7f82860, open_tables=false, instr=0x7ffff181c3f8) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sp_head.cc:2998
|
#19 0x000000000090efde in sp_instr_stmt::execute (this=0x7ffff181c3f8, thd=0x7ffff2262000, nextp=0x7ffff7f82860) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sp_head.cc:3144
|
#20 0x000000000090ab24 in sp_head::execute (this=0x7ffff1828818, thd=0x7ffff2262000, merge_da_on_success=true) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sp_head.cc:1431
|
#21 0x000000000090be80 in sp_head::execute_function (this=0x7ffff1828818, thd=0x7ffff2262000, argp=0x7ffff187a468, argcount=1, return_value_fld=0x7ffff1821a58) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sp_head.cc:1953
|
#22 0x0000000000845345 in Item_func_sp::execute_impl (this=0x7ffff187a3d8, thd=0x7ffff2262000) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/item_func.cc:6872
|
#23 0x00000000008450d6 in Item_func_sp::execute (this=0x7ffff187a3d8) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/item_func.cc:6801
|
#24 0x0000000000847e8a in Item_func_sp::val_int (this=0x7ffff187a3d8) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/item_func.h:2007
|
#25 0x00000000007f250c in Item::send (this=0x7ffff187a3d8, protocol=0x7ffff22625c8, buffer=0x7ffff7f83080) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/item.cc:6502
|
#26 0x0000000000564854 in Protocol::send_result_set_row (this=0x7ffff22625c8, row_items=0x7ffff2265b48) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/protocol.cc:903
|
#27 0x00000000005cd092 in select_send::send_data (this=0x7ffff1844518, items=...) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_class.cc:2370
|
#28 0x000000000063da24 in JOIN::exec (this=0x7ffff18eac18) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_select.cc:2278
|
#29 0x00000000006409c1 in mysql_select (thd=0x7ffff2262000, rref_pointer_array=0x7ffff2265ce8, tables=0x0, wild_num=0, fields=..., conds=0x0, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=2147748608, result=0x7ffff1844518, unit=0x7ffff2265330, select_lex=0x7ffff2265a28) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_select.cc:3090
|
#30 0x0000000000636e29 in handle_select (thd=0x7ffff2262000, lex=0x7ffff2265280, result=0x7ffff1844518, setup_tables_done_option=0) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_select.cc:319
|
#31 0x000000000060e4e4 in execute_sqlcom_select (thd=0x7ffff2262000, all_tables=0x0) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_parse.cc:4688
|
#32 0x0000000000607098 in mysql_execute_command (thd=0x7ffff2262000) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_parse.cc:2233
|
#33 0x0000000000610cb5 in mysql_parse (thd=0x7ffff2262000, rawbuf=0x7ffff181c038 "SELECT `BugTest`(1)", length=19, parser_state=0x7ffff7f845f0) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_parse.cc:5799
|
#34 0x0000000000604552 in dispatch_command (command=COM_QUERY, thd=0x7ffff2262000, packet=0x7ffff2358001 "", packet_length=19) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_parse.cc:1079
|
#35 0x00000000006036a2 in do_command (thd=0x7ffff2262000) at /home/bell/maria/bzr/work-maria-5.5-MDEV-6441/sql/sql_parse.cc:793
|
It looks like whole mysql_derived_prepare should be run on execution arena but it is not.
The problem is that mysql_derived_prepare() set statemnt arena at the beginning.
Probably some part of it need the arena but not all.
Above (executing mysql_derived_prepare() on stetement memory which lead to memory leak) is definetly a hack to hide real problems.
1. double saveing and restoring TABLE_LIST::prep_on_expr
2. TABLE_LIST::prep_on_expr planed as persistent but in same cases used to temporary store values then roll it back
3. there is problem of TABLE_LIST::on_expr pointing freed memory
Thanks for the report and test case!
This crude MTR test demonstrates the problem (not to be included into the regression test suite):
--echo # Memory at the beginning of the test
--disable_query_log
--disable_result_log
);
);
--delimiter |
)
DETERMINISTIC
SQL SECURITY DEFINER
BEGIN
WHILE k0 < 1000 DO
--delimiter ;
--connect (con1,localhost,root,,)
--let $i = 1
--let $count = 1000
{
}
--enable_query_log
--enable_result_log
--echo # Memory after running the flow, before disconnecting
--disconnect con1
--connection default
--echo # Memory after disconnecting the connection
FLUSH TABLES;
FLUSH STATUS;
--enable_query_log
--enable_result_log
--echo # Memory after dropping/flushing
Here is the output on current 5.5:
# Memory at the beginning of the test
32306 elenst 20 0 124m 67m 7908 S 0.0 0.8 0:00.24 mysqld
# Memory after running the flow, before disconnecting
32306 elenst 20 0 2968m 2.0g 8284 S 0.0 26.1 8:03.09 mysqld
# Memory after disconnecting the connection
32306 elenst 20 0 2968m 1.3g 8284 S 91.3 16.5 8:03.24 mysqld
...
# Memory after dropping/flushing
32306 elenst 20 0 2968m 551m 8284 S 104.3 6.9 8:03.44 mysqld
Compare with MySQL 5.6, for example:
# Memory at the beginning of the test
32459 elenst 20 0 176m 51m 7180 S 0.0 0.6 0:00.27 mysqld
# Memory after running the flow, before disconnecting
32459 elenst 20 0 176m 51m 7180 S 0.0 0.6 4:15.52 mysqld
# Memory after disconnecting the connection
32459 elenst 20 0 176m 51m 7288 S 0.0 0.6 4:15.52 mysqld
...
# Memory after dropping/flushing
32459 elenst 20 0 176m 51m 7500 S 0.0 0.6 4:15.52 mysqld