summaryrefslogtreecommitdiff
path: root/sql/log_event.cc
diff options
context:
space:
mode:
authorunknown <guilhem@gbichot2>2003-10-03 20:07:08 +0200
committerunknown <guilhem@gbichot2>2003-10-03 20:07:08 +0200
commitc78680b43f3d2320218d9851d70e73df9409c22c (patch)
tree5c7bcc15a64ebbb6d3e7af9b70fb673670842c0c /sql/log_event.cc
parent187ca485549b9e9e429ed978fb57d4017b44f2a9 (diff)
downloadmariadb-git-c78680b43f3d2320218d9851d70e73df9409c22c.tar.gz
Fix for a rpl_relayrotate failure.
Changed Rotate_log_event::exec_event() to not increment positions when the event is seen in the middle of a transaction. mysql-test/r/rpl_relayrotate.result: remove timeout which was too short for Valgrind mysql-test/r/rpl_until.result: updated error message mysql-test/t/rpl_relayrotate.test: removed timeout which was too short for Valgrind sql/log_event.cc: Fix for a rpl_relayrotate failure. The problem was that Rotate_log_event::exec_event() believed that the relay log was corrupted. Fixed it by moving the test for corruption to Start_log_event::exec_event(). Changed Rotate_log_event::exec_event() to not increment positions when the event is seen in the middle of a transaction (that was an old bug found by chance :)
Diffstat (limited to 'sql/log_event.cc')
-rw-r--r--sql/log_event.cc51
1 files changed, 26 insertions, 25 deletions
diff --git a/sql/log_event.cc b/sql/log_event.cc
index b6964c40422..23586201dcb 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -1086,6 +1086,23 @@ int Start_log_event::exec_event(struct st_relay_log_info* rli)
*/
close_temporary_tables(thd);
cleanup_load_tmpdir();
+ /*
+ As a transaction NEVER spans on 2 or more binlogs:
+ if we have an active transaction at this point, the master died while
+ writing the transaction to the binary log, i.e. while flushing the binlog
+ cache to the binlog. As the write was started, the transaction had been
+ committed on the master, so we lack of information to replay this
+ transaction on the slave; all we can do is stop with error.
+ */
+ if (thd->options & OPTION_BEGIN)
+ {
+ slave_print_error(rli, 0,
+ "there is an unfinished transaction in the relay log \
+(could find neither COMMIT nor ROLLBACK in the relay log); it could be that \
+the master died while writing the transaction to its binary log. Now the slave \
+is rolling back the transaction.");
+ return(1);
+ }
break;
/*
@@ -1871,35 +1888,19 @@ int Rotate_log_event::write_data(IO_CACHE* file)
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
int Rotate_log_event::exec_event(struct st_relay_log_info* rli)
{
- char* log_name = rli->group_master_log_name;
DBUG_ENTER("Rotate_log_event::exec_event");
pthread_mutex_lock(&rli->data_lock);
-
- if (thd->options & OPTION_BEGIN)
- {
- slave_print_error(rli, 0,
- opt_using_transactions ?
- "\
-There is an unfinished transaction in the relay log (could find neither \
-COMMIT nor ROLLBACK in the relay log); It could be that the master died while \
-writing the transaction to its binary log. Now the slave is rolling back the \
-transaction." :
- "\
-There is an unfinished transaction in the relay log (could find neither \
-COMMIT nor ROLLBACK in the relay log); It could be that the master died while \
-writing the transaction to its binary log.");
- pthread_mutex_unlock(&rli->data_lock);
- DBUG_RETURN(1);
- }
-
- memcpy(log_name, new_log_ident, ident_len+1);
- rli->notify_group_master_log_name_update();
- rli->group_master_log_pos = pos;
rli->event_relay_log_pos += get_event_len();
- rli->group_relay_log_pos = rli->event_relay_log_pos;
- DBUG_PRINT("info", ("group_master_log_pos: %lu",
- (ulong) rli->group_master_log_pos));
+ if (!(thd->options & OPTION_BEGIN))
+ {
+ memcpy(rli->group_master_log_name, new_log_ident, ident_len+1);
+ rli->notify_group_master_log_name_update();
+ rli->group_master_log_pos = pos;
+ rli->group_relay_log_pos = rli->event_relay_log_pos;
+ DBUG_PRINT("info", ("group_master_log_pos: %lu",
+ (ulong) rli->group_master_log_pos));
+ }
pthread_mutex_unlock(&rli->data_lock);
pthread_cond_broadcast(&rli->data_cond);
flush_relay_log_info(rli);