BUG#13545447: RPL_ROTATE_LOGS FAILS DUE TO CONCURRENCY ISSUES IN REP. CODE
Merge from mysql 5.1 to mysql 5.5
This commit is contained in:
commit
552f1f4b86
@ -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,
|
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;
|
ulong data_len;
|
||||||
int result=0;
|
int result=0;
|
||||||
@ -1038,6 +1040,10 @@ int Log_event::read_log_event(IO_CACHE* file, String* packet,
|
|||||||
|
|
||||||
if (log_lock)
|
if (log_lock)
|
||||||
mysql_mutex_lock(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)))
|
if (my_b_read(file, (uchar*) buf, sizeof(buf)))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -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
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -997,8 +997,34 @@ public:
|
|||||||
mysql_mutex_t* log_lock,
|
mysql_mutex_t* log_lock,
|
||||||
const Format_description_log_event
|
const Format_description_log_event
|
||||||
*description_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,
|
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
|
init_show_field_list() prepares the column names and types for the
|
||||||
output of SHOW BINLOG EVENTS; it is used only by SHOW BINLOG
|
output of SHOW BINLOG EVENTS; it is used only by SHOW BINLOG
|
||||||
|
@ -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
|
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
|
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))
|
if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
|
||||||
goto err;
|
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
|
#ifndef DBUG_OFF
|
||||||
if (max_binlog_dump_events && !left_events--)
|
if (max_binlog_dump_events && !left_events--)
|
||||||
@ -757,6 +760,13 @@ impossible position";
|
|||||||
goto err;
|
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
|
TODO: now that we are logging the offset, check to make sure
|
||||||
the recorded offset and the actual match.
|
the recorded offset and the actual match.
|
||||||
@ -767,8 +777,11 @@ impossible position";
|
|||||||
if (test_for_non_eof_log_read_errors(error, &errmsg))
|
if (test_for_non_eof_log_read_errors(error, &errmsg))
|
||||||
goto err;
|
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
|
Block until there is more data in the log
|
||||||
|
Loading…
x
Reference in New Issue
Block a user