summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <petr/cps@owlet.>2006-08-04 14:48:51 +0400
committerunknown <petr/cps@owlet.>2006-08-04 14:48:51 +0400
commit79b03c66bf6b216658d9c8ac9b32cb49b6ee31e7 (patch)
tree36b4f6456529bdb18398792a9f4a58eb790d4c8e
parente1ec4de43f3fd812acee1f7c197cd73c929f7675 (diff)
parent157c42de9713618c23116079f634fa8b54fd403e (diff)
downloadmariadb-git-79b03c66bf6b216658d9c8ac9b32cb49b6ee31e7.tar.gz
Merge pchardin@bk-internal.mysql.com:/home/bk/mysql-5.1-runtime
into mysql.com:/home/cps/mysql/devel/5.1-curs-bug sql/ha_myisam.cc: Auto merged sql/handler.h: Auto merged sql/sql_table.cc: Auto merged mysql-test/r/log_tables.result: SCCS merged mysql-test/t/log_tables.test: SCCS merged
-rw-r--r--mysql-test/r/log_tables.result141
-rw-r--r--mysql-test/t/log_tables.test133
-rw-r--r--sql/ha_myisam.cc9
-rw-r--r--sql/handler.cc28
-rw-r--r--sql/handler.h2
-rw-r--r--sql/log.cc7
-rw-r--r--sql/log.h8
-rw-r--r--sql/share/errmsg.txt6
-rw-r--r--sql/sql_table.cc48
-rw-r--r--storage/csv/ha_tina.cc24
-rw-r--r--storage/myisam/mi_extra.c5
-rw-r--r--storage/myisam/mi_open.c1
-rw-r--r--storage/myisam/mi_write.c12
-rw-r--r--storage/myisam/myisamdef.h3
14 files changed, 403 insertions, 24 deletions
diff --git a/mysql-test/r/log_tables.result b/mysql-test/r/log_tables.result
index c817c2752a0..8b0a5ea6a20 100644
--- a/mysql-test/r/log_tables.result
+++ b/mysql-test/r/log_tables.result
@@ -72,6 +72,147 @@ sleep(2)
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
+alter table mysql.slow_log engine=myisam;
+ERROR HY000: You can't alter a log table if logging is enabled
+drop table mysql.general_log;
+ERROR HY000: Cannot drop log table if log is enabled
+drop table mysql.slow_log;
+ERROR HY000: Cannot drop log table if log 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
+set global slow_query_log='OFF';
+show create table mysql.general_log;
+Table Create Table
+general_log CREATE TABLE `general_log` (
+ `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `user_host` mediumtext,
+ `thread_id` int(11) DEFAULT NULL,
+ `server_id` int(11) DEFAULT NULL,
+ `command_type` varchar(64) DEFAULT NULL,
+ `argument` mediumtext
+) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
+show create table mysql.slow_log;
+Table Create Table
+slow_log CREATE TABLE `slow_log` (
+ `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `user_host` mediumtext NOT NULL,
+ `query_time` time NOT NULL,
+ `lock_time` time NOT NULL,
+ `rows_sent` int(11) NOT NULL,
+ `rows_examined` int(11) NOT NULL,
+ `db` varchar(512) DEFAULT NULL,
+ `last_insert_id` int(11) DEFAULT NULL,
+ `insert_id` int(11) DEFAULT NULL,
+ `server_id` int(11) DEFAULT NULL,
+ `sql_text` mediumtext NOT NULL
+) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
+alter table mysql.general_log engine=myisam;
+alter table mysql.slow_log engine=myisam;
+Warnings:
+Warning 1264 Out of range value for column 'last_insert_id' at row 0
+Warning 1264 Out of range value for column 'insert_id' at row 0
+show create table mysql.general_log;
+Table Create Table
+general_log CREATE TABLE `general_log` (
+ `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `user_host` mediumtext,
+ `thread_id` int(11) DEFAULT NULL,
+ `server_id` int(11) DEFAULT NULL,
+ `command_type` varchar(64) DEFAULT NULL,
+ `argument` mediumtext
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log'
+show create table mysql.slow_log;
+Table Create Table
+slow_log CREATE TABLE `slow_log` (
+ `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `user_host` mediumtext NOT NULL,
+ `query_time` time NOT NULL,
+ `lock_time` time NOT NULL,
+ `rows_sent` int(11) NOT NULL,
+ `rows_examined` int(11) NOT NULL,
+ `db` varchar(512) DEFAULT NULL,
+ `last_insert_id` int(11) DEFAULT NULL,
+ `insert_id` int(11) DEFAULT NULL,
+ `server_id` int(11) DEFAULT NULL,
+ `sql_text` mediumtext NOT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log'
+set global general_log='ON';
+set global slow_query_log='ON';
+select * from mysql.general_log;
+event_time user_host thread_id server_id command_type argument
+TIMESTAMP USER_HOST THREAD_ID 1 Query set names utf8
+TIMESTAMP USER_HOST THREAD_ID 1 Query create table bug16905 (s char(15) character set utf8 default 'пусто')
+TIMESTAMP USER_HOST THREAD_ID 1 Query insert into bug16905 values ('новое')
+TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.general_log
+TIMESTAMP USER_HOST THREAD_ID 1 Query drop table bug16905
+TIMESTAMP USER_HOST THREAD_ID 1 Query truncate table mysql.slow_log
+TIMESTAMP USER_HOST THREAD_ID 1 Query set session long_query_time=1
+TIMESTAMP USER_HOST THREAD_ID 1 Query select sleep(2)
+TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.slow_log
+TIMESTAMP USER_HOST THREAD_ID 1 Query alter table mysql.general_log engine=myisam
+TIMESTAMP USER_HOST THREAD_ID 1 Query alter table mysql.slow_log engine=myisam
+TIMESTAMP USER_HOST THREAD_ID 1 Query drop table mysql.general_log
+TIMESTAMP USER_HOST THREAD_ID 1 Query drop table mysql.slow_log
+TIMESTAMP USER_HOST THREAD_ID 1 Query set global general_log='OFF'
+TIMESTAMP USER_HOST THREAD_ID 1 Query set global slow_query_log='ON'
+TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.general_log
+flush logs;
+lock tables mysql.general_log WRITE;
+ERROR HY000: You can't write-lock a log table. Only read access is possible.
+lock tables mysql.slow_log WRITE;
+ERROR HY000: You can't write-lock a log table. Only read access is possible.
+lock tables mysql.general_log READ;
+ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead.
+lock tables mysql.slow_log READ;
+ERROR HY000: You can't use usual read lock with log tables. Try READ LOCAL instead.
+lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
+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
+alter table mysql.slow_log engine=innodb;
+ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+alter table mysql.slow_log engine=archive;
+ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+alter table mysql.slow_log engine=blackhole;
+ERROR HY000: One can use only CSV and MyISAM engines for the log tables
+drop table mysql.slow_log;
+drop table mysql.general_log;
+drop table mysql.general_log;
+ERROR 42S02: Unknown table 'general_log'
+drop table mysql.slow_log;
+ERROR 42S02: Unknown table 'slow_log'
+use mysql;
+CREATE TABLE `general_log` (
+`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
+ON UPDATE CURRENT_TIMESTAMP,
+`user_host` mediumtext,
+`thread_id` int(11) DEFAULT NULL,
+`server_id` int(11) DEFAULT NULL,
+`command_type` varchar(64) DEFAULT NULL,
+`argument` mediumtext
+) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';
+CREATE TABLE `slow_log` (
+`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
+ON UPDATE CURRENT_TIMESTAMP,
+`user_host` mediumtext NOT NULL,
+`query_time` time NOT NULL,
+`lock_time` time NOT NULL,
+`rows_sent` int(11) NOT NULL,
+`rows_examined` int(11) NOT NULL,
+`db` varchar(512) DEFAULT NULL,
+`last_insert_id` int(11) DEFAULT NULL,
+`insert_id` int(11) DEFAULT NULL,
+`server_id` int(11) DEFAULT NULL,
+`sql_text` mediumtext NOT NULL
+) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
+set global general_log='ON';
+set global slow_query_log='ON';
+use test;
flush tables with read lock;
unlock tables;
use mysql;
diff --git a/mysql-test/t/log_tables.test b/mysql-test/t/log_tables.test
index 236ef87e948..97c83310b4d 100644
--- a/mysql-test/t/log_tables.test
+++ b/mysql-test/t/log_tables.test
@@ -172,6 +172,139 @@ select sleep(2);
select * from mysql.slow_log;
#
+# Bug #18559 log tables cannot change engine, and gets deadlocked when
+# dropping w/ log on
+#
+
+# 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
+alter table mysql.general_log engine=myisam;
+--error ER_CANT_ALTER_LOG_TABLE
+alter table mysql.slow_log engine=myisam;
+
+--error ER_CANT_DROP_LOG_TABLE
+drop table mysql.general_log;
+--error ER_CANT_DROP_LOG_TABLE
+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
+alter table mysql.slow_log engine=myisam;
+
+# alter both tables
+set global slow_query_log='OFF';
+# check that both tables use CSV engine
+show create table mysql.general_log;
+show create table mysql.slow_log;
+
+alter table mysql.general_log engine=myisam;
+alter table mysql.slow_log engine=myisam;
+
+# check that the tables were converted
+show create table mysql.general_log;
+show create table mysql.slow_log;
+
+# enable log tables and chek that new tables indeed work
+set global general_log='ON';
+set global slow_query_log='ON';
+
+--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
+select * from mysql.general_log;
+
+# check that flush of myisam-based log tables work fine
+flush logs;
+
+# check locking of myisam-based log tables
+
+--error ER_CANT_WRITE_LOCK_LOG_TABLE
+lock tables mysql.general_log WRITE;
+
+--error ER_CANT_WRITE_LOCK_LOG_TABLE
+lock tables mysql.slow_log WRITE;
+
+#
+# This attemts to get TL_READ_NO_INSERT lock, which is incompatible with
+# TL_WRITE_CONCURRENT_INSERT. This should fail. We issue this error as log
+# tables are always opened and locked by the logger.
+#
+
+--error ER_CANT_READ_LOCK_LOG_TABLE
+lock tables mysql.general_log READ;
+
+--error ER_CANT_READ_LOCK_LOG_TABLE
+lock tables mysql.slow_log READ;
+
+#
+# This call should result in TL_READ lock on the log table. This is ok and
+# should pass.
+#
+
+lock tables mysql.slow_log READ LOCAL, mysql.general_log READ LOCAL;
+
+unlock tables;
+
+# check that we can drop them
+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
+alter table mysql.slow_log engine=ndb;
+--error ER_BAD_LOG_ENGINE
+alter table mysql.slow_log engine=innodb;
+--error ER_BAD_LOG_ENGINE
+alter table mysql.slow_log engine=archive;
+--error ER_BAD_LOG_ENGINE
+alter table mysql.slow_log engine=blackhole;
+
+drop table mysql.slow_log;
+drop table mysql.general_log;
+
+# check that table share cleanup is performed correctly (double drop)
+
+--error ER_BAD_TABLE_ERROR
+drop table mysql.general_log;
+--error ER_BAD_TABLE_ERROR
+drop table mysql.slow_log;
+
+# recreate tables and enable logs
+
+use mysql;
+
+CREATE TABLE `general_log` (
+ `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
+ ON UPDATE CURRENT_TIMESTAMP,
+ `user_host` mediumtext,
+ `thread_id` int(11) DEFAULT NULL,
+ `server_id` int(11) DEFAULT NULL,
+ `command_type` varchar(64) DEFAULT NULL,
+ `argument` mediumtext
+) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';
+
+CREATE TABLE `slow_log` (
+ `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
+ ON UPDATE CURRENT_TIMESTAMP,
+ `user_host` mediumtext NOT NULL,
+ `query_time` time NOT NULL,
+ `lock_time` time NOT NULL,
+ `rows_sent` int(11) NOT NULL,
+ `rows_examined` int(11) NOT NULL,
+ `db` varchar(512) DEFAULT NULL,
+ `last_insert_id` int(11) DEFAULT NULL,
+ `insert_id` int(11) DEFAULT NULL,
+ `server_id` int(11) DEFAULT NULL,
+ `sql_text` mediumtext NOT NULL
+) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
+
+set global general_log='ON';
+set global slow_query_log='ON';
+use test;
+
+#
# Bug #20139 Infinite loop after "FLUSH" and "LOCK tabX, general_log"
#
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc
index 2acc1f4ed7d..565010a1889 100644
--- a/sql/ha_myisam.cc
+++ b/sql/ha_myisam.cc
@@ -274,6 +274,15 @@ bool ha_myisam::check_if_locking_is_allowed(uint sql_command,
table->s->table_name.str);
return FALSE;
}
+
+ /*
+ Deny locking of the log tables, which is incompatible with
+ concurrent insert. Unless called from a logger THD:
+ general_log_thd or slow_log_thd.
+ */
+ if (!called_by_logger_thread)
+ return check_if_log_table_locking_is_allowed(sql_command, type, table);
+
return TRUE;
}
diff --git a/sql/handler.cc b/sql/handler.cc
index b356102a61a..754b0996d77 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -1422,6 +1422,34 @@ void handler::ha_statistic_increment(ulong SSV::*offset) const
statistic_increment(table->in_use->status_var.*offset, &LOCK_status);
}
+
+bool handler::check_if_log_table_locking_is_allowed(uint sql_command,
+ ulong type, TABLE *table)
+{
+ /*
+ Deny locking of the log tables, which is incompatible with
+ concurrent insert. Unless called from a logger THD:
+ general_log_thd or slow_log_thd.
+ */
+ if (table->s->log_table &&
+ sql_command != SQLCOM_TRUNCATE &&
+ sql_command != SQLCOM_ALTER_TABLE &&
+ !(sql_command == SQLCOM_FLUSH &&
+ type & REFRESH_LOG) &&
+ (table->reginfo.lock_type >= TL_READ_NO_INSERT))
+ {
+ /*
+ The check >= TL_READ_NO_INSERT denies all write locks
+ plus the only read lock (TL_READ_NO_INSERT itself)
+ */
+ table->reginfo.lock_type == TL_READ_NO_INSERT ?
+ my_error(ER_CANT_READ_LOCK_LOG_TABLE, MYF(0)) :
+ my_error(ER_CANT_WRITE_LOCK_LOG_TABLE, MYF(0));
+ return FALSE;
+ }
+ return TRUE;
+}
+
/*
Open database-handler.
diff --git a/sql/handler.h b/sql/handler.h
index ddcd6f860a7..201a2f1980a 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -974,6 +974,8 @@ public:
{
return TRUE;
}
+ bool check_if_log_table_locking_is_allowed(uint sql_command,
+ ulong type, TABLE *table);
int ha_open(TABLE *table, const char *name, int mode, int test_if_locked);
void adjust_next_insert_id_after_explicit_value(ulonglong nr);
bool update_auto_increment();
diff --git a/sql/log.cc b/sql/log.cc
index dba4b65efd9..b93d36cf630 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -1106,15 +1106,16 @@ void Log_to_csv_event_handler::
THD *log_thd, *curr= current_thd;
TABLE_LIST *table;
- if (!logger.is_log_tables_initialized)
- return; /* do nothing */
-
switch (log_table_type) {
case QUERY_LOG_GENERAL:
+ if (!logger.is_general_log_table_enabled())
+ return; /* do nothing */
log_thd= general_log_thd;
table= &general_log;
break;
case QUERY_LOG_SLOW:
+ if (!logger.is_slow_log_table_enabled())
+ return; /* do nothing */
log_thd= slow_log_thd;
table= &slow_log;
break;
diff --git a/sql/log.h b/sql/log.h
index b4818a370d7..d598952a853 100644
--- a/sql/log.h
+++ b/sql/log.h
@@ -497,6 +497,14 @@ public:
{}
void lock() { (void) pthread_mutex_lock(&LOCK_logger); }
void unlock() { (void) pthread_mutex_unlock(&LOCK_logger); }
+ bool is_general_log_table_enabled()
+ {
+ return table_log_handler && table_log_handler->general_log.table != 0;
+ }
+ bool is_slow_log_table_enabled()
+ {
+ return table_log_handler && table_log_handler->slow_log.table != 0;
+ }
/*
We want to initialize all log mutexes as soon as possible,
but we cannot do it in constructor, as safe_mutex relies on
diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt
index 75aba522543..e0f6a463ad8 100644
--- a/sql/share/errmsg.txt
+++ b/sql/share/errmsg.txt
@@ -5841,3 +5841,9 @@ ER_RBR_NOT_AVAILABLE
eng "The server was not built with row-based replication"
ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA
eng "Triggers can not be created on system tables"
+ER_CANT_ALTER_LOG_TABLE
+ eng "You can't alter a log table if logging is enabled"
+ER_BAD_LOG_ENGINE
+ eng "One can use only CSV and MyISAM engines for the log tables"
+ER_CANT_DROP_LOG_TABLE
+ eng "Cannot drop log table if log is enabled"
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 945fac83ff2..3e218f7d33e 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1537,6 +1537,18 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
table->db_type= NULL;
if ((share= get_cached_table_share(table->db, table->table_name)))
table->db_type= share->db_type;
+
+ /* Disable drop of enabled log tables */
+ if (share && share->log_table &&
+ ((!my_strcasecmp(system_charset_info, table->table_name,
+ "general_log") && opt_log &&
+ logger.is_general_log_table_enabled()) ||
+ (!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));
+ DBUG_RETURN(1);
+ }
}
if (lock_table_names(thd, tables))
@@ -5003,6 +5015,42 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
LINT_INIT(index_add_buffer);
LINT_INIT(index_drop_buffer);
+ if (table_list && table_list->db &&
+ !my_strcasecmp(system_charset_info, table_list->db, "mysql") &&
+ table_list->table_name)
+ {
+ enum enum_table_kind { NOT_LOG_TABLE= 1, GENERAL_LOG, SLOW_LOG }
+ table_kind= NOT_LOG_TABLE;
+
+ if (!my_strcasecmp(system_charset_info, table_list->table_name,
+ "general_log"))
+ table_kind= GENERAL_LOG;
+ else
+ if (!my_strcasecmp(system_charset_info, table_list->table_name,
+ "slow_log"))
+ table_kind= SLOW_LOG;
+
+ /* Disable alter of enabled log tables */
+ if ((table_kind == GENERAL_LOG && opt_log &&
+ logger.is_general_log_table_enabled()) ||
+ (table_kind == SLOW_LOG && opt_slow_log &&
+ logger.is_slow_log_table_enabled()))
+ {
+ my_error(ER_CANT_ALTER_LOG_TABLE, MYF(0));
+ DBUG_RETURN(TRUE);
+ }
+
+ /* Disable alter of log tables to unsupported engine */
+ if ((table_kind == GENERAL_LOG || table_kind == SLOW_LOG) &&
+ (lex_create_info->used_fields & HA_CREATE_USED_ENGINE) &&
+ !(lex_create_info->db_type->db_type == DB_TYPE_MYISAM ||
+ lex_create_info->db_type->db_type == DB_TYPE_CSV_DB))
+ {
+ my_error(ER_BAD_LOG_ENGINE, MYF(0));
+ DBUG_RETURN(TRUE);
+ }
+ }
+
thd->proc_info="init";
if (!(create_info= copy_create_info(lex_create_info)))
{
diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc
index 6bd8447720c..1b5098a7519 100644
--- a/storage/csv/ha_tina.cc
+++ b/storage/csv/ha_tina.cc
@@ -817,27 +817,9 @@ bool ha_tina::check_if_locking_is_allowed(uint sql_command,
uint count,
bool called_by_logger_thread)
{
- /*
- Deny locking of the log tables, which is incompatible with
- concurrent insert. Unless called from a logger THD:
- general_log_thd or slow_log_thd.
- */
- if (table->s->log_table &&
- sql_command != SQLCOM_TRUNCATE &&
- !(sql_command == SQLCOM_FLUSH &&
- type & REFRESH_LOG) &&
- !called_by_logger_thread &&
- (table->reginfo.lock_type >= TL_READ_NO_INSERT))
- {
- /*
- The check >= TL_READ_NO_INSERT denies all write locks
- plus the only read lock (TL_READ_NO_INSERT itself)
- */
- table->reginfo.lock_type == TL_READ_NO_INSERT ?
- my_error(ER_CANT_READ_LOCK_LOG_TABLE, MYF(0)) :
- my_error(ER_CANT_WRITE_LOCK_LOG_TABLE, MYF(0));
- return FALSE;
- }
+ if (!called_by_logger_thread)
+ return check_if_log_table_locking_is_allowed(sql_command, type, table);
+
return TRUE;
}
diff --git a/storage/myisam/mi_extra.c b/storage/myisam/mi_extra.c
index c1ed29c4734..93fe4ed5d52 100644
--- a/storage/myisam/mi_extra.c
+++ b/storage/myisam/mi_extra.c
@@ -366,6 +366,11 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg)
pthread_mutex_unlock(&share->intern_lock);
#endif
break;
+ case HA_EXTRA_MARK_AS_LOG_TABLE:
+ pthread_mutex_lock(&share->intern_lock);
+ share->is_log_table= TRUE;
+ pthread_mutex_unlock(&share->intern_lock);
+ break;
case HA_EXTRA_KEY_CACHE:
case HA_EXTRA_NO_KEY_CACHE:
default:
diff --git a/storage/myisam/mi_open.c b/storage/myisam/mi_open.c
index b61c1af24da..1675c596860 100644
--- a/storage/myisam/mi_open.c
+++ b/storage/myisam/mi_open.c
@@ -489,6 +489,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
share->data_file_type = DYNAMIC_RECORD;
my_afree((gptr) disk_cache);
mi_setup_functions(share);
+ share->is_log_table= FALSE;
#ifdef THREAD
thr_lock_init(&share->lock);
VOID(pthread_mutex_init(&share->intern_lock,MY_MUTEX_INIT_FAST));
diff --git a/storage/myisam/mi_write.c b/storage/myisam/mi_write.c
index 9ab8753f6d7..f16d9471afe 100644
--- a/storage/myisam/mi_write.c
+++ b/storage/myisam/mi_write.c
@@ -163,6 +163,18 @@ int mi_write(MI_INFO *info, byte *record)
(*info->invalidator)(info->filename);
info->invalidator=0;
}
+
+ /*
+ 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.
+ */
+ 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);
diff --git a/storage/myisam/myisamdef.h b/storage/myisam/myisamdef.h
index baab34b4b67..765e26dc74d 100644
--- a/storage/myisam/myisamdef.h
+++ b/storage/myisam/myisamdef.h
@@ -201,6 +201,9 @@ typedef struct st_mi_isam_share { /* Shared between opens */
uint blocksize; /* blocksize of keyfile */
myf write_flag;
enum data_file_type data_file_type;
+ /* Below flag is needed to make log tables work with concurrent insert */
+ my_bool is_log_table;
+
my_bool changed, /* If changed since lock */
global_changed, /* If changed since open */
not_flushed,