List:Commits« Previous MessageNext Message »
From:Sergey Glukhov Date:August 15 2008 6:54am
Subject:bzr commit into mysql-5.1-bugteam branch (gluh:2701) Bug#36638
View as plain text  
#At file:///home/gluh/MySQL/bazaar/mysql-5.1-bugteam/

 2701 Sergey Glukhov	2008-08-15
      Bug#36638 mysqld crashes when open file limit is passed and general query log enabled
      The problem:
      CSV storage engine open function returns success even
      thought it failed to open the data file
      The fix:
      return error
      Additional fixes:
      added MY_WME to my_open to avoid mysterious error message
      free share struct if open the file was unsuccessful
modified:
  mysql-test/r/csv.result
  mysql-test/t/csv.test
  storage/csv/ha_tina.cc

per-file messages:
  mysql-test/r/csv.result
    test result
  mysql-test/t/csv.test
    test case
  storage/csv/ha_tina.cc
    The problem:
    CSV storage engine open function returns success even
    thought it failed to open the data file
    The fix:
    return error
    Additional fixes:
    added MY_WME to my_open to avoid mysterious error message
    free share struct if open the file was unsuccessful
=== modified file 'mysql-test/r/csv.result'
--- a/mysql-test/r/csv.result	2008-01-17 23:37:18 +0000
+++ b/mysql-test/r/csv.result	2008-08-15 06:53:54 +0000
@@ -5388,4 +5388,10 @@ select * from t1;
 c1
 That
 drop table t1;
+create table t1 (a int not null) engine=csv;
+lock tables t1 read;
+select * from t1;
+ERROR HY000: File './test/t1.CSV' not found (Errcode: 2)
+unlock tables;
+drop table t1;
 End of 5.1 tests

=== modified file 'mysql-test/t/csv.test'
--- a/mysql-test/t/csv.test	2008-01-17 23:37:18 +0000
+++ b/mysql-test/t/csv.test	2008-08-15 06:53:54 +0000
@@ -1386,6 +1386,9 @@ UNLOCK TABLES;
 
 # cleanup
 DROP TABLE test_concurrent_insert;
+connection default;                                                                     
+--disconnect con1                                                                       
+--disconnect con2
 
 #
 # Test REPAIR/CHECK TABLE (5.1)
@@ -1784,4 +1787,20 @@ update t1 set c1="That" where c1="This";
 select * from t1;
 drop table t1;
 
+#
+# Bug#36638 mysqld crashes when open file limit is passed and general query log enabled
+#
+create table t1 (a int not null) engine=csv;
+lock tables t1 read;
+connect (con1,localhost,root,,);
+--connection con1
+--remove_file $MYSQLTEST_VARDIR/master-data/test/t1.CSV
+# EE_FILENOTFOUND 29
+--error 29
+select * from t1;
+connection default;
+unlock tables;
+drop table t1;
+--disconnect con1
+
 --echo End of 5.1 tests

=== modified file 'storage/csv/ha_tina.cc'
--- a/storage/csv/ha_tina.cc	2008-03-29 15:56:33 +0000
+++ b/storage/csv/ha_tina.cc	2008-08-15 06:53:54 +0000
@@ -190,17 +190,12 @@ static TINA_SHARE *get_share(const char 
       Usually this will result in auto-repair, and we will get a good
       meta-file in the end.
     */
-    if ((share->meta_file= my_open(meta_file_name,
-                                   O_RDWR|O_CREAT, MYF(0))) == -1)
-      share->crashed= TRUE;
-
-    /*
-      If the meta file will not open we assume it is crashed and
-      mark it as such.
-    */
-    if (read_meta_file(share->meta_file, &share->rows_recorded))
+    if (((share->meta_file= my_open(meta_file_name,
+                                    O_RDWR|O_CREAT, MYF(MY_WME))) == -1) ||
+        read_meta_file(share->meta_file, &share->rows_recorded))
       share->crashed= TRUE;
   }
+
   share->use_count++;
   pthread_mutex_unlock(&tina_mutex);
 
@@ -342,11 +337,11 @@ int ha_tina::init_tina_writer()
   (void)write_meta_file(share->meta_file, share->rows_recorded, TRUE);
 
   if ((share->tina_write_filedes=
-        my_open(share->data_file_name, O_RDWR|O_APPEND, MYF(0))) == -1)
+        my_open(share->data_file_name, O_RDWR|O_APPEND, MYF(MY_WME))) == -1)
   {
     DBUG_PRINT("info", ("Could not open tina file writes"));
     share->crashed= TRUE;
-    DBUG_RETURN(1);
+    DBUG_RETURN(my_errno ? my_errno : -1);
   }
   share->tina_write_opened= TRUE;
 
@@ -828,8 +823,12 @@ int ha_tina::open(const char *name, int 
   }
 
   local_data_file_version= share->data_file_version;
-  if ((data_file= my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1)
-    DBUG_RETURN(0);
+  if ((data_file= my_open(share->data_file_name,
+                          O_RDONLY, MYF(MY_WME))) == -1)
+  {
+    free_share(share);
+    DBUG_RETURN(my_errno ? my_errno : -1);
+  }
 
   /*
     Init locking. Pass handler object to the locking routines,
@@ -1021,8 +1020,8 @@ int ha_tina::init_data_file()
   {
     local_data_file_version= share->data_file_version;
     if (my_close(data_file, MYF(0)) ||
-        (data_file= my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1)
-      return 1;
+        (data_file= my_open(share->data_file_name, O_RDONLY, MYF(MY_WME))) == -1)
+      return my_errno ? my_errno : -1;
   }
   file_buff->init_buff(data_file);
   return 0;
@@ -1290,8 +1289,9 @@ int ha_tina::rnd_end()
       DBUG_RETURN(-1);
 
     /* Open the file again */
-    if (((data_file= my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1))
-      DBUG_RETURN(-1);
+    if (((data_file= my_open(share->data_file_name,
+                             O_RDONLY, MYF(MY_WME))) == -1))
+      DBUG_RETURN(my_errno ? my_errno : -1);
     /*
       As we reopened the data file, increase share->data_file_version 
       in order to force other threads waiting on a table lock and  
@@ -1445,8 +1445,8 @@ int ha_tina::repair(THD* thd, HA_CHECK_O
 
   /* Open the file again, it should now be repaired */
   if ((data_file= my_open(share->data_file_name, O_RDWR|O_APPEND,
-                          MYF(0))) == -1)
-     DBUG_RETURN(-1);
+                          MYF(MY_WME))) == -1)
+     DBUG_RETURN(my_errno ? my_errno : -1);
 
   /* Set new file size. The file size will be updated by ::update_status() */
   local_saved_data_file_length= (size_t) current_position;

Thread
bzr commit into mysql-5.1-bugteam branch (gluh:2701) Bug#36638Sergey Glukhov15 Aug