diff options
author | unknown <guilhem@gbichot2> | 2003-10-03 20:07:08 +0200 |
---|---|---|
committer | unknown <guilhem@gbichot2> | 2003-10-03 20:07:08 +0200 |
commit | c78680b43f3d2320218d9851d70e73df9409c22c (patch) | |
tree | 5c7bcc15a64ebbb6d3e7af9b70fb673670842c0c /sql/log_event.cc | |
parent | 187ca485549b9e9e429ed978fb57d4017b44f2a9 (diff) | |
download | mariadb-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.cc | 51 |
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); |