List:Commits« Previous MessageNext Message »
From:Dmitry Shulga Date:December 3 2010 2:08pm
Subject:bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3511) Bug#54486
View as plain text  
#At file:///Users/shulga/projects/mysql/5.1-bugteam-bug54486/ based on revid:vasil.dimov@stripped

 3511 Dmitry Shulga	2010-12-03
      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 when
      REPAIR TABLE statement tried replace
      old file by temporary file that has just been 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.
      
      Regression test isn't added because for such one need insert 
      synchonization point (DEBUG_SYNC) to function my_redel() defined in
      mysys/my_redel.c. DEBUG_SYNC is defined in sql/debug_sync.h.
      So, in order to add this one we need add additional dependency,
      i.e. mysys/my_redel.c will depend on sql.debug_sync.h, that is wrong.
     @ sql/sql_db.cc
        mysql_rm_known_files() modified: ignore possible errors
        when trying delete all table's files. Such aggressigve 
        algorithm permits skip already deleted (in another thread)
        files.
     @ 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(); set an error in diagnostic area in
        case of error in access to .TMD file.

    modified:
      sql/sql_db.cc
      storage/myisam/mi_check.c
=== 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-03 14:07:56 +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,11 @@ bool mysql_rm_db(THD *thd,char *db,bool 
       error = 0;
       reenable_binlog(thd);
     }
-    thd->pop_internal_handler();
   }
+  DBUG_ASSERT(deleted >= 0 ||
+              (deleted < 0 && thd->main_da.is_set()) ||
+              thd->killed);
+
   if (!silent && deleted>=0)
   {
     const char *query;
@@ -1213,16 +1213,36 @@ 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-03 14:07:56 +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-20101203140756-i806qgv9d7tklmco.bundle
Thread
bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3511) Bug#54486Dmitry Shulga3 Dec
  • Re: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3511)Bug#54486Jon Olav Hauglid6 Dec
  • Re: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3511)Bug#54486Sergey Vojtovich9 Dec
    • Re: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3511) Bug#54486Dmitry Shulga9 Dec
      • Re: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3511)Bug#54486Sergey Vojtovich9 Dec