List:Commits« Previous MessageNext Message »
From:Dmitry Shulga Date:October 7 2010 11:57am
Subject:bzr commit into mysql-5.5-runtime branch (Dmitry.Shulga:3157) Bug#45445
View as plain text  
#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.
     @ mysql-test/collections/default.experimental
        Re-enabled test rpl.rpl_row_sp011*.
     @ sql/sp_head.cc
        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:
      mysql-test/collections/default.experimental
      sql/sp_head.cc
=== 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)
   Object_creation_ctx *saved_creation_ctx;
   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))
     DBUG_RETURN(TRUE);
 
   /* init per-instruction memroot */


Attachment: [text/bzr-bundle] bzr/dmitry.shulga@sun.com-20101007115712-6a2bdjopva0s65jl.bundle
Thread
bzr commit into mysql-5.5-runtime branch (Dmitry.Shulga:3157) Bug#45445Dmitry Shulga7 Oct