Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-35828

Assertion fails in alloc_root() after max_session_mem_used is hit

Details

    Description

      --source include/have_innodb.inc
       
      SET max_session_mem_used=8192;
      CREATE TEMPORARY TABLE t1 (a INT,b INT) ENGINE=INNODB;
      INSERT INTO t1 VALUES (1,1);
      SELECT * FROM (t1 AS t2 LEFT JOIN t1 AS t3 USING (a)),t1;
      

      Leads to:

      CS 10.6.21 faca9500fb3c1e5c56d9626f606df8de67513bc1 (Debug)

      mariadbd: /test/10.6_dbg/mysys/my_alloc.c:263: alloc_root: Assertion `*prev == 0' failed.
      

      CS 10.6.21 faca9500fb3c1e5c56d9626f606df8de67513bc1 (Debug)

      Core was generated by `/test/MD130125-mariadb-10.6.21-linux-x86_64-dbg/bin/mariadbd --no-defaults --ma'.
      Program terminated with signal SIGABRT, Aborted.
      #0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
      [Current thread is 1 (Thread 0x1538ac155700 (LWP 3109995))]
      (gdb) bt
      #0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
      #1  0x00001538bc7a4859 in __GI_abort () at abort.c:79
      #2  0x00001538bc7a4729 in __assert_fail_base (fmt=0x1538bc93a588 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x561fe2556400 "*prev == 0", file=0x561fe2556410 "/test/10.6_dbg/mysys/my_alloc.c", line=263, function=<optimized out>) at assert.c:92
      #3  0x00001538bc7b5fd6 in __GI___assert_fail (assertion=assertion@entry=0x561fe2556400 "*prev == 0", file=file@entry=0x561fe2556410 "/test/10.6_dbg/mysys/my_alloc.c", line=line@entry=263, function=function@entry=0x561fe2556460 <__PRETTY_FUNCTION__.17728> "alloc_root") at assert.c:101
      #4  0x0000561fe20a602b in alloc_root (mem_root=0x153878006ae0, length=288) at /test/10.6_dbg/mysys/my_alloc.c:263
      #5  0x0000561fe1553e7c in Sql_alloc::operator new (size=<optimized out>, mem_root=<optimized out>) at /test/10.6_dbg/sql/sql_alloc.h:37
      #6  0x0000561fe168cce9 in check_join_cache_usage (tab=tab@entry=0x153878019f20, options=options@entry=0, no_jbuf_after=no_jbuf_after@entry=3, table_index=table_index@entry=2, prev_tab=0x153878019b60) at /test/10.6_dbg/sql/sql_select.cc:14349
      #7  0x0000561fe168d1e2 in check_join_cache_usage_for_tables (join=join@entry=0x153878016098, options=options@entry=0, no_jbuf_after=no_jbuf_after@entry=3) at /test/10.6_dbg/sql/sql_select.cc:14508
      #8  0x0000561fe168d4d5 in make_join_readinfo (join=join@entry=0x153878016098, options=options@entry=0, no_jbuf_after=no_jbuf_after@entry=3) at /test/10.6_dbg/sql/sql_select.cc:14680
      #9  0x0000561fe168f7e4 in JOIN::optimize_stage2 (this=this@entry=0x153878016098) at /test/10.6_dbg/sql/sql_select.cc:3193
      #10 0x0000561fe1691895 in JOIN::optimize_inner (this=this@entry=0x153878016098) at /test/10.6_dbg/sql/sql_select.cc:2639
      #11 0x0000561fe1691b06 in JOIN::optimize (this=this@entry=0x153878016098) at /test/10.6_dbg/sql/sql_select.cc:1927
      #12 0x0000561fe1691bcd in mysql_select (thd=thd@entry=0x153878000d48, tables=0x153878013998, fields=@0x153878013610: {<base_list> = {<Sql_alloc> = {<No data fields>}, first = 0x153878013938, last = 0x153878017378, elements = 5}, <No data fields>}, conds=0x0, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=2147748608, result=0x153878016070, unit=0x153878004f28, select_lex=0x153878013350) at /test/10.6_dbg/sql/sql_select.cc:5182
      #13 0x0000561fe169237c in handle_select (thd=thd@entry=0x153878000d48, lex=lex@entry=0x153878004e60, result=result@entry=0x153878016070, setup_tables_done_option=setup_tables_done_option@entry=0) at /test/10.6_dbg/sql/sql_select.cc:573
      #14 0x0000561fe1606421 in execute_sqlcom_select (thd=thd@entry=0x153878000d48, all_tables=0x153878013998) at /test/10.6_dbg/sql/sql_parse.cc:6421
      #15 0x0000561fe1613471 in mysql_execute_command (thd=thd@entry=0x153878000d48, is_called_from_prepared_stmt=is_called_from_prepared_stmt@entry=false) at /test/10.6_dbg/sql/sql_parse.cc:4013
      #16 0x0000561fe15ff2f1 in mysql_parse (thd=thd@entry=0x153878000d48, rawbuf=<optimized out>, length=<optimized out>, parser_state=parser_state@entry=0x1538ac154340) at /test/10.6_dbg/sql/sql_parse.cc:8208
      #17 0x0000561fe160e595 in dispatch_command (command=command@entry=COM_QUERY, thd=thd@entry=0x153878000d48, packet=packet@entry=0x15387800add9 "SELECT * FROM (t1 AS t2 LEFT JOIN t1 AS t3 USING (a)),t1", packet_length=packet_length@entry=56, blocking=blocking@entry=true) at /test/10.6_dbg/sql/sql_class.h:1418
      #18 0x0000561fe1610f00 in do_command (thd=thd@entry=0x153878000d48, blocking=blocking@entry=true) at /test/10.6_dbg/sql/sql_parse.cc:1421
      #19 0x0000561fe176d62a in do_handle_one_connection (connect=<optimized out>, connect@entry=0x561fe3b2a988, put_in_cache=put_in_cache@entry=true) at /test/10.6_dbg/sql/sql_connect.cc:1386
      #20 0x0000561fe176da97 in handle_one_connection (arg=0x561fe3b2a988) at /test/10.6_dbg/sql/sql_connect.cc:1298
      #21 0x00001538bccd0609 in start_thread (arg=<optimized out>) at pthread_create.c:477
      #22 0x00001538bc8a1133 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
      

      Bug confirmed present in:
      MariaDB: 10.6.21 (dbg)

      Bug (or feature/syntax) confirmed not present in:
      MariaDB: 10.5.28 (dbg), 10.5.28 (opt), 10.6.21 (opt), 10.11.11 (dbg), 10.11.11 (opt), 11.4.5 (dbg), 11.4.5 (opt), 11.7.1 (dbg), 11.7.1 (opt), 11.8.0 (dbg), 11.8.0 (opt)

      Attachments

        Issue Links

          Activity

            Unique IDs

            *prev == 0|SIGABRT|alloc_root|Item::operator new|add_cond_and_fix|add_not_null_conds 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|add_not_null_conds|make_join_select 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|Create_func_geometry_from_text::create_native|Create_native_func::create_func 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|Create_func_json_value::create_2_arg|Create_func_arg2::create_func 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|Create_func_lpad::create_native_std|Create_func_lpad::create_native 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|Eq_creator::create|Item_in_subselect::create_single_in_to_exists_cond 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|Explain_table_access::print_explain|Explain_select::print_explain 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|Field_iterator_table_ref::get_or_create_column_ref|mark_common_columns 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|Gt_creator::create|MYSQLparse 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|Item_in_subselect::inject_in_to_exists_cond|JOIN::choose_subquery_plan 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|Le_creator::create|MYSQLparse 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|LEX::create_item_ident_field|LEX::create_item_ident 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|LEX::create_item_ident_field|LEX::create_item_ident_nosp 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|LEX::create_item_ident_field|LEX::create_item_ident_nospvar 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|MYSQLparse|parse_sql 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|TABLE::fill_item_list|mysql_ha_open 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|THD::make_string_literal|THD::make_string_literal 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|TR_table::query|Item_func_trt_id::get_by_commit_ts 
            *prev == 0|SIGABRT|alloc_root|Item::operator new|Type_handler_linestring::make_constructor_item|MYSQLparse 
            *prev == 0|SIGABRT|alloc_root|MDL_request::operator new|lock_table_names|lock_table_names 
            *prev == 0|SIGABRT|alloc_root|memdup_root|Query_arena::memdup|make_join_select 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|get_lock_data|mysql_lock_tables 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|Item_hex_constant::hex_string_init|Item_hex_constant::Item_hex_constant 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|JOIN_CACHE::alloc_fields|JOIN_CACHE::init 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|JOIN::get_best_combination|JOIN::optimize_stage2 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|Lex_input_stream::get_text|Lex_input_stream::lex_one_token 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|make_name|Item::set_name 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|st_select_lex::add_table_to_list|MYSQLparse 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|st_select_lex::add_table_to_list|ORAparse 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|thd_alloc|Sql_alloc::operator new 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|THD::quote_unescape|THD::to_ident_sys_alloc 
            *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|update_ref_and_keys|JOIN::reoptimize 
            *prev == 0|SIGABRT|alloc_root|Query_arena::calloc|Item_sp::Item_sp|Item_func_sp::Item_func_sp 
            *prev == 0|SIGABRT|alloc_root|Query_arena::calloc|st_select_lex::setup_ref_array|JOIN::prepare 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|add_virtual_expression|MYSQLparse 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|base_list::push_back|List<Create_field>::push_back 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|base_list::push_back|List<Item>::push_back 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|base_list::push_back|List<Key_part_spec>::push_back 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|base_list::push_back|List<List<Item> >::push_back 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|base_list::push_back|List<String>::push_back 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|Create_field::clone|list_copy_and_replace_each_value<Create_field> 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|innobase_create_handler|get_new_handler 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|JOIN::get_best_combination|JOIN::optimize_stage2 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|JOIN::save_explain_data_intern|JOIN::save_explain_data 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|make_select|JOIN::optimize_stage2 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|myisammrg_create_handler|get_new_handler 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|mysql_derived_prepare|mysql_handle_single_derived 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|MYSQLparse|parse_sql 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|ORAparse|parse_sql 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|partition_create_handler|get_new_handler 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|st_select_lex_unit::prepare|mysql_union 
            *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|subselect_single_select_engine::prepare|Item_subselect::fix_fields 
            *prev == 0|SIGABRT|alloc_root|strmake_root|Query_arena::strmake|Lex_input_stream::get_token 
            *prev == 0|SIGABRT|alloc_root|strmake_root|Query_arena::strmake|THD::copy_db_to 
            *prev == 0|SIGABRT|alloc_root|strmake_root|THD::make_lex_string|Lex_ident_sys_st::copy_keyword 
            *prev == 0|SIGABRT|alloc_root|strmake_root|THD::strmake_lex_cstring|THD::strmake_lex_cstring 
            *prev == 0|SIGABRT|alloc_root|st_select_lex_node::operator new|LEX::alloc_select|LEX::parsed_TVC_start 
            *prev == 0|SIGABRT|alloc_root|st_select_lex_node::operator new|LEX::alloc_select|MYSQLparse 
            *prev == 0|SIGABRT|alloc_root|st_select_lex_node::operator new|LEX::alloc_unit|LEX::create_unit 
            *prev == 0|SIGABRT|alloc_root|st_select_lex_node::operator new|wrap_tvc|Item_subselect::wrap_tvc_into_select 
            

            ramesh Ramesh Sivaraman added a comment - Unique IDs *prev == 0|SIGABRT|alloc_root|Item::operator new|add_cond_and_fix|add_not_null_conds *prev == 0|SIGABRT|alloc_root|Item::operator new|add_not_null_conds|make_join_select *prev == 0|SIGABRT|alloc_root|Item::operator new|Create_func_geometry_from_text::create_native|Create_native_func::create_func *prev == 0|SIGABRT|alloc_root|Item::operator new|Create_func_json_value::create_2_arg|Create_func_arg2::create_func *prev == 0|SIGABRT|alloc_root|Item::operator new|Create_func_lpad::create_native_std|Create_func_lpad::create_native *prev == 0|SIGABRT|alloc_root|Item::operator new|Eq_creator::create|Item_in_subselect::create_single_in_to_exists_cond *prev == 0|SIGABRT|alloc_root|Item::operator new|Explain_table_access::print_explain|Explain_select::print_explain *prev == 0|SIGABRT|alloc_root|Item::operator new|Field_iterator_table_ref::get_or_create_column_ref|mark_common_columns *prev == 0|SIGABRT|alloc_root|Item::operator new|Gt_creator::create|MYSQLparse *prev == 0|SIGABRT|alloc_root|Item::operator new|Item_in_subselect::inject_in_to_exists_cond|JOIN::choose_subquery_plan *prev == 0|SIGABRT|alloc_root|Item::operator new|Le_creator::create|MYSQLparse *prev == 0|SIGABRT|alloc_root|Item::operator new|LEX::create_item_ident_field|LEX::create_item_ident *prev == 0|SIGABRT|alloc_root|Item::operator new|LEX::create_item_ident_field|LEX::create_item_ident_nosp *prev == 0|SIGABRT|alloc_root|Item::operator new|LEX::create_item_ident_field|LEX::create_item_ident_nospvar *prev == 0|SIGABRT|alloc_root|Item::operator new|MYSQLparse|parse_sql *prev == 0|SIGABRT|alloc_root|Item::operator new|TABLE::fill_item_list|mysql_ha_open *prev == 0|SIGABRT|alloc_root|Item::operator new|THD::make_string_literal|THD::make_string_literal *prev == 0|SIGABRT|alloc_root|Item::operator new|TR_table::query|Item_func_trt_id::get_by_commit_ts *prev == 0|SIGABRT|alloc_root|Item::operator new|Type_handler_linestring::make_constructor_item|MYSQLparse *prev == 0|SIGABRT|alloc_root|MDL_request::operator new|lock_table_names|lock_table_names *prev == 0|SIGABRT|alloc_root|memdup_root|Query_arena::memdup|make_join_select *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|get_lock_data|mysql_lock_tables *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|Item_hex_constant::hex_string_init|Item_hex_constant::Item_hex_constant *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|JOIN_CACHE::alloc_fields|JOIN_CACHE::init *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|JOIN::get_best_combination|JOIN::optimize_stage2 *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|Lex_input_stream::get_text|Lex_input_stream::lex_one_token *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|make_name|Item::set_name *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|st_select_lex::add_table_to_list|MYSQLparse *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|st_select_lex::add_table_to_list|ORAparse *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|thd_alloc|Sql_alloc::operator new *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|THD::quote_unescape|THD::to_ident_sys_alloc *prev == 0|SIGABRT|alloc_root|Query_arena::alloc|update_ref_and_keys|JOIN::reoptimize *prev == 0|SIGABRT|alloc_root|Query_arena::calloc|Item_sp::Item_sp|Item_func_sp::Item_func_sp *prev == 0|SIGABRT|alloc_root|Query_arena::calloc|st_select_lex::setup_ref_array|JOIN::prepare *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|add_virtual_expression|MYSQLparse *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|base_list::push_back|List<Create_field>::push_back *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|base_list::push_back|List<Item>::push_back *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|base_list::push_back|List<Key_part_spec>::push_back *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|base_list::push_back|List<List<Item> >::push_back *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|base_list::push_back|List<String>::push_back *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|Create_field::clone|list_copy_and_replace_each_value<Create_field> *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|innobase_create_handler|get_new_handler *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|JOIN::get_best_combination|JOIN::optimize_stage2 *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|JOIN::save_explain_data_intern|JOIN::save_explain_data *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|make_select|JOIN::optimize_stage2 *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|myisammrg_create_handler|get_new_handler *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|mysql_derived_prepare|mysql_handle_single_derived *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|MYSQLparse|parse_sql *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|ORAparse|parse_sql *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|partition_create_handler|get_new_handler *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|st_select_lex_unit::prepare|mysql_union *prev == 0|SIGABRT|alloc_root|Sql_alloc::operator new|subselect_single_select_engine::prepare|Item_subselect::fix_fields *prev == 0|SIGABRT|alloc_root|strmake_root|Query_arena::strmake|Lex_input_stream::get_token *prev == 0|SIGABRT|alloc_root|strmake_root|Query_arena::strmake|THD::copy_db_to *prev == 0|SIGABRT|alloc_root|strmake_root|THD::make_lex_string|Lex_ident_sys_st::copy_keyword *prev == 0|SIGABRT|alloc_root|strmake_root|THD::strmake_lex_cstring|THD::strmake_lex_cstring *prev == 0|SIGABRT|alloc_root|st_select_lex_node::operator new|LEX::alloc_select|LEX::parsed_TVC_start *prev == 0|SIGABRT|alloc_root|st_select_lex_node::operator new|LEX::alloc_select|MYSQLparse *prev == 0|SIGABRT|alloc_root|st_select_lex_node::operator new|LEX::alloc_unit|LEX::create_unit *prev == 0|SIGABRT|alloc_root|st_select_lex_node::operator new|wrap_tvc|Item_subselect::wrap_tvc_into_select
            psergei Sergei Petrunia added a comment - - edited

            The assertion fails because of the following:
            join buffer code allocates something (frame #4). The allocation exceeds the specified limit.

            We try to print diagnostic for it. When doing so, we try to allocate memory (frame #1, #0).
            alloc_root() does not seem to be "reenterable" - it cannot handle a situation where it calls my_malloc() and inside that call somebody tries to make allocation on this particular mem_root.

            (gdb) wher
              #0  alloc_root (mem_root=0x7fff2c006d10, length=256) at /home/psergey/dev-git2/10.6-mdev35828/mysys/my_alloc.c:243
              #1  0x0000555555d8e219 in Query_arena::alloc (this=0x7fff2c000d90, size=256) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_class.h:1266
              #2  0x0000555555d81b80 in my_malloc_size_cb_func (size=32760, is_thread_specific=1 '\001') at /home/psergey/dev-git2/10.6-mdev35828/sql/mysqld.cc:3673
              #3  0x0000555556b69556 in my_malloc (key=7, size=32736, my_flags=69648) at /home/psergey/dev-git2/10.6-mdev35828/mysys/my_malloc.c:109
              #4  0x0000555556b5841e in alloc_root (mem_root=0x7fff2c006d10, length=288) at /home/psergey/dev-git2/10.6-mdev35828/mysys/my_alloc.c:251
              #5  0x0000555555d8d465 in Sql_alloc::operator new (size=288, mem_root=0x7fff2c006d10) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_alloc.h:37
              #6  0x0000555555f51929 in check_join_cache_usage (tab=0x7fff2c01d560, options=0, no_jbuf_after=3, table_index=2, prev_tab=0x7fff2c01d1a0) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:14349
              #7  0x0000555555f51ff8 in check_join_cache_usage_for_tables (join=0x7fff2c0196d8, options=0, no_jbuf_after=3) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:14508
              #8  0x0000555555f52851 in make_join_readinfo (join=0x7fff2c0196d8, options=0, no_jbuf_after=3) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:14680
              #9  0x0000555555f30c07 in JOIN::optimize_stage2 (this=0x7fff2c0196d8) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:3193
              #10 0x0000555555f2eb02 in JOIN::optimize_inner (this=0x7fff2c0196d8) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:2639
              #11 0x0000555555f2c0be in JOIN::optimize (this=0x7fff2c0196d8) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:1927
            

            psergei Sergei Petrunia added a comment - - edited The assertion fails because of the following: join buffer code allocates something (frame #4). The allocation exceeds the specified limit. We try to print diagnostic for it. When doing so, we try to allocate memory (frame #1, #0). alloc_root() does not seem to be "reenterable" - it cannot handle a situation where it calls my_malloc() and inside that call somebody tries to make allocation on this particular mem_root. (gdb) wher #0 alloc_root (mem_root=0x7fff2c006d10, length=256) at /home/psergey/dev-git2/10.6-mdev35828/mysys/my_alloc.c:243 #1 0x0000555555d8e219 in Query_arena::alloc (this=0x7fff2c000d90, size=256) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_class.h:1266 #2 0x0000555555d81b80 in my_malloc_size_cb_func (size=32760, is_thread_specific=1 '\001') at /home/psergey/dev-git2/10.6-mdev35828/sql/mysqld.cc:3673 #3 0x0000555556b69556 in my_malloc (key=7, size=32736, my_flags=69648) at /home/psergey/dev-git2/10.6-mdev35828/mysys/my_malloc.c:109 #4 0x0000555556b5841e in alloc_root (mem_root=0x7fff2c006d10, length=288) at /home/psergey/dev-git2/10.6-mdev35828/mysys/my_alloc.c:251 #5 0x0000555555d8d465 in Sql_alloc::operator new (size=288, mem_root=0x7fff2c006d10) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_alloc.h:37 #6 0x0000555555f51929 in check_join_cache_usage (tab=0x7fff2c01d560, options=0, no_jbuf_after=3, table_index=2, prev_tab=0x7fff2c01d1a0) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:14349 #7 0x0000555555f51ff8 in check_join_cache_usage_for_tables (join=0x7fff2c0196d8, options=0, no_jbuf_after=3) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:14508 #8 0x0000555555f52851 in make_join_readinfo (join=0x7fff2c0196d8, options=0, no_jbuf_after=3) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:14680 #9 0x0000555555f30c07 in JOIN::optimize_stage2 (this=0x7fff2c0196d8) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:3193 #10 0x0000555555f2eb02 in JOIN::optimize_inner (this=0x7fff2c0196d8) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:2639 #11 0x0000555555f2c0be in JOIN::optimize (this=0x7fff2c0196d8) at /home/psergey/dev-git2/10.6-mdev35828/sql/sql_select.cc:1927
            psergei Sergei Petrunia added a comment - - edited

            The code doing allocation in the out-of-memory handler was added in:
            https://github.com/mariadb/server/commit/fdaa7a96edb1b958d755ac1b85925eb9b548daeb

            psergei Sergei Petrunia added a comment - - edited The code doing allocation in the out-of-memory handler was added in: https://github.com/mariadb/server/commit/fdaa7a96edb1b958d755ac1b85925eb9b548daeb

            Looking at the next calls in my_malloc_size_cb_func():

                      if ((buf2= (char*) thd->alloc(256)))                                                                                                                                                                    
                      {
                        my_snprintf(buf2, 256,
                                    ER_THD(thd, ER_OPTION_PREVENTS_STATEMENT), buf);
                        thd->set_killed_no_mutex(KILL_QUERY,
                                                 ER_OPTION_PREVENTS_STATEMENT, buf2);
                      }
            

            set_killed_no_mutex() will call my_malloc() anyway.

            psergei Sergei Petrunia added a comment - Looking at the next calls in my_malloc_size_cb_func(): if ((buf2= ( char *) thd->alloc(256))) { my_snprintf(buf2, 256, ER_THD(thd, ER_OPTION_PREVENTS_STATEMENT), buf); thd->set_killed_no_mutex(KILL_QUERY, ER_OPTION_PREVENTS_STATEMENT, buf2); } set_killed_no_mutex() will call my_malloc() anyway.

            bb-10.6-MDEV-35828.

            psergei Sergei Petrunia added a comment - bb-10.6- MDEV-35828 .

            serg, please review this trivial fix

            psergei Sergei Petrunia added a comment - serg , please review this trivial fix
            serg Sergei Golubchik added a comment - - edited

            why not to use a buffer of stack? char[256], that's not much.

            ok to push, if you agree and change as above

            serg Sergei Golubchik added a comment - - edited why not to use a buffer of stack? char[256] , that's not much. ok to push, if you agree and change as above

            Note for the changelog: Hitting @@max_session_mem_used limit in the optimizer could have caused assertion failure, or a memory leak in release build.

            psergei Sergei Petrunia added a comment - Note for the changelog: Hitting @@max_session_mem_used limit in the optimizer could have caused assertion failure, or a memory leak in release build.

            People

              psergei Sergei Petrunia
              ramesh Ramesh Sivaraman
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.