List:Commits« Previous MessageNext Message »
From:Dmitry Lenev Date:August 31 2010 8:11am
Subject:bzr commit into mysql-5.5-runtime branch (dlenev:3124) Bug#56137
View as plain text  
#At file:///home/dlenev/src/bzr/mysql-5.5-rt-56137/ based on revid:alik@stripped

 3124 Dmitry Lenev	2010-08-31
      Bug #56137 "Assertion `thd->lock == 0' failed on upgrading 
      from 5.1.50 to 5.5.6".
      
      Debug builds of server aborted due to assertion failure when
      one run DROP DATABASE statement on an installation which had
      outdated or corrupted mysql.proc table. Particularly this
      affected mysql_upgrade tool which was run as part of 5.1 to 
      5.5 upgrade.
      
      The problem was that sp_drop_db_routines(), which was invoked
      during dropping of database, could have returned without
      closing and unlocking mysql.proc table in case when this 
      table was not up-to-date with current server. As result 
      further attempt to open and lock mysql.event table, which
      was necessary to complete dropping of database, ended up 
      with assert.
      
      This patch solves this problem by ensuring that 
      sp_drop_db_routines() always closes mysql.proc table and
      releases metadata locks on it. This is achieved by changing
      open_proc_table_for_update() function to close tables and 
      release metadata locks acquired by it in case of failure.
      This step also makes behavior of the latter function 
      consistent with behavior of open_proc_table_for_read()/
      open_and_lock_tables().
      
      Test case for this bug was added to sp-destruct.test.

    modified:
      mysql-test/r/sp-destruct.result
      mysql-test/t/sp-destruct.test
      sql/sp.cc
=== modified file 'mysql-test/r/sp-destruct.result'
--- a/mysql-test/r/sp-destruct.result	2010-03-03 09:24:53 +0000
+++ b/mysql-test/r/sp-destruct.result	2010-08-31 08:10:47 +0000
@@ -134,3 +134,19 @@ Warning	1405	Failed to revoke all privil
 # Restore the procs_priv table
 RENAME TABLE procs_priv_backup TO mysql.procs_priv;
 FLUSH TABLE mysql.procs_priv;
+#
+# Bug #56137 "Assertion `thd->lock == 0' failed on upgrading from
+#             5.1.50 to 5.5.6".
+#
+drop database if exists mysqltest;
+# Backup mysql.proc.
+flush table mysql.proc;
+create database mysqltest;
+# Corrupt mysql.proc to make it unusable by current version of server.
+alter table mysql.proc drop column type;
+# The below statement should not cause assertion failure.
+drop database mysqltest;
+Warnings:
+Error	1547	Column count of mysql.proc is wrong. Expected 20, found 19. The table is probably corrupted
+# Restore mysql.proc.
+drop table mysql.proc;

=== modified file 'mysql-test/t/sp-destruct.test'
--- a/mysql-test/t/sp-destruct.test	2010-03-03 09:24:53 +0000
+++ b/mysql-test/t/sp-destruct.test	2010-08-31 08:10:47 +0000
@@ -222,3 +222,33 @@ SHOW WARNINGS;
 --echo # Restore the procs_priv table
 RENAME TABLE procs_priv_backup TO mysql.procs_priv;
 FLUSH TABLE mysql.procs_priv;
+
+
+--echo #
+--echo # Bug #56137 "Assertion `thd->lock == 0' failed on upgrading from
+--echo #             5.1.50 to 5.5.6".
+--echo #
+--disable_warnings
+drop database if exists mysqltest;
+--enable_warnings
+--echo # Backup mysql.proc.
+flush table mysql.proc;
+let $MYSQLD_DATADIR= `select @@datadir`;
+--copy_file $MYSQLD_DATADIR/mysql/proc.frm $MYSQLTEST_VARDIR/tmp/proc.frm
+--copy_file $MYSQLD_DATADIR/mysql/proc.MYD $MYSQLTEST_VARDIR/tmp/proc.MYD
+--copy_file $MYSQLD_DATADIR/mysql/proc.MYI $MYSQLTEST_VARDIR/tmp/proc.MYI
+
+create database mysqltest;
+--echo # Corrupt mysql.proc to make it unusable by current version of server.
+alter table mysql.proc drop column type;
+--echo # The below statement should not cause assertion failure.
+drop database mysqltest;
+
+--echo # Restore mysql.proc.
+drop table mysql.proc;
+--copy_file $MYSQLTEST_VARDIR/tmp/proc.frm $MYSQLD_DATADIR/mysql/proc.frm
+--copy_file $MYSQLTEST_VARDIR/tmp/proc.MYD $MYSQLD_DATADIR/mysql/proc.MYD
+--copy_file $MYSQLTEST_VARDIR/tmp/proc.MYI $MYSQLD_DATADIR/mysql/proc.MYI 
+--remove_file $MYSQLTEST_VARDIR/tmp/proc.frm
+--remove_file $MYSQLTEST_VARDIR/tmp/proc.MYD
+--remove_file $MYSQLTEST_VARDIR/tmp/proc.MYI

=== modified file 'sql/sp.cc'
--- a/sql/sp.cc	2010-07-27 10:25:53 +0000
+++ b/sql/sp.cc	2010-08-31 08:10:47 +0000
@@ -440,6 +440,7 @@ static TABLE *open_proc_table_for_update
 {
   TABLE_LIST table_list;
   TABLE *table;
+  MDL_ticket *mdl_savepoint= thd->mdl_context.mdl_savepoint();
   DBUG_ENTER("open_proc_table_for_update");
 
   table_list.init_one_table("mysql", 5, "proc", 4, "proc", TL_WRITE);
@@ -450,6 +451,9 @@ static TABLE *open_proc_table_for_update
   if (!proc_table_intact.check(table, &proc_table_def))
     DBUG_RETURN(table);
 
+  close_thread_tables(thd);
+  thd->mdl_context.rollback_to_savepoint(mdl_savepoint);
+
   DBUG_RETURN(NULL);
 }
 


Attachment: [text/bzr-bundle] bzr/dlenev@mysql.com-20100831081047-l1akqk4v1vi3nghx.bundle
Thread
bzr commit into mysql-5.5-runtime branch (dlenev:3124) Bug#56137Dmitry Lenev31 Aug