#At file:///home/gluh/MySQL/bazaar/mysql-5.1-bug-36638/
2674 Sergey Glukhov 2008-08-05
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 unsuccesful
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
added connection cleanup
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 unsuccesful
=== 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-05 08:59:09 +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-05 08:59:09 +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,19 @@ 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
+--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-05 08:59:09 +0000
@@ -191,7 +191,7 @@ static TINA_SHARE *get_share(const char
meta-file in the end.
*/
if ((share->meta_file= my_open(meta_file_name,
- O_RDWR|O_CREAT, MYF(0))) == -1)
+ O_RDWR|O_CREAT, MYF(MY_WME))) == -1)
share->crashed= TRUE;
/*
@@ -342,7 +342,7 @@ 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;
@@ -828,8 +828,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(1);
+ }
/*
Init locking. Pass handler object to the locking routines,
@@ -1021,7 +1025,7 @@ 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)
+ (data_file= my_open(share->data_file_name, O_RDONLY, MYF(MY_WME))) == -1)
return 1;
}
file_buff->init_buff(data_file);
@@ -1290,7 +1294,8 @@ 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))
+ if (((data_file= my_open(share->data_file_name,
+ O_RDONLY, MYF(MY_WME))) == -1))
DBUG_RETURN(-1);
/*
As we reopened the data file, increase share->data_file_version
@@ -1445,7 +1450,7 @@ 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)
+ MYF(MY_WME))) == -1)
DBUG_RETURN(-1);
/* Set new file size. The file size will be updated by ::update_status() */