Loading mysql-test/r/rpl_drop_temp.result +1 −0 Original line number Diff line number Diff line Loading @@ -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; mysql-test/t/rpl_drop_temp.test +3 −0 Original line number Diff line number Diff line Loading @@ -11,3 +11,6 @@ disconnect master; connection slave; --real_sleep 3; # time for DROP to be written show status like 'Slave_open_temp_tables'; connection default; drop database mysqltest; sql/ha_innodb.cc +20 −1 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading @@ -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; ... <context switch> 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; } Loading sql/log_event.cc +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading
mysql-test/r/rpl_drop_temp.result +1 −0 Original line number Diff line number Diff line Loading @@ -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;
mysql-test/t/rpl_drop_temp.test +3 −0 Original line number Diff line number Diff line Loading @@ -11,3 +11,6 @@ disconnect master; connection slave; --real_sleep 3; # time for DROP to be written show status like 'Slave_open_temp_tables'; connection default; drop database mysqltest;
sql/ha_innodb.cc +20 −1 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading @@ -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; ... <context switch> 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; } Loading
sql/log_event.cc +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading