From: Sergey Glukhov Date: August 7 2008 12:04pm Subject: bzr commit into mysql-5.1 branch (gluh:2674) Bug#36638 List-Archive: http://lists.mysql.com/commits/51092 X-Bug: 36638 Message-Id: <20080807120410.6E78024A0078@eagle.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #At file:///home/gluh/MySQL/bazaar/mysql-5.1-bug-36638/ 2674 Sergey Glukhov 2008-08-07 Bug#36638 mysqld crashes when open file limit is passed and general query log enabled(2nd ver) 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 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-07 12:04:01 +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-07 12:04:01 +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-07 12:04:01 +0000 @@ -191,8 +191,11 @@ 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; + goto error1; + } /* If the meta file will not open we assume it is crashed and @@ -201,6 +204,8 @@ static TINA_SHARE *get_share(const char if (read_meta_file(share->meta_file, &share->rows_recorded)) share->crashed= TRUE; } + +error1: share->use_count++; pthread_mutex_unlock(&tina_mutex); @@ -342,11 +347,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 +833,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 +1030,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 +1299,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 +1455,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;