#At file:///home/andrei/MySQL/BZR/FIXES/bug36443-slave_crash_insert_trigger/
2656 Andrei Elkin 2008-06-19
Bug#36443 Server crashes when executing insert when insert trigger on table
The crash appeared to be a result of allocating an instance of Discrete_interval
automatically that that was referred in out-of-declaration scope.
Fixed with correcting to use shallow copying backing up and restoring scheme of
auto_inc_intervals_forced introduced by bug#33029;
added simulation code that forces executing those fixes of the former bug that
targeted
at master-and-slave having incompatible bug#33029-prone versions.
added:
mysql-test/suite/bugs/r/rpl_bug33029.result
mysql-test/suite/bugs/t/rpl_bug33029.test
modified:
sql/slave.cc
sql/sql_class.cc
sql/structs.h
per-file messages:
mysql-test/suite/bugs/r/rpl_bug33029.result
new results file
mysql-test/suite/bugs/t/rpl_bug33029.test
test merely checks no crash happens on slave.
sql/slave.cc
forcing to execute special logics implemented for bug#33029 if
simulate_bug33029 the debug option is set.
sql/sql_class.cc
shallow copy and restore of auto_inc_intervals_forced.
sql/structs.h
Removing the deep _copy() and methods associated with it.
=== added file 'mysql-test/suite/bugs/r/rpl_bug33029.result'
--- a/mysql-test/suite/bugs/r/rpl_bug33029.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/bugs/r/rpl_bug33029.result 2008-06-19 09:18:42 +0000
@@ -0,0 +1,15 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+create table `t1` (`id` int not null auto_increment primary key);
+create trigger `trg` before insert on `t1` for each row begin end;
+set @@global.debug="+d,simulate_bug33029";
+stop slave;
+start slave;
+insert into `t1` values ();
+select * from t1;
+id
+1
=== added file 'mysql-test/suite/bugs/t/rpl_bug33029.test'
--- a/mysql-test/suite/bugs/t/rpl_bug33029.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/bugs/t/rpl_bug33029.test 2008-06-19 09:18:42 +0000
@@ -0,0 +1,25 @@
+#
+# Bug #36443 Server crashes when executing insert when insert trigger on table
+#
+# Emulating the former bug#33029 situation to see that there is no crash anymore.
+#
+
+
+source include/master-slave.inc;
+
+create table `t1` (`id` int not null auto_increment primary key);
+create trigger `trg` before insert on `t1` for each row begin end;
+
+sync_slave_with_master;
+set @@global.debug="+d,simulate_bug33029";
+
+stop slave;
+start slave;
+
+connection master;
+
+insert into `t1` values ();
+
+sync_slave_with_master;
+select * from t1;
+
=== modified file 'sql/slave.cc'
--- a/sql/slave.cc 2008-03-31 08:57:18 +0000
+++ b/sql/slave.cc 2008-06-19 09:18:42 +0000
@@ -4136,6 +4136,7 @@ bool rpl_master_erroneous_autoinc(THD *t
if (active_mi && active_mi->rli.sql_thd == thd)
{
Relay_log_info *rli= &active_mi->rli;
+ DBUG_EXECUTE_IF("simulate_bug33029", return TRUE;);
return rpl_master_has_bug(rli, 33029, FALSE);
}
return FALSE;
=== modified file 'sql/sql_class.cc'
--- a/sql/sql_class.cc 2008-05-20 07:38:17 +0000
+++ b/sql/sql_class.cc 2008-06-19 09:18:42 +0000
@@ -2883,7 +2883,7 @@ void THD::reset_sub_statement_state(Sub_
if (rpl_master_erroneous_autoinc(this))
{
backup->auto_inc_intervals_forced= auto_inc_intervals_forced;
- auto_inc_intervals_forced.empty();
+ auto_inc_intervals_forced.empty_no_free();
}
#endif
@@ -2932,7 +2932,7 @@ void THD::restore_sub_statement_state(Su
if (rpl_master_erroneous_autoinc(this))
{
auto_inc_intervals_forced= backup->auto_inc_intervals_forced;
- backup->auto_inc_intervals_forced.empty();
+ backup->auto_inc_intervals_forced.empty_no_free();
}
#endif
=== modified file 'sql/structs.h'
--- a/sql/structs.h 2008-03-14 03:35:41 +0000
+++ b/sql/structs.h 2008-06-19 09:18:42 +0000
@@ -315,26 +315,8 @@ private:
Discrete_interval *current;
uint elements; // number of elements
- /* helper function for copy construct and assignment operator */
- void copy_(const Discrete_intervals_list& from)
- {
- for (Discrete_interval *i= from.head; i; i= i->next)
- {
- Discrete_interval j= *i;
- append(&j);
- }
- }
public:
Discrete_intervals_list() : head(NULL), current(NULL), elements(0) {};
- Discrete_intervals_list(const Discrete_intervals_list& from)
- {
- copy_(from);
- }
- void operator=(const Discrete_intervals_list& from)
- {
- empty();
- copy_(from);
- }
void empty_no_free()
{
head= current= NULL;
| Thread |
|---|
| • bzr commit into mysql-5.1 branch (aelkin:2656) Bug#36443, Bug#33029 | Andrei Elkin | 19 Jun |