List:Commits« Previous MessageNext Message »
From:Dmitry Shulga Date:December 10 2010 12:54pm
Subject:bzr push into mysql-5.1-bugteam branch (Dmitry.Shulga:3514 to 3515) Bug#54486
View as plain text  
 3515 Dmitry Shulga	2010-12-10
      Fixed bug#54486 - assert in my_seek, concurrent
      DROP/CREATE SCHEMA, CREATE TABLE, REPAIR.
      
      The cause of assert was concurrent execution of
      DROP DATABASE and REPAIR TABLE where first statement
      deleted table's file .TMD at the same time as
      REPAIR TABLE tried to read file details from the old file
      that was just removed.
      
      Additionally was fixed trouble when DROP TABLE try delete
      all files belong to table being dropped at the same time
      when REPAIR TABLE statement has just deleted .TMD file.
      
      No regression test added because this would require adding a
      sync point to mysys/my_redel.c. Since this bug is not present in
      5.5+, adding test coverage was considered unnecessary.
      The patch has been verified using RQG testing.
     @ sql/sql_db.cc
        mysql_rm_known_files() modified: ignore possible ENOENT error
        when trying delete all table's files. Such aggressive 
        algorithm permits skip already deleted (in another thread)
        files.
        
        Installation of Drop_table_error_handler as internal error handler
        moved from mysql_rm_db() to mysql_rm_knowns_files() near to place
        where source of possible errors (call to mysql_rm_table_part2) located.
     @ storage/myisam/mi_check.c
        mi_repair() was modified: set param->retry_repair= 0
        in order to don't call following failover procedure
        in ha_myisam::repair().

    modified:
      sql/sql_db.cc
      storage/myisam/mi_check.c
 3514 Bjorn Munch	2010-12-09 [merge]
      merge from 5.1-mtr

    modified:
      client/mysqltest.cc
      mysql-test/mysql-test-run.pl
      mysql-test/r/mysqltest.result
      mysql-test/t/mysqltest.test
=== modified file 'sql/sql_db.cc'
--- a/sql/sql_db.cc	2010-10-19 10:27:09 +0000
+++ b/sql/sql_db.cc	2010-12-10 07:48:50 +0000
@@ -948,9 +948,6 @@ bool mysql_rm_db(THD *thd,char *db,bool 
     remove_db_from_cache(db);
     pthread_mutex_unlock(&LOCK_open);
 
-    Drop_table_error_handler err_handler(thd->get_internal_handler());
-    thd->push_internal_handler(&err_handler);
-
     error= -1;
     /*
       We temporarily disable the binary log while dropping the objects
@@ -983,8 +980,8 @@ bool mysql_rm_db(THD *thd,char *db,bool 
       error = 0;
       reenable_binlog(thd);
     }
-    thd->pop_internal_handler();
   }
+
   if (!silent && deleted>=0)
   {
     const char *query;
@@ -1213,16 +1210,34 @@ static long mysql_rm_known_files(THD *th
     else
     {
       strxmov(filePath, org_path, "/", file->name, NullS);
-      if (my_delete_with_symlink(filePath,MYF(MY_WME)))
+      /*
+        We ignore ENOENT error in order to skip files that was deleted
+        by concurrently running statement like REAPIR TABLE ...
+      */
+      if (my_delete_with_symlink(filePath, MYF(0)) &&
+          my_errno != ENOENT)
       {
-	goto err;
+        my_error(EE_DELETE, MYF(0), filePath, my_errno);
+        goto err;
       }
     }
   }
-  if (thd->killed ||
-      (tot_list && mysql_rm_table_part2(thd, tot_list, 1, 0, 1, 1)))
+
+  if (thd->killed)
     goto err;
 
+  if (tot_list)
+  {
+    int res= 0;
+    Drop_table_error_handler err_handler(thd->get_internal_handler());
+
+    thd->push_internal_handler(&err_handler);
+    res= mysql_rm_table_part2(thd, tot_list, 1, 0, 1, 1);
+    thd->pop_internal_handler();
+    if (res)
+      goto err;
+  }
+
   /* Remove RAID directories */
   {
     List_iterator<String> it(raid_dirs);

=== modified file 'storage/myisam/mi_check.c'
--- a/storage/myisam/mi_check.c	2010-03-25 12:08:21 +0000
+++ b/storage/myisam/mi_check.c	2010-12-10 07:48:50 +0000
@@ -1741,6 +1741,8 @@ err:
 			     MYF(MY_REDEL_MAKE_BACKUP): MYF(0))) ||
 	  mi_open_datafile(info,share,name,-1))
 	got_error=1;
+
+      param->retry_repair= 0;
     }
   }
   if (got_error)


Attachment: [text/bzr-bundle] bzr/dmitry.shulga@oracle.com-20101210074850-0cttphw0aga0j8km.bundle
Thread
bzr push into mysql-5.1-bugteam branch (Dmitry.Shulga:3514 to 3515) Bug#54486Dmitry Shulga10 Dec