diff options
author | Pedro Gomes <pedro.gomes@oracle.com> | 2013-02-15 22:18:37 +0000 |
---|---|---|
committer | Pedro Gomes <pedro.gomes@oracle.com> | 2013-02-15 22:18:37 +0000 |
commit | 552f1f4b86d387ce99cae4bbfd792606c97f825b (patch) | |
tree | c0584d4690d763c4e4d28ce67c668124f3b79e07 /sql | |
parent | 49b29688bb2c8b87ec38963eba679349d28ea48c (diff) | |
parent | 80699f32c708801fba7180feff199938908e8a3b (diff) | |
download | mariadb-git-552f1f4b86d387ce99cae4bbfd792606c97f825b.tar.gz |
BUG#13545447: RPL_ROTATE_LOGS FAILS DUE TO CONCURRENCY ISSUES IN REP. CODE
Merge from mysql 5.1 to mysql 5.5
Diffstat (limited to 'sql')
-rw-r--r-- | sql/log_event.cc | 8 | ||||
-rw-r--r-- | sql/log_event.h | 30 | ||||
-rw-r--r-- | sql/sql_repl.cc | 21 |
3 files changed, 52 insertions, 7 deletions
diff --git a/sql/log_event.cc b/sql/log_event.cc index 3bca6cc3dcf..dfbcecd2db9 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1029,7 +1029,9 @@ bool Log_event::write_header(IO_CACHE* file, ulong event_data_length) */ int Log_event::read_log_event(IO_CACHE* file, String* packet, - mysql_mutex_t* log_lock) + mysql_mutex_t* log_lock, + const char *log_file_name_arg, + bool* is_binlog_active) { ulong data_len; int result=0; @@ -1038,6 +1040,10 @@ int Log_event::read_log_event(IO_CACHE* file, String* packet, if (log_lock) mysql_mutex_lock(log_lock); + + if (log_file_name_arg) + *is_binlog_active= mysql_bin_log.is_active(log_file_name_arg); + if (my_b_read(file, (uchar*) buf, sizeof(buf))) { /* diff --git a/sql/log_event.h b/sql/log_event.h index 5b318463060..72a269304ca 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -997,8 +997,34 @@ public: mysql_mutex_t* log_lock, const Format_description_log_event *description_event); + + /** + Reads an event from a binlog or relay log. Used by the dump thread + this method reads the event into a raw buffer without parsing it. + + @Note If mutex is 0, the read will proceed without mutex. + + @Note If a log name is given than the method will check if the + given binlog is still active. + + @param[in] file log file to be read + @param[out] packet packet to hold the event + @param[in] lock the lock to be used upon read + @param[in] log_file_name_arg the log's file name + @param[out] is_binlog_active is the current log still active + + @retval 0 success + @retval LOG_READ_EOF end of file, nothing was read + @retval LOG_READ_BOGUS malformed event + @retval LOG_READ_IO io error while reading + @retval LOG_READ_MEM packet memory allocation failed + @retval LOG_READ_TRUNC only a partial event could be read + @retval LOG_READ_TOO_LARGE event too large + */ static int read_log_event(IO_CACHE* file, String* packet, - mysql_mutex_t* log_lock); + mysql_mutex_t* log_lock, + const char *log_file_name_arg= NULL, + bool* is_binlog_active= false); /* init_show_field_list() prepares the column names and types for the output of SHOW BINLOG EVENTS; it is used only by SHOW BINLOG diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 15d0d5c90d5..0eb6142090c 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -676,7 +676,10 @@ impossible position"; if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg)) goto err; - while (!(error= Log_event::read_log_event(&log, packet, log_lock))) + bool is_active_binlog= false; + while (!(error= Log_event::read_log_event(&log, packet, log_lock, + log_file_name, + &is_active_binlog))) { #ifndef DBUG_OFF if (max_binlog_dump_events && !left_events--) @@ -757,6 +760,13 @@ impossible position"; goto err; } + DBUG_EXECUTE_IF("wait_after_binlog_EOF", + { + const char act[]= "now wait_for signal.rotate_finished"; + DBUG_ASSERT(!debug_sync_set_action(current_thd, + STRING_WITH_LEN(act))); + };); + /* TODO: now that we are logging the offset, check to make sure the recorded offset and the actual match. @@ -767,8 +777,11 @@ impossible position"; if (test_for_non_eof_log_read_errors(error, &errmsg)) goto err; - if (!(flags & BINLOG_DUMP_NON_BLOCK) && - mysql_bin_log.is_active(log_file_name)) + /* + We should only move to the next binlog when the last read event + came from a already deactivated binlog. + */ + if (!(flags & BINLOG_DUMP_NON_BLOCK) && is_active_binlog) { /* Block until there is more data in the log |