summaryrefslogtreecommitdiff
path: root/sql/log.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/log.cc')
-rw-r--r--sql/log.cc50
1 files changed, 35 insertions, 15 deletions
diff --git a/sql/log.cc b/sql/log.cc
index 8a5aba5cd34..79ee59eedf8 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -1033,6 +1033,8 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command,
bool MYSQL_LOG::write(Log_event* event_info)
{
+ THD *thd=event_info->thd;
+ bool called_handler_commit=0;
bool error=0;
DBUG_ENTER("MYSQL_LOG::write(event)");
@@ -1047,7 +1049,6 @@ bool MYSQL_LOG::write(Log_event* event_info)
if (is_open())
{
bool should_rotate = 0;
- THD *thd=event_info->thd;
const char *local_db = event_info->get_db();
#ifdef USING_TRANSACTIONS
IO_CACHE *file = ((event_info->get_cache_stmt()) ?
@@ -1132,23 +1133,26 @@ bool MYSQL_LOG::write(Log_event* event_info)
was a MyISAM event!
*/
- if (file == &log_file && opt_using_transactions
- && !my_b_tell(&thd->transaction.trans_log))
+ if (file == &log_file) // we are writing to the real log (disk)
{
- /*
- LOAD DATA INFILE in AUTOCOMMIT=1 mode writes to the binlog
- chunks also before it is successfully completed. We only report
- the binlog write and do the commit inside the transactional table
- handler if the log event type is appropriate.
- */
-
- if (event_info->get_type_code() == QUERY_EVENT
- || event_info->get_type_code() == EXEC_LOAD_EVENT)
+ if (opt_using_transactions && !my_b_tell(&thd->transaction.trans_log))
{
- error = ha_report_binlog_offset_and_commit(thd, log_file_name,
- file->pos_in_file);
+ /*
+ LOAD DATA INFILE in AUTOCOMMIT=1 mode writes to the binlog
+ chunks also before it is successfully completed. We only report
+ the binlog write and do the commit inside the transactional table
+ handler if the log event type is appropriate.
+ */
+
+ if (event_info->get_type_code() == QUERY_EVENT
+ || event_info->get_type_code() == EXEC_LOAD_EVENT)
+ {
+ error = ha_report_binlog_offset_and_commit(thd, log_file_name,
+ file->pos_in_file);
+ called_handler_commit=1;
+ }
}
-
+ /* we wrote to the real log, check automatic rotation */
should_rotate= (my_b_tell(file) >= (my_off_t) max_binlog_size);
}
@@ -1172,6 +1176,15 @@ err:
}
pthread_mutex_unlock(&LOCK_log);
+
+ /* Flush the transactional handler log file now that we have released
+ LOCK_log; the flush is placed here to eliminate the bottleneck on the
+ group commit */
+
+ if (called_handler_commit) {
+ ha_commit_complete(thd);
+ }
+
DBUG_RETURN(error);
}
@@ -1277,6 +1290,13 @@ bool MYSQL_LOG::write(THD *thd, IO_CACHE *cache)
}
VOID(pthread_mutex_unlock(&LOCK_log));
+
+ /* Flush the transactional handler log file now that we have released
+ LOCK_log; the flush is placed here to eliminate the bottleneck on the
+ group commit */
+
+ ha_commit_complete(thd);
+
DBUG_RETURN(0);
err: