From: He Zhenxing Date: January 17 2011 8:24am Subject: Re: bzr commit into mysql-trunk branch (hezx:3481) Bug#12133 List-Archive: http://lists.mysql.com/commits/128895 Message-Id: <1295252650.1754.40.camel@hezx-laptop> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Hi Luis, Thank you for the review! Luís Soares wrote: > Hi Zhenxing, > > Nice Work. I don't have much to say about the server > changes. However, I have some recommendations for the test > case. Please find my review comments below. > > Finally, and FYI, I think that this patch also fixes BUG#55460 > (there might be others, eg: BUG#42879 and BUG#57771), wouldn't you > say so ? > I think BUG#55460 and BUG#57771 are duplicates, have marked then so. I think BUG#42879 should not exist after the patch for BUG#12190, have added a comment on the bug report, but I have not tested that because I have no Windows environment at hand. > Regards, > Luís > > > STATUS > ------ > > Patch not approved. > > REQUIRED CHANGES > ---------------- > > RC1. In rpl_binlog_index.test > > +--let $tmpdir= $MYSQLTEST_VARDIR/tmp/rpl_binlog_index > > I would create an unique tmp name for the directory (in case > this test would be executed in parallel that would avoid name > collisions). However, I don't think this is necessary, because > the test case has to run only once - which is not the case in > your patch. So I suggest you add right after source > include/master-slave.inc; the following line: > > source include/have_binlog_format_row.inc; > OK, I'll add the line. > RC1. In rpl_binlog_index.test > > I think you can use rpl_stop_server.inc, rpl_start_server.inc > instead of manually stopping and starting the servers. > right, will try that, thx for point out that > RC3. In rpl_binlog_index.test > > +INSERT INTO t1 VALUES (2); > +SELECT * FROM t1; > +sync_slave_with_master; > +SELECT * FROM t1; > > It's probably better that you use include/diff_tables instead. > Yes > > REQUESTS > -------- > n/a > > SUGGESTIONS > ----------- > n/a > > DETAILS > ------- > n/a > > On 01/12/2011 05:43 AM, He Zhenxing wrote: > > #At file:///media/sdb2/hezx/work/mysql/bzr/b12133/trunk/ based on revid:mattias.jonsson@stripped > > > > 3481 He Zhenxing 2011-01-12 > > BUG#12133 master.index file keeps mysqld from starting if bin log has been moved > > > > Absolute path or relative path to the data directory was recorded > > in the binlog or relay log index files, which caused the server > > unable to locate the log files and failed to start when user moved > > the binlog or relay log files to another directory and restart the > > server with binlog or relay log option set to the new path. > > > > Fixed the problem by only record the basename in the binlog or relay > > log index files, and use the directory of the binlog or relay log > > option to calculate the path to access the log files. > > > > When reading an index file that was generated by a server before > > the fix, the directory part will be stripped before calculating > > the path. > > @ mysql-test/include/setup_fake_relay_log.inc > > After fix of BUG#12133, there is no need to prepend ./ or .\ for > > filenames in the binlog or relay log index file. > > @ mysql-test/suite/rpl/t/rpl_manual_change_index_file.test > > After fix of BUG#12133, there is no need to prepend ./ or .\ for > > filenames in the binlog or relay log index file. > > > > added: > > mysql-test/suite/rpl/r/rpl_binlog_index.result > > mysql-test/suite/rpl/t/rpl_binlog_index.test > > modified: > > mysql-test/include/setup_fake_relay_log.inc > > mysql-test/suite/rpl/t/rpl_manual_change_index_file.test > > sql/binlog.cc > > sql/rpl_master.cc > > sql/rpl_rli.cc > > sql/rpl_slave.cc > > === modified file 'mysql-test/include/setup_fake_relay_log.inc' > > --- a/mysql-test/include/setup_fake_relay_log.inc 2010-12-19 17:22:30 +0000 > > +++ b/mysql-test/include/setup_fake_relay_log.inc 2011-01-12 05:43:32 +0000 > > @@ -80,19 +80,7 @@ RESET SLAVE; > > > > # Create relay log index. > > > > -# After patch for BUG#12190, the filename used in CHANGE MASTER > > -# RELAY_LOG_FILE will be automatically added the directory of the > > -# relay log before comparison, thus we need to added the directory > > -# part (./ on unix .\ on windows) when faking the relay-log-bin.index. > > - > > -# mysqltest currently parses backslash escapes wrong, so any sequence > > -# of N backslashes is collapsed to just one backslash. So we use the > > -# SQL function CHAR() to generate a backslash character instead. Since > > -# the string is interpreted in SQL context, we to escape it, so we use > > -# two backslashes. > > - > > ---let $_fake_dir= `select IF(convert(@@version_compile_os using latin1) IN ("Win32","Win64","Windows"), CONCAT('.', CHAR(92), CHAR(92)), './')` > > ---let $write_var= $_fake_dir$_fake_filename-fake.000001\n > > +--let $write_var= $_fake_filename-fake.000001\n > > --let $write_to_file= $_fake_relay_index > > --source include/write_var_to_file.inc > > > > > > === added file 'mysql-test/suite/rpl/r/rpl_binlog_index.result' > > --- a/mysql-test/suite/rpl/r/rpl_binlog_index.result 1970-01-01 00:00:00 +0000 > > +++ b/mysql-test/suite/rpl/r/rpl_binlog_index.result 2011-01-12 05:43:32 +0000 > > @@ -0,0 +1,24 @@ > > +include/master-slave.inc > > +[connection master] > > +CREATE TABLE t1 (a INT); > > +INSERT INTO t1 VALUES (1); > > +# Shutdown master > > +# Move the master binlog files and the index file to a new place > > +# Restart master with log-bin option set to the new path > > +# Master has restarted successfully > > +include/stop_slave.inc > > +# Move the slave binlog and relay log files and index to the new place > > +# Shutdown slave > > +# Restart slave with options log-bin, relay-log set to the new paths > > +# Slave has restarted successfully > > +include/start_slave.inc > > +INSERT INTO t1 VALUES (2); > > +SELECT * FROM t1; > > +a > > +1 > > +2 > > +SELECT * FROM t1; > > +a > > +1 > > +2 > > +DROP TABLE t1; > > > > === added file 'mysql-test/suite/rpl/t/rpl_binlog_index.test' > > --- a/mysql-test/suite/rpl/t/rpl_binlog_index.test 1970-01-01 00:00:00 +0000 > > +++ b/mysql-test/suite/rpl/t/rpl_binlog_index.test 2011-01-12 05:43:32 +0000 > > @@ -0,0 +1,125 @@ > > +# ==== Purpose ==== > > +# > > +# Test that server can work fine after moving binlog or relay log > > +# files to another directory and setting binlog or relay log paths to > > +# the new path. > > +# > > +# ==== Method ==== > > +# > > +# Start replication, and then shutdown the master, move the binary > > +# logs and the log index file to a another directory and then restart > > +# the server with option to set the new binlog directory. After master > > +# restarted successfully, do the similar on slave to check the relay > > +# log of slave. > > +# > > +# ==== Reference ==== > > +# > > +# BUG#12133 master.index file keeps mysqld from starting if bin log has been moved > > +# BUG#42576 Relay logs in relay-log.info&localhost-relay-bin.index not processed after move > > + > > +source include/master-slave.inc; > > + > > +connection master; > > +--let $master_datadir= `select @@datadir` > > +connection slave; > > +--let $slave_datadir= `select @@datadir` > > +connection master; > > +--let $tmpdir= $MYSQLTEST_VARDIR/tmp/rpl_binlog_index > > +--mkdir $tmpdir > > + > > +CREATE TABLE t1 (a INT); > > +INSERT INTO t1 VALUES (1); > > + > > +sync_slave_with_master; > > + > > +# > > +# Test on master > > +# > > +connection master; > > +--echo # Shutdown master > > +# Write file to make mysql-test-run.pl expect the "crash", but don't start > > +# it until it's told to > > +--exec echo "wait"> $MYSQLTEST_VARDIR/tmp/mysqld.1.expect > > + > > +# Send shutdown to the connected server and give > > +# it 10 seconds to die before zapping it > > +shutdown_server 10; > > + > > +--echo # Move the master binlog files and the index file to a new place > > +--move_file $master_datadir/master-bin.000001 $tmpdir/master-bin.000001 > > +--move_file $master_datadir/master-bin.index $tmpdir/master-bin.index > > + > > +--echo # Restart master with log-bin option set to the new path > > +--exec echo 'restart: --log-bin=$tmpdir/master-bin'> $MYSQLTEST_VARDIR/tmp/mysqld.1.expect > > + > > +# Turn on reconnect > > +--enable_reconnect > > + > > +# Call script that will poll the server waiting for it to be back online again > > +--source include/wait_until_connected_again.inc > > + > > +# Turn off reconnect again > > +--disable_reconnect > > + > > +--echo # Master has restarted successfully > > + > > +connection slave; > > +source include/stop_slave.inc; > > + > > +--disable_query_log > > +# slave-relay-bin.* files can vary, so read the slave-relay-bin.index > > +# to figure out the slave-relay-bin.* files > > +CREATE TEMPORARY TABLE tmp (id INT AUTO_INCREMENT PRIMARY KEY, filename VARCHAR(1024)); > > +# chmod to allow the following LOAD DATA > > +--chmod 0666 $slave_datadir/slave-relay-bin.index > > +--eval LOAD DATA INFILE '$slave_datadir/slave-relay-bin.index' INTO TABLE tmp (filename) > > +--let $count= `SELECT count(*) FROM tmp` > > +--echo # Move the slave binlog and relay log files and index to the new place > > +--move_file $slave_datadir/slave-bin.index $tmpdir/slave-bin.index > > +--move_file $slave_datadir/slave-bin.000001 $tmpdir/slave-bin.000001 > > +--move_file $slave_datadir/slave-relay-bin.index $tmpdir/slave-relay-bin.index > > +while ($count) > > +{ > > + --let $filename= `select filename from tmp where id=$count` > > + --move_file $slave_datadir/$filename $tmpdir/$filename > > + --dec $count > > +} > > +DROP TEMPORARY TABLE tmp; > > +--enable_query_log > > + > > +--echo # Shutdown slave > > +# Write file to make mysql-test-run.pl expect the "crash", but don't start > > +# it until it's told to > > +--exec echo "wait"> $MYSQLTEST_VARDIR/tmp/mysqld.2.expect > > + > > +# Send shutdown to the connected server and give > > +# it 10 seconds to die before zapping it > > +shutdown_server 10; > > + > > +--echo # Restart slave with options log-bin, relay-log set to the new paths > > +--exec echo 'restart: --log-bin=$tmpdir/slave-bin --relay-log=$tmpdir/slave-relay-bin'> $MYSQLTEST_VARDIR/tmp/mysqld.2.expect > > + > > +# Turn on reconnect > > +--enable_reconnect > > + > > +# Call script that will poll the server waiting for it to be back online again > > +--source include/wait_until_connected_again.inc > > + > > +# Turn off reconnect again > > +--disable_reconnect > > + > > +--echo # Slave has restarted successfully > > +source include/start_slave.inc; > > + > > +connection master; > > + > > +INSERT INTO t1 VALUES (2); > > +SELECT * FROM t1; > > +sync_slave_with_master; > > +SELECT * FROM t1; > > + > > +connection master; > > +DROP TABLE t1; > > +sync_slave_with_master; > > +--remove_files_wildcard $tmpdir * > > +--rmdir $tmpdir > > > > === modified file 'mysql-test/suite/rpl/t/rpl_manual_change_index_file.test' > > --- a/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test 2010-12-19 17:22:30 +0000 > > +++ b/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test 2011-01-12 05:43:32 +0000 > > @@ -11,8 +11,8 @@ source include/master-slave.inc; > > > > FLUSH LOGS; > > # Now, 2 entries in index file. > > -# ./master-bin.000001 > > -# ./master-bin.000002 > > +# master-bin.000001 > > +# master-bin.000002 > > > > CREATE TABLE t1(c1 INT); > > # Now, the current dump file(master-bin.000002) is the second line of index > > @@ -23,34 +23,23 @@ sync_slave_with_master; > > # events. > > > > connection master; > > -# Delete './master-bin.000001' from index file. > > +# Delete 'master-bin.000001' from index file. > > let $MYSQLD_DATADIR= `SELECT @@DATADIR`; > > let $file= $MYSQLD_DATADIR/master-bin.index; > > source include/truncate_file.inc; > > > > -if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`) > > -{ > > append_file $MYSQLD_DATADIR/master-bin.index; > > -./master-bin.000002 > > +master-bin.000002 > > EOF > > sleep 0.00000001; > > -} > > - > > -if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) IN ('Win32', 'Win64', 'Windows')`) > > -{ > > -append_file $MYSQLD_DATADIR/master-bin.index; > > -.\master-bin.000002 > > -EOF > > -sleep 0.00000001; > > -} > > > > # Now, only 1 entry in index file. ./master-bin.000002 > > > > # Generate master-bin.000003, but it is in the second line. > > FLUSH LOGS; > > # Now, 2 entries in index file. > > -# ./master-bin.000002 > > -# ./master-bin.000003 > > +# master-bin.000002 > > +# master-bin.000003 > > > > # Now, master know that new binlog file(master-bin.000003) has been generated. > > # It expects that the new binlog file is in third line of index file, but > > @@ -67,25 +56,12 @@ connection master; > > > > source include/truncate_file.inc; > > > > -if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`) > > -{ > > append_file $MYSQLD_DATADIR/master-bin.index; > > -./master-bin.000001 > > -./master-bin.000002 > > -./master-bin.000003 > > +master-bin.000001 > > +master-bin.000002 > > +master-bin.000003 > > EOF > > sleep 0.00000001; > > -} > > - > > -if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) IN ('Win32', 'Win64', 'Windows')`) > > -{ > > -append_file $MYSQLD_DATADIR/master-bin.index; > > -.\master-bin.000001 > > -.\master-bin.000002 > > -.\master-bin.000003 > > -EOF > > -sleep 0.00000001; > > -} > > > > CREATE TABLE t2(c1 INT); > > FLUSH LOGS; > > @@ -138,20 +114,11 @@ connection master; > > PURGE MASTER LOGS TO 'master-bin.000003'; > > > > --echo # Re-insert master-bin.000002 into index file manually. > > -if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`) > > -{ > > append_file $MASTER_DATADIR/master-bin.index; > > -./master-bin.000002 > > +master-bin.000002 > > EOF > > sleep 0.00000001; > > -} > > -if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) IN ('Win32', 'Win64', 'Windows')`) > > -{ > > -append_file $MASTER_DATADIR/master-bin.index; > > -.\master-bin.000002 > > -EOF > > -sleep 0.00000001; > > -} > > + > > --echo # PURGE is used to update IO_CACHE of index file. After this statement, > > --echo # master knows that master-bin.000002 is in index file. > > PURGE MASTER LOGS TO 'master-bin.000002'; > > @@ -176,20 +143,12 @@ connection master; > > --echo # Restore the correct index file. > > let $file= $MASTER_DATADIR/master-bin.index; > > source include/truncate_file.inc; > > -if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`) > > -{ > > -append_file $MASTER_DATADIR/master-bin.index; > > -./master-bin.000003 > > -EOF > > -sleep 0.00000001; > > -} > > -if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) IN ('Win32', 'Win64', 'Windows')`) > > -{ > > + > > append_file $MASTER_DATADIR/master-bin.index; > > -.\master-bin.000003 > > +master-bin.000003 > > EOF > > sleep 0.00000001; > > -} > > + > > FLUSH LOGS; > > PURGE MASTER LOGS TO 'master-bin.000004'; > > > > > > === modified file 'sql/binlog.cc' > > --- a/sql/binlog.cc 2010-12-17 02:01:32 +0000 > > +++ b/sql/binlog.cc 2011-01-12 05:43:32 +0000 > > @@ -42,6 +42,13 @@ static int binlog_commit(handlerton *hto > > static int binlog_rollback(handlerton *hton, THD *thd, bool all); > > static int binlog_prepare(handlerton *hton, THD *thd, bool all); > > > > +static inline bool same_log_name(const char* log_name1, const char* log_name2) > > +{ > > + uint dir_len1= dirname_length(log_name1); > > + uint dir_len2= dirname_length(log_name2); > > + return !strcmp(log_name1 + dir_len1, log_name2 + dir_len2); > > +} > > + > > /* > > Helper class to hold a mutex for the duration of the > > block. > > @@ -1425,7 +1432,9 @@ bool show_binlog_events(THD *thd, MYSQL_ > > thd->current_linfo =&linfo; > > mysql_mutex_unlock(&LOCK_thread_count); > > > > - if ((file=open_binlog(&log, linfo.log_file_name,&errmsg))< 0) > > + char log_path[FN_REFLEN]; > > + binary_log->make_log_name(log_path, linfo.log_file_name); > > + if ((file=open_binlog(&log, log_path,&errmsg))< 0) > > goto err; > > > > /* > > @@ -1473,7 +1482,7 @@ bool show_binlog_events(THD *thd, MYSQL_ > > description_event->checksum_alg= ev->checksum_alg; > > > > if (event_count>= limit_start&& > > - ev->net_send(protocol, linfo.log_file_name, pos)) > > + ev->net_send(protocol, log_path, pos)) > > { > > errmsg = "Net error"; > > delete ev; > > @@ -1868,9 +1877,10 @@ bool MYSQL_BIN_LOG::open(const char *log > > As this is a new log file, we write the file name to the index > > file. As every time we write to the index file, we sync it. > > */ > > + char *log_basename= log_file_name + dirname_length(log_file_name); > > if (DBUG_EVALUATE_IF("fault_injection_updating_index", 1, 0) || > > - my_b_write(&index_file, (uchar*) log_file_name, > > - strlen(log_file_name)) || > > + my_b_write(&index_file, (uchar*) log_basename, > > + strlen(log_basename)) || > > my_b_write(&index_file, (uchar*) "\n", 1) || > > flush_io_cache(&index_file) || > > mysql_file_sync(index_file.file, MYF(MY_WME))) > > @@ -2003,6 +2013,9 @@ int MYSQL_BIN_LOG::find_log_pos(LOG_INFO > > int error= 0; > > char *fname= linfo->log_file_name; > > uint log_name_len= log_name ? (uint) strlen(log_name) : 0; > > + uint log_dir_len= log_name ? dirname_length(log_name) : 0; > > + const char *log_basename= log_name + log_dir_len; > > + uint log_basename_len= log_name_len - log_dir_len; > > DBUG_ENTER("find_log_pos"); > > DBUG_PRINT("enter",("log_name: %s", log_name ? log_name : "NULL")); > > > > @@ -2032,10 +2045,23 @@ int MYSQL_BIN_LOG::find_log_pos(LOG_INFO > > break; > > } > > > > + const char *log_name_tmp; > > + uint log_name_len_tmp; > > + if (dirname_length(fname)) > > + { > > + log_name_tmp= log_name; > > + log_name_len_tmp= log_name_len; > > + } > > + else > > + { > > + log_name_tmp= log_basename; > > + log_name_len_tmp= log_basename_len; > > + } > > + > > // if the log entry matches, null string matching anything > > if (!log_name || > > - (log_name_len == length-1&& fname[log_name_len] == '\n'&& > > - !memcmp(fname, log_name, log_name_len))) > > + (log_name_len_tmp == length-1&& fname[log_name_len_tmp] == '\n'&& > > + !memcmp(fname, log_name_tmp, log_name_len_tmp))) > > { > > DBUG_PRINT("info",("Found log file entry")); > > fname[length-1]=0; // remove last \n > > @@ -2172,7 +2198,9 @@ bool MYSQL_BIN_LOG::reset_logs(THD* thd) > > > > for (;;) > > { > > - if ((error= my_delete_allow_opened(linfo.log_file_name, MYF(0))) != 0) > > + char log_name[FN_REFLEN]; > > + make_log_name(log_name, linfo.log_file_name); > > + if ((error= my_delete_allow_opened(log_name, MYF(0))) != 0) > > { > > if (my_errno == ENOENT) > > { > > @@ -2296,7 +2324,7 @@ int MYSQL_BIN_LOG::purge_first_log(Relay > > > > DBUG_ASSERT(is_open()); > > DBUG_ASSERT(rli->slave_running == 1); > > - DBUG_ASSERT(!strcmp(rli->linfo.log_file_name,rli->get_event_relay_log_name())); > > + DBUG_ASSERT(same_log_name(rli->linfo.log_file_name,rli->get_event_relay_log_name())); > > > > mysql_mutex_assert_owner(&rli->data_lock); > > > > @@ -2453,7 +2481,7 @@ int MYSQL_BIN_LOG::purge_logs(const char > > */ > > if ((error=find_log_pos(&log_info, NullS, 0 /*no mutex*/))) > > goto err; > > - while ((strcmp(to_log,log_info.log_file_name) || (exit_loop=included))&& > > + while ((!same_log_name(to_log,log_info.log_file_name) || (exit_loop=included))&& > > !is_active(log_info.log_file_name)&& > > !log_in_use(log_info.log_file_name)) > > { > > @@ -2806,12 +2834,13 @@ int MYSQL_BIN_LOG::purge_logs_before_dat > > if ((error=find_log_pos(&log_info, NullS, 0 /*no mutex*/))) > > goto err; > > > > - while (strcmp(log_file_name, log_info.log_file_name)&& > > + while (!same_log_name(log_file_name, log_info.log_file_name)&& > > !is_active(log_info.log_file_name)&& > > !log_in_use(log_info.log_file_name)) > > { > > - if (!mysql_file_stat(key_file_binlog, > > - log_info.log_file_name,&stat_area, MYF(0))) > > + char log_path[FN_REFLEN]; > > + make_log_name(log_path, log_info.log_file_name); > > + if (!mysql_file_stat(key_file_binlog, log_path,&stat_area, MYF(0))) > > { > > if (my_errno == ENOENT) > > { > > @@ -2870,6 +2899,7 @@ err: > > Create a new log file name. > > > > @param buf buf of at least FN_REFLEN where new name is stored > > + @return buf > > > > @note > > If file name will be longer then FN_REFLEN it will be truncated > > @@ -2877,11 +2907,12 @@ err: > > > > void MYSQL_BIN_LOG::make_log_name(char* buf, const char* log_ident) > > { > > + const char* log_name= log_ident + dirname_length(log_ident); > > uint dir_len = dirname_length(log_file_name); > > if (dir_len>= FN_REFLEN) > > dir_len=FN_REFLEN-1; > > strnmov(buf, log_file_name, dir_len); > > - strmake(buf+dir_len, log_ident, FN_REFLEN - dir_len -1); > > + strmake(buf+dir_len, log_name, FN_REFLEN - dir_len -1); > > } > > > > > > @@ -2891,7 +2922,7 @@ void MYSQL_BIN_LOG::make_log_name(char* > > > > bool MYSQL_BIN_LOG::is_active(const char *log_file_name_arg) > > { > > - return !strcmp(log_file_name, log_file_name_arg); > > + return same_log_name(log_file_name, log_file_name_arg); > > } > > > > > > @@ -4173,7 +4204,7 @@ int MYSQL_BIN_LOG::open(const char *opt_ > > > > do > > { > > - strmake(log_name, log_info.log_file_name, sizeof(log_name)-1); > > + make_log_name(log_name, log_info.log_file_name); > > } while (!(error= find_next_log(&log_info, 1))); > > > > if (error != LOG_INFO_EOF) > > @@ -4182,6 +4213,14 @@ int MYSQL_BIN_LOG::open(const char *opt_ > > goto err; > > } > > > > + if (!dirname_length(log_name)) > > + { > > + int dir_len= dirname_length(opt_name); > > + if (dir_len>= FN_REFLEN) > > + dir_len=FN_REFLEN-1; > > + strmake(log_name+dir_len, log_name, FN_REFLEN - dir_len -1); > > + strnmov(log_name, opt_name, dir_len); > > + } > > if ((file= open_binlog(&log, log_name,&errmsg))< 0) > > { > > sql_print_error("%s", errmsg); > > > > === modified file 'sql/rpl_master.cc' > > --- a/sql/rpl_master.cc 2010-12-17 10:07:30 +0000 > > +++ b/sql/rpl_master.cc 2011-01-12 05:43:32 +0000 > > @@ -622,8 +622,7 @@ void mysql_binlog_send(THD* thd, char* l > > ushort flags) > > { > > LOG_INFO linfo; > > - char *log_file_name = linfo.log_file_name; > > - char search_file_name[FN_REFLEN], *name; > > + char log_file_name[FN_REFLEN], *name; > > > > ulong ev_offset; > > > > @@ -672,7 +671,7 @@ void mysql_binlog_send(THD* thd, char* l > > heartbeat_ts=&heartbeat_buf; > > set_timespec_nsec(*heartbeat_ts, 0); > > coord=&coord_buf; > > - coord->file_name= log_file_name; // initialization basing on what slave remembers > > + coord->file_name= linfo.log_file_name; // points to the current binary log file name > > coord->pos= pos; > > } > > sql_print_information("Start binlog_dump to slave_server(%d), pos(%s, %lu)", > > @@ -706,9 +705,9 @@ void mysql_binlog_send(THD* thd, char* l > > goto err; > > } > > > > - name=search_file_name; > > + name=log_file_name; > > if (log_ident[0]) > > - mysql_bin_log.make_log_name(search_file_name, log_ident); > > + mysql_bin_log.make_log_name(log_file_name, log_ident); > > else > > name=0; // Find first log > > > > @@ -725,6 +724,10 @@ void mysql_binlog_send(THD* thd, char* l > > thd->current_linfo =&linfo; > > mysql_mutex_unlock(&LOCK_thread_count); > > > > + if (!name) > > + mysql_bin_log.make_log_name(log_file_name, > > + linfo.log_file_name); > > + > > if ((file=open_binlog(&log, log_file_name,&errmsg))< 0) > > { > > my_errno= ER_MASTER_FATAL_ERROR_READING_BINLOG; > > @@ -1001,7 +1004,7 @@ impossible position"; > > goto err; > > > > if (!(flags& BINLOG_DUMP_NON_BLOCK)&& > > - mysql_bin_log.is_active(log_file_name)) > > + mysql_bin_log.is_active(linfo.log_file_name)) > > { > > /* > > Block until there is more data in the log > > @@ -1178,7 +1181,7 @@ impossible position"; > > case 0: > > break; > > case LOG_INFO_EOF: > > - if (mysql_bin_log.is_active(log_file_name)) > > + if (mysql_bin_log.is_active(linfo.log_file_name)) > > { > > loop_breaker = (flags& BINLOG_DUMP_NON_BLOCK); > > break; > > @@ -1199,6 +1202,7 @@ impossible position"; > > if (reset_transmit_packet(thd, flags,&ev_offset,&errmsg)) > > goto err; > > > > + mysql_bin_log.make_log_name(log_file_name, linfo.log_file_name); > > /* > > Call fake_rotate_event() in case the previous log (the one which > > we have just finished reading) did not contain a Rotate event > > @@ -1215,9 +1219,7 @@ impossible position"; > > my_errno= ER_MASTER_FATAL_ERROR_READING_BINLOG; > > goto err; > > } > > - > > - if (coord) > > - coord->file_name= log_file_name; // reset to the next > > + DBUG_ASSERT(!coord || (coord->file_name == linfo.log_file_name)); > > } > > } > > > > > > === modified file 'sql/rpl_rli.cc' > > --- a/sql/rpl_rli.cc 2010-12-21 09:33:41 +0000 > > +++ b/sql/rpl_rli.cc 2011-01-12 05:43:32 +0000 > > @@ -104,11 +104,13 @@ static inline int add_relay_log(Relay_lo > > { > > MY_STAT s; > > DBUG_ENTER("add_relay_log"); > > - if (!mysql_file_stat(key_file_binlog, > > - linfo->log_file_name,&s, MYF(0))) > > + char log_name[FN_REFLEN]; > > + > > + rli->relay_log.make_log_name(log_name, linfo->log_file_name); > > + if (!mysql_file_stat(key_file_binlog, log_name,&s, MYF(0))) > > { > > sql_print_error("log %s listed in the index, but failed to stat", > > - linfo->log_file_name); > > + log_name); > > DBUG_RETURN(1); > > } > > rli->log_space_total += s.st_size; > > @@ -263,11 +265,12 @@ int Relay_log_info::init_relay_log_pos(c > > } > > else > > { > > + char log_name[FN_REFLEN]; > > + relay_log.make_log_name(log_name, linfo.log_file_name); > > /* > > Open the relay log and set cur_log to point at this one > > */ > > - if ((cur_log_fd=open_binlog(&cache_buf, > > - linfo.log_file_name,errmsg))< 0) > > + if ((cur_log_fd=open_binlog(&cache_buf, log_name, errmsg))< 0) > > goto err; > > cur_log =&cache_buf; > > } > > > > === modified file 'sql/rpl_slave.cc' > > --- a/sql/rpl_slave.cc 2010-12-10 16:55:50 +0000 > > +++ b/sql/rpl_slave.cc 2011-01-12 05:43:32 +0000 > > @@ -4943,9 +4943,11 @@ static IO_CACHE *reopen_relay_log(Relay_ > > DBUG_ASSERT(rli->cur_log !=&rli->cache_buf); > > DBUG_ASSERT(rli->cur_log_fd == -1); > > > > + char relay_log_name[FN_REFLEN]; > > + rli->relay_log.make_log_name(relay_log_name, rli->get_event_relay_log_name()); > > + > > IO_CACHE *cur_log = rli->cur_log=&rli->cache_buf; > > - if ((rli->cur_log_fd=open_binlog(cur_log,rli->get_event_relay_log_name(), > > - errmsg))<0) > > + if ((rli->cur_log_fd=open_binlog(cur_log, relay_log_name, errmsg))<0) > > DBUG_RETURN(0); > > /* > > We want to start exactly where we was before: > > @@ -5363,9 +5365,10 @@ static Log_event* next_event(Relay_log_i > > sql_print_information("next log '%s' is not active", > > rli->linfo.log_file_name); > > #endif > > + char log_name[FN_REFLEN]; > > + rli->relay_log.make_log_name(log_name, rli->linfo.log_file_name); > > // open_binlog() will check the magic header > > - if ((rli->cur_log_fd=open_binlog(cur_log,rli->linfo.log_file_name, > > -&errmsg))<0) > > + if ((rli->cur_log_fd=open_binlog(cur_log, log_name,&errmsg))<0) > > goto err; > > } > > else > > > > > > > > > >