diff options
author | unknown <serg@serg.mylan> | 2005-02-23 18:26:49 +0100 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2005-02-23 18:26:49 +0100 |
commit | be9f1863b7d2ca608926b2a262d22e091555b026 (patch) | |
tree | 3a85b2c0fb186dad2792584c636c03bced72b88a /sql/log.cc | |
parent | 0cd185ea6a54ca2c8980b6c18371ed365d53f07c (diff) | |
download | mariadb-git-be9f1863b7d2ca608926b2a262d22e091555b026.tar.gz |
don't log BEGIN in auto-commit mode
correct end_log_pos for Xid_log_event
mysql-test/r/binlog.result:
don't depend on the previous tests
mysql-test/r/rpl_rotate_logs.result:
correct end_log_pos for Xid_log_event
mysql-test/t/binlog.test:
don't depend on the previous tests
sql/handler.h:
comment
sql/log_event.cc:
advance position for Xid
sql/log_event.h:
comment
sql/sql_class.h:
correct end_log_pos for Xid_log_event
sql/sql_parse.cc:
make sure commit handler knows whether it's autocommit or not
Diffstat (limited to 'sql/log.cc')
-rw-r--r-- | sql/log.cc | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/sql/log.cc b/sql/log.cc index 1b5d533738a..835b00cf0a4 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -80,8 +80,13 @@ static int binlog_close_connection(THD *thd) return 0; } -static inline void binlog_cleanup_trans(IO_CACHE *trans_log) +static int binlog_end_trans(THD *thd, IO_CACHE *trans_log, Log_event *end_ev) { + int error=0; + DBUG_ENTER("binlog_end_trans"); + if (end_ev) + error= mysql_bin_log.write(thd, trans_log, end_ev); + statistic_increment(binlog_cache_use, &LOCK_status); if (trans_log->disk_writes != 0) { @@ -90,6 +95,7 @@ static inline void binlog_cleanup_trans(IO_CACHE *trans_log) } reinit_io_cache(trans_log, WRITE_CACHE, (my_off_t) 0, 0, 1); // cannot fail trans_log->end_of_file= max_binlog_cache_size; + DBUG_RETURN(error); } static int binlog_prepare(THD *thd, bool all) @@ -103,21 +109,10 @@ static int binlog_prepare(THD *thd, bool all) return 0; } -static int binlog_real_commit(THD *thd, IO_CACHE *trans_log) -{ - int error; - DBUG_ENTER("binlog_real_commit"); - - /* Update the binary log as we have cached some queries */ - error= mysql_bin_log.write(thd, trans_log); - binlog_cleanup_trans(trans_log); - DBUG_RETURN(error); -} - static int binlog_commit(THD *thd, bool all) { IO_CACHE *trans_log= (IO_CACHE*)thd->ha_data[binlog_hton.slot]; - DBUG_ENTER("binlog_real_commit"); + DBUG_ENTER("binlog_commit"); DBUG_ASSERT(mysql_bin_log.is_open() && (all || !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)))); @@ -127,9 +122,7 @@ static int binlog_commit(THD *thd, bool all) DBUG_RETURN(0); } Query_log_event qev(thd, "COMMIT", 6, TRUE, FALSE); - qev.write(trans_log); - - DBUG_RETURN(binlog_real_commit(thd, trans_log)); + DBUG_RETURN(binlog_end_trans(thd, trans_log, &qev)); } static int binlog_rollback(THD *thd, bool all) @@ -153,10 +146,10 @@ static int binlog_rollback(THD *thd, bool all) if (unlikely(thd->options & OPTION_STATUS_NO_TRANS_UPDATE)) { Query_log_event qev(thd, "ROLLBACK", 8, TRUE, FALSE); - qev.write(trans_log); - error= mysql_bin_log.write(thd, trans_log); + error= binlog_end_trans(thd, trans_log, &qev); } - binlog_cleanup_trans(trans_log); + else + error= binlog_end_trans(thd, trans_log, 0); DBUG_RETURN(error); } @@ -1831,11 +1824,11 @@ uint MYSQL_LOG::next_file_id() that the same updates are run on the slave. */ -bool MYSQL_LOG::write(THD *thd, IO_CACHE *cache) +bool MYSQL_LOG::write(THD *thd, IO_CACHE *cache, Log_event *commit_event) { bool error= 0; VOID(pthread_mutex_lock(&LOCK_log)); - DBUG_ENTER("MYSQL_LOG::write(THD *, IO_CACHE *)"); + DBUG_ENTER("MYSQL_LOG::write(THD *, IO_CACHE *, Log_event *)"); if (likely(is_open())) // Should always be true { @@ -1844,9 +1837,8 @@ bool MYSQL_LOG::write(THD *thd, IO_CACHE *cache) /* Log "BEGIN" at the beginning of the transaction. which may contain more than 1 SQL statement. - There is no need to append "COMMIT", as it's already in the 'cache' - (in fact, Xid_log_event is there which does the commit on slaves) */ + if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { Query_log_event qinfo(thd, "BEGIN", 5, TRUE, FALSE); /* @@ -1878,10 +1870,14 @@ bool MYSQL_LOG::write(THD *thd, IO_CACHE *cache) if (my_b_write(&log_file, cache->read_pos, length)) goto err; cache->read_pos=cache->read_end; // Mark buffer used up + DBUG_EXECUTE_IF("half_binlogged_transaction", goto DBUG_skip_commit;); } while ((length=my_b_fill(cache))); + if (commit_event->write(&log_file)) + goto err; +DBUG_skip_commit: if (flush_io_cache(&log_file) || sync_binlog(&log_file)) - goto err; + goto err; DBUG_EXECUTE_IF("half_binlogged_transaction", abort();); if (cache->error) // Error on read { @@ -2995,10 +2991,8 @@ int TC_LOG_BINLOG::log(THD *thd, my_xid xid) { Xid_log_event xle(thd, xid); IO_CACHE *trans_log= (IO_CACHE*)thd->ha_data[binlog_hton.slot]; - if (xle.write(trans_log)) - return 0; thread_safe_increment(prepared_xids, &LOCK_prep_xids); - return !binlog_real_commit(thd, trans_log); // invert return value + return !binlog_end_trans(thd, trans_log, &xle); // invert return value } void TC_LOG_BINLOG::unlog(ulong cookie, my_xid xid) |