From e28dc4c7ef4e8821a36d62946f28437040eb5cee Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 16 Mar 2005 23:47:38 +0100 Subject: [PATCH] log_event.cc: #ifdef USING_TRANSACTIONS ha_innodb.cc: comment rpl_drop_temp.test, rpl_drop_temp.result: cleanup mysql-test/r/rpl_drop_temp.result: cleanup mysql-test/t/rpl_drop_temp.test: cleanup sql/ha_innodb.cc: comment sql/log_event.cc: #ifdef USING_TRANSACTIONS --- mysql-test/r/rpl_drop_temp.result | 1 + mysql-test/t/rpl_drop_temp.test | 2 ++ sql/ha_innodb.cc | 21 ++++++++++++++++++++- sql/log_event.cc | 2 ++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/rpl_drop_temp.result b/mysql-test/r/rpl_drop_temp.result index e00309cac8f..04fe094ea26 100644 --- a/mysql-test/r/rpl_drop_temp.result +++ b/mysql-test/r/rpl_drop_temp.result @@ -10,3 +10,4 @@ create temporary table mysqltest.t2 (n int); show status like 'Slave_open_temp_tables'; Variable_name Value Slave_open_temp_tables 0 +drop database mysqltest; diff --git a/mysql-test/t/rpl_drop_temp.test b/mysql-test/t/rpl_drop_temp.test index 73d691d9d90..41cd2edd139 100644 --- a/mysql-test/t/rpl_drop_temp.test +++ b/mysql-test/t/rpl_drop_temp.test @@ -11,3 +11,5 @@ disconnect master; connection slave; --real_sleep 3; # time for DROP to be written show status like 'Slave_open_temp_tables'; +drop database mysqltest; + diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 0ccac274d58..072f6866d7a 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -1483,7 +1483,7 @@ innobase_commit( /* We were instructed to commit the whole transaction, or this is an SQL statement end and autocommit is on */ - /* We need current binlog position for HotBackup to work. + /* We need current binlog position for ibbackup to work. Note, the position is current because of prepare_commit_mutex */ trx->mysql_log_file_name = mysql_bin_log.get_log_fname(); trx->mysql_log_offset = @@ -6472,6 +6472,25 @@ innobase_xa_prepare( if (thd->lex->sql_command != SQLCOM_XA_PREPARE) { + /* For ibbackup to work the order of transactions in binlog + and InnoDB must be the same. Consider the situation + + thread1> prepare; write to binlog; ... + + thread2> prepare; write to binlog; commit + thread1> ... commit + + To ensure this will not happen we're taking the mutex on + prepare, and releasing it on commit. + + Note: only do it for normal commits, done via ha_commit_trans. + If 2pc protocol is executed by external transaction + coordinator, it will be just a regular MySQL client + executing XA PREPARE and XA COMMIT commands. + In this case we cannot know how many minutes or hours + will be between XA PREPARE and XA COMMIT, and we don't want + to block for undefined period of time. + */ pthread_mutex_lock(&prepare_commit_mutex); trx->active_trans = 2; } diff --git a/sql/log_event.cc b/sql/log_event.cc index 3176cdfd5cb..72fc9185d4c 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -2012,6 +2012,7 @@ int Format_description_log_event::exec_event(struct st_relay_log_info* rli) delete rli->relay_log.description_event_for_exec; rli->relay_log.description_event_for_exec= this; +#ifdef USING_TRANSACTIONS /* As a transaction NEVER spans on 2 or more binlogs: if we have an active transaction at this point, the master died @@ -2033,6 +2034,7 @@ int Format_description_log_event::exec_event(struct st_relay_log_info* rli) "to its binary log."); end_trans(thd, ROLLBACK); } +#endif /* If this event comes from ourselves, there is no cleaning task to perform, we don't call Start_log_event_v3::exec_event() (this was just to update the