#At file:///Users/shulga/projects/mysql/5.5-runtime-bug45445/ based on revid:davi.arnaut@stripped
3157 Dmitry Shulga 2010-10-07
Fixed bug#45445 - cannot execute procedures with thread_stack
set to 128k.
Re-enabled test rpl.rpl_row_sp011*.
sp_head::execute() modified: pass constant value 2 * STACK_MIN_SIZE
instead of 8 * STACK_MIN_SIZE as a second argument value
in call to check_stack_overrun.
=== modified file 'mysql-test/collections/default.experimental'
--- a/mysql-test/collections/default.experimental 2010-10-01 13:25:13 +0000
+++ b/mysql-test/collections/default.experimental 2010-10-07 11:57:12 +0000
@@ -29,7 +29,6 @@ rpl.rpl_heartbeat_2slaves
rpl.rpl_innodb_bug28430* # Bug#46029
rpl.rpl_innodb_bug30888* @solaris # Bug#47646 2009-09-25 alik rpl.rpl_innodb_bug30888 fails sporadically on Solaris
rpl.rpl_killed_ddl @windows # Bug#47638 2010-01-20 alik The rpl_killed_ddl test fails on Windows
-rpl.rpl_row_sp011* @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun
sys_vars.max_sp_recursion_depth_func @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun
sys_vars.slow_query_log_func @solaris # Bug#54819 2010-06-26 alik sys_vars.slow_query_log_func fails sporadically on Solaris 10
=== modified file 'sql/sp_head.cc'
--- a/sql/sp_head.cc 2010-08-12 13:55:27 +0000
+++ b/sql/sp_head.cc 2010-10-07 11:57:12 +0000
@@ -1213,8 +1213,27 @@ sp_head::execute(THD *thd)
Warning_info *saved_warning_info, warning_info(thd->warning_info->warn_id());
- /* Use some extra margin for possible SP recursion and functions */
- if (check_stack_overrun(thd, 8 * STACK_MIN_SIZE, (uchar*)&old_packet))
+ Just reporting a stack overrun error
+ (@sa check_stack_overrun()) requires stack memory for error
+ message buffer. Thus, we have to put the below check
+ relatively close to the beginning of the execution stack,
+ where available stack margin is still big. As long as the check
+ has to be fairly high up the call stack, the amount of memory
+ we "book" for has to stay fairly high as well, and hence
+ not very accurate. The number below has been calculated
+ by trial and error, and reflects the amount of memory necessary
+ to execute a single stored procedure instruction, be it either
+ an SQL statement, or, heaviest of all, a CALL, which involves
+ parsing and loading of another stored procedure into the cache
+ (@sa db_load_routine() and Bug#10100).
+ At the time of measuring, a recursive SP invocation required
+ 3232 bytes of stack on 32 bit Linux and 6016 bytes on 64 bit Mac.
+ The same with db_load_routine() required circa 7k bytes and
+ 14k bytes accordingly. Hence, here we book the stack with some
+ reasonable margin.
+ if (check_stack_overrun(thd, 2 * STACK_MIN_SIZE, (uchar*)&old_packet))
/* init per-instruction memroot */
Attachment: [text/bzr-bundle] email@example.com
|• bzr commit into mysql-5.5-runtime branch (Dmitry.Shulga:3157) Bug#45445||Dmitry Shulga||7 Oct|