summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorSergey Glukhov <gluh@mysql.com>2008-08-15 11:53:54 +0500
committerSergey Glukhov <gluh@mysql.com>2008-08-15 11:53:54 +0500
commit02aaff1b343ffd3cd397cc67d7f9eb69d8cb1545 (patch)
tree493de30713a4ba8185da9b027000cb08537bd10a /storage
parenta233d7b85174faafeb0a8fa9086fb7a17a30f84d (diff)
downloadmariadb-git-02aaff1b343ffd3cd397cc67d7f9eb69d8cb1545.tar.gz
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 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
Diffstat (limited to 'storage')
-rw-r--r--storage/csv/ha_tina.cc38
1 files changed, 19 insertions, 19 deletions
diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc
index f8dd778045f..a1ff0e29ad1 100644
--- a/storage/csv/ha_tina.cc
+++ b/storage/csv/ha_tina.cc
@@ -190,17 +190,12 @@ static TINA_SHARE *get_share(const char *table_name, TABLE *table)
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 mode, uint open_options)
}
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_OPT* check_opt)
/* 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;