summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <petr/cps@mysql.com/owlet.local>2006-09-15 13:07:23 +0400
committerunknown <petr/cps@mysql.com/owlet.local>2006-09-15 13:07:23 +0400
commitabbb201661144f2a75d70c32da49dcb1692be412 (patch)
tree3a1c4f6bd0d0e7921561f89e6d54d823f9a3f2c2
parentd57163fcf84d6fc0e8cad5fdbbe5c14274eb694c (diff)
downloadmariadb-git-abbb201661144f2a75d70c32da49dcb1692be412.tar.gz
Post-review fixes for
Bug #18559 "log tables cannot change engine, and gets deadlocked when dropping w/ log on": 1) Add more generic error messages 2) Add new handlerton flag for engines, which support log tables 3) Remove (log-tables related) mutex lock in myisam to improve performance mysql-test/r/log_tables.result: update result file to use new error messages mysql-test/t/log_tables.test: update test file with new error messages sql/handler.h: Add new handlerton flag, to mark whether engine supports log tables sql/share/errmsg.txt: Add more generic error messages sql/sql_table.cc: Update error messages storage/csv/ha_tina.cc: CSV supports log tables storage/myisam/ha_myisam.cc: MyISAM supports log tables storage/myisam/mi_write.c: remove mutex lock to improve performance
-rw-r--r--mysql-test/r/log_tables.result18
-rw-r--r--mysql-test/t/log_tables.test18
-rw-r--r--sql/handler.h1
-rw-r--r--sql/share/errmsg.txt4
-rw-r--r--sql/sql_table.cc9
-rw-r--r--storage/csv/ha_tina.cc2
-rw-r--r--storage/myisam/ha_myisam.cc2
-rw-r--r--storage/myisam/mi_write.c8
8 files changed, 33 insertions, 29 deletions
diff --git a/mysql-test/r/log_tables.result b/mysql-test/r/log_tables.result
index 638c05dd712..59cef29dc8f 100644
--- a/mysql-test/r/log_tables.result
+++ b/mysql-test/r/log_tables.result
@@ -73,16 +73,16 @@ select * from mysql.slow_log;
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
TIMESTAMP USER_HOST QUERY_TIME 00:00:00 1 0 test 0 0 1 select sleep(2)
alter table mysql.general_log engine=myisam;
-ERROR HY000: You can't alter a log table if logging is enabled
+ERROR HY000: You cannot alter a log table if logging is enabled
alter table mysql.slow_log engine=myisam;
-ERROR HY000: You can't alter a log table if logging is enabled
+ERROR HY000: You cannot alter a log table if logging is enabled
drop table mysql.general_log;
-ERROR HY000: Cannot drop log table if log is enabled
+ERROR HY000: You cannot drop a log table if logging is enabled
drop table mysql.slow_log;
-ERROR HY000: Cannot drop log table if log is enabled
+ERROR HY000: You cannot drop a log table if logging is enabled
set global general_log='OFF';
alter table mysql.slow_log engine=myisam;
-ERROR HY000: You can't alter a log table if logging is enabled
+ERROR HY000: You cannot alter a log table if logging is enabled
set global slow_query_log='OFF';
show create table mysql.general_log;
Table Create Table
@@ -173,13 +173,13 @@ unlock tables;
set global general_log='OFF';
set global slow_query_log='OFF';
alter table mysql.slow_log engine=ndb;
-ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+ERROR HY000: This storage engine cannot be used for log tables"
alter table mysql.slow_log engine=innodb;
-ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+ERROR HY000: This storage engine cannot be used for log tables"
alter table mysql.slow_log engine=archive;
-ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+ERROR HY000: This storage engine cannot be used for log tables"
alter table mysql.slow_log engine=blackhole;
-ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+ERROR HY000: This storage engine cannot be used for log tables"
drop table mysql.slow_log;
drop table mysql.general_log;
drop table mysql.general_log;
diff --git a/mysql-test/t/log_tables.test b/mysql-test/t/log_tables.test
index 97c83310b4d..d9e17129799 100644
--- a/mysql-test/t/log_tables.test
+++ b/mysql-test/t/log_tables.test
@@ -178,21 +178,21 @@ select * from mysql.slow_log;
# check that appropriate error messages are given when one attempts to alter
# or drop a log tables, while corresponding logs are enabled
---error ER_CANT_ALTER_LOG_TABLE
+--error ER_BAD_LOG_STATEMENT
alter table mysql.general_log engine=myisam;
---error ER_CANT_ALTER_LOG_TABLE
+--error ER_BAD_LOG_STATEMENT
alter table mysql.slow_log engine=myisam;
---error ER_CANT_DROP_LOG_TABLE
+--error ER_BAD_LOG_STATEMENT
drop table mysql.general_log;
---error ER_CANT_DROP_LOG_TABLE
+--error ER_BAD_LOG_STATEMENT
drop table mysql.slow_log;
# check that one can alter log tables to MyISAM
set global general_log='OFF';
# cannot convert another log table
---error ER_CANT_ALTER_LOG_TABLE
+--error ER_BAD_LOG_STATEMENT
alter table mysql.slow_log engine=myisam;
# alter both tables
@@ -252,13 +252,13 @@ set global general_log='OFF';
set global slow_query_log='OFF';
# check that alter table doesn't work for other engines
---error ER_BAD_LOG_ENGINE
+--error ER_UNSUPORTED_LOG_ENGINE
alter table mysql.slow_log engine=ndb;
---error ER_BAD_LOG_ENGINE
+--error ER_UNSUPORTED_LOG_ENGINE
alter table mysql.slow_log engine=innodb;
---error ER_BAD_LOG_ENGINE
+--error ER_UNSUPORTED_LOG_ENGINE
alter table mysql.slow_log engine=archive;
---error ER_BAD_LOG_ENGINE
+--error ER_UNSUPORTED_LOG_ENGINE
alter table mysql.slow_log engine=blackhole;
drop table mysql.slow_log;
diff --git a/sql/handler.h b/sql/handler.h
index df40a207916..6d61a6ee271 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -681,6 +681,7 @@ struct handlerton
#define HTON_FLUSH_AFTER_RENAME (1 << 4)
#define HTON_NOT_USER_SELECTABLE (1 << 5)
#define HTON_TEMPORARY_NOT_SUPPORTED (1 << 6) //Having temporary tables not supported
+#define HTON_SUPPORT_LOG_TABLES (1 << 7) //Engine supports log tables
typedef struct st_thd_trans
{
diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt
index 2228ded870b..aa85be6f551 100644
--- a/sql/share/errmsg.txt
+++ b/sql/share/errmsg.txt
@@ -5960,3 +5960,7 @@ ER_HOSTNAME
eng "host name"
ER_WRONG_STRING_LENGTH
eng "String '%-.70s' is too long for %s (should be no longer than %d)"
+ER_UNSUPORTED_LOG_ENGINE
+ eng "This storage engine cannot be used for log tables""
+ER_BAD_LOG_STATEMENT
+ eng "You cannot %s a log table if logging is enabled"
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index f0f69676ed2..932237e98f8 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1628,7 +1628,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
(!my_strcasecmp(system_charset_info, table->table_name, "slow_log")
&& opt_slow_log && logger.is_slow_log_table_enabled())))
{
- my_error(ER_CANT_DROP_LOG_TABLE, MYF(0));
+ my_error(ER_BAD_LOG_STATEMENT, MYF(0), "drop");
DBUG_RETURN(1);
}
}
@@ -5174,7 +5174,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
(table_kind == SLOW_LOG && opt_slow_log &&
logger.is_slow_log_table_enabled()))
{
- my_error(ER_CANT_ALTER_LOG_TABLE, MYF(0));
+ my_error(ER_BAD_LOG_STATEMENT, MYF(0), "alter");
DBUG_RETURN(TRUE);
}
@@ -5182,10 +5182,9 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
if ((table_kind == GENERAL_LOG || table_kind == SLOW_LOG) &&
(lex_create_info->used_fields & HA_CREATE_USED_ENGINE) &&
(!lex_create_info->db_type || /* unknown engine */
- !(lex_create_info->db_type->db_type == DB_TYPE_MYISAM ||
- lex_create_info->db_type->db_type == DB_TYPE_CSV_DB)))
+ !(lex_create_info->db_type->flags & HTON_SUPPORT_LOG_TABLES)))
{
- my_error(ER_BAD_LOG_ENGINE, MYF(0));
+ my_error(ER_UNSUPORTED_LOG_ENGINE, MYF(0));
DBUG_RETURN(TRUE);
}
}
diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc
index 2fe2afeb470..76544146fa1 100644
--- a/storage/csv/ha_tina.cc
+++ b/storage/csv/ha_tina.cc
@@ -162,7 +162,7 @@ static int tina_init_func()
tina_hton.db_type= DB_TYPE_CSV_DB;
tina_hton.create= tina_create_handler;
tina_hton.panic= tina_end;
- tina_hton.flags= HTON_CAN_RECREATE;
+ tina_hton.flags= HTON_CAN_RECREATE | HTON_SUPPORT_LOG_TABLES;
}
return 0;
}
diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc
index 209478ee9a5..d6939d9ccc1 100644
--- a/storage/myisam/ha_myisam.cc
+++ b/storage/myisam/ha_myisam.cc
@@ -1783,7 +1783,7 @@ static int myisam_init()
myisam_hton.db_type=DB_TYPE_MYISAM;
myisam_hton.create=myisam_create_handler;
myisam_hton.panic=mi_panic;
- myisam_hton.flags=HTON_CAN_RECREATE;
+ myisam_hton.flags= HTON_CAN_RECREATE | HTON_SUPPORT_LOG_TABLES;
return 0;
}
diff --git a/storage/myisam/mi_write.c b/storage/myisam/mi_write.c
index f16d9471afe..7080875009b 100644
--- a/storage/myisam/mi_write.c
+++ b/storage/myisam/mi_write.c
@@ -167,13 +167,13 @@ int mi_write(MI_INFO *info, byte *record)
/*
Update status of the table. We need to do so after each row write
for the log tables, as we want the new row to become visible to
- other threads as soon as possible. We lock mutex here to follow
- pthread memory visibility rules.
+ other threads as soon as possible. We don't lock mutex here
+ (as it is required by pthread memory visibility rules) as (1) it's
+ not critical to use outdated share->is_log_table value (2) locking
+ mutex here for every write is too expensive.
*/
- pthread_mutex_lock(&share->intern_lock);
if (share->is_log_table)
mi_update_status((void*) info);
- pthread_mutex_unlock(&share->intern_lock);
allow_break(); /* Allow SIGHUP & SIGINT */
DBUG_RETURN(0);