Hi Leonard,
Sorry for not doing this review before.
I don't know if you discussed this patch with Jasonh and other people
and you agreed on
the feature implemented here. So I am assuming that the
architecture/implementation is
still open for discussion. Said that, please find below some comments:
The patch does not show the relay log when the MySQL instance is also a
master and
the bin log is enabled. This should be fixed as follows:
1 - Change the command's syntax a little bit:
show binlog|relaylog ...;
2 - Add a flag in the LEX_MASTER_INFO, in order to distinguish between them.
3 - The same function could be called but the flag in the
LEX_MASTER_INFO will allow you
to know which type of file do you want to process.
4 - Introduce a variable mysql_relay_log which will be similar to
mysql_bin_log.
We can discuss more on that as I don't think a global variable is a good
idea. However,
for now, we can keep the same design in here.
5 - In mysql_show_binlog_events, we can decide which variable to use
based on the flag in
the LEX_MASTER_INFO.
I have also several comments regarding the test case but let's skip them
for now.
Cheers.
Leonard Zhou wrote:
> #At file:///home/zhl/mysql/rep/5.1/bug28777/
>
> 2793 Leonard Zhou 2009-02-11
> Bug#28777 show binlog events can work on relay log
>
> Show binlog event can't work on relay log.
>
> Check relay log when do mysql 'show binlog event', so this command can work on
> both bin log and relay log.
> added:
> mysql-test/include/master-slave-2.inc
> mysql-test/suite/rpl/r/rpl_bug28777-2.result
> mysql-test/suite/rpl/r/rpl_bug28777.result
> mysql-test/suite/rpl/t/rpl_bug28777-2-slave.opt
> mysql-test/suite/rpl/t/rpl_bug28777-2.test
> mysql-test/suite/rpl/t/rpl_bug28777-slave.opt
> mysql-test/suite/rpl/t/rpl_bug28777.test
> modified:
> sql/sql_parse.cc
> sql/sql_repl.cc
> sql/sql_repl.h
>
> per-file messages:
> mysql-test/include/master-slave-2.inc
> Master-slave file but doesn't do 'restet master' in slave
> mysql-test/suite/rpl/r/rpl_bug28777-2.result
> Test result of bug28777-2
> mysql-test/suite/rpl/r/rpl_bug28777.result
> Test result of bug28777
> mysql-test/suite/rpl/t/rpl_bug28777-2-slave.opt
> slave option file for closing bin log in slave
> mysql-test/suite/rpl/t/rpl_bug28777-2.test
> Test case for bug28777 without bin logging in slave
> mysql-test/suite/rpl/t/rpl_bug28777-slave.opt
> slave option file to set relay log in different directory
> mysql-test/suite/rpl/t/rpl_bug28777.test
> Test case for bug28777
> sql/sql_parse.cc
> Pass master_info to mysql_show_binlog_events
> sql/sql_repl.cc
> Check relay log when do mysql 'show binlog event'
> sql/sql_repl.h
> Add master_info variable
> === added file 'mysql-test/include/master-slave-2.inc'
> --- a/mysql-test/include/master-slave-2.inc 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/include/master-slave-2.inc 2009-02-11 08:57:59 +0000
> @@ -0,0 +1,48 @@
> +# The different between master-slave-2.inc and mster-slave.inc is not do 'reset
> master' in slave
> +# because we stop binlog in slave.
> +# Replication tests need binlog
> +source include/have_log_bin.inc;
> +
> +connect (master,127.0.0.1,root,,test,$MASTER_MYPORT,);
> +connect (master1,127.0.0.1,root,,test,$MASTER_MYPORT,);
> +connect (slave,127.0.0.1,root,,test,$SLAVE_MYPORT,);
> +connect (slave1,127.0.0.1,root,,test,$SLAVE_MYPORT,);
> +
> +# Reset the master and the slave to start fresh.
> +#
> +# It is necessary to execute RESET MASTER and RESET SLAVE on both
> +# master and slave since the replication setup might be circular.
> +#
> +# Since we expect STOP SLAVE to produce a warning as the slave is
> +# stopped (the server was started with skip-slave-start), we disable
> +# warnings when doing STOP SLAVE.
> +
> +connection slave;
> +--disable_warnings
> +stop slave;
> +source include/wait_for_slave_to_stop.inc;
> +--enable_warnings
> +connection master;
> +--disable_warnings
> +--disable_query_log
> +use test;
> +--enable_query_log
> +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
> +--enable_warnings
> +reset master;
> +--disable_query_log
> +reset slave;
> +--enable_query_log
> +connection slave;
> +reset slave;
> +# Clean up old test tables
> +--disable_warnings
> +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
> +--enable_warnings
> +--disable_query_log
> +--enable_query_log
> +start slave;
> +source include/wait_for_slave_to_start.inc;
> +
> +# Set the default connection to 'master'
> +connection master;
>
> === added file 'mysql-test/suite/rpl/r/rpl_bug28777-2.result'
> --- a/mysql-test/suite/rpl/r/rpl_bug28777-2.result 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_bug28777-2.result 2009-02-11 08:57:59 +0000
> @@ -0,0 +1,37 @@
> +stop slave;
> +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
> +reset master;
> +reset slave;
> +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
> +start slave;
> +==== Initialize ====
> +[on master]
> +CREATE TABLE t1 (a INT);
> +SHOW CREATE TABLE t1;
> +Table Create Table
> +t1 CREATE TABLE `t1` (
> + `a` int(11) DEFAULT NULL
> +) ENGINE=MyISAM DEFAULT CHARSET=latin1
> +INSERT INTO t1 VALUES (1);
> +INSERT INTO t1 VALUES (2);
> +INSERT INTO t1 VALUES (3);
> +INSERT INTO t1 VALUES (4);
> +INSERT INTO t1 VALUES (5);
> +INSERT INTO t1 VALUES (6);
> +SELECT * FROM t1 ORDER BY a;
> +a
> +1
> +2
> +3
> +4
> +5
> +6
> +[on slave]
> +==== Verify results on slave ====
> +show binlog events in 'slave-relay-bin.000002';
> +Log_name Pos Event_type Server_id End_log_pos Info
> +slave-relay-bin.000002 # Format_desc 2 # Server ver: 5.1.32-debug-log, Binlog ver:
> 4
> +slave-relay-bin.000002 # Rotate 2 # slave-relay-bin.000003;pos=4
> +==== Clean up ====
> +[on master]
> +DROP TABLE t1;
>
> === added file 'mysql-test/suite/rpl/r/rpl_bug28777.result'
> --- a/mysql-test/suite/rpl/r/rpl_bug28777.result 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_bug28777.result 2009-02-11 08:57:59 +0000
> @@ -0,0 +1,47 @@
> +stop slave;
> +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
> +reset master;
> +reset slave;
> +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
> +start slave;
> +==== Initialize ====
> +[on master]
> +CREATE TABLE t1 (a INT);
> +SHOW CREATE TABLE t1;
> +Table Create Table
> +t1 CREATE TABLE `t1` (
> + `a` int(11) DEFAULT NULL
> +) ENGINE=MyISAM DEFAULT CHARSET=latin1
> +INSERT INTO t1 VALUES (1);
> +INSERT INTO t1 VALUES (2);
> +INSERT INTO t1 VALUES (3);
> +INSERT INTO t1 VALUES (4);
> +INSERT INTO t1 VALUES (5);
> +INSERT INTO t1 VALUES (6);
> +SELECT * FROM t1 ORDER BY a;
> +a
> +1
> +2
> +3
> +4
> +5
> +6
> +[on slave]
> +==== Verify results on slave ====
> +show binlog events in 'slave-bin.000001';
> +Log_name Pos Event_type Server_id End_log_pos Info
> +slave-bin.000001 # Format_desc 2 # Server ver: 5.1.32-debug-log, Binlog ver: 4
> +slave-bin.000001 # Query 1 # use `test`; CREATE TABLE t1 (a INT)
> +slave-bin.000001 # Query 1 # use `test`; INSERT INTO t1 VALUES (1)
> +slave-bin.000001 # Query 1 # use `test`; INSERT INTO t1 VALUES (2)
> +slave-bin.000001 # Query 1 # use `test`; INSERT INTO t1 VALUES (3)
> +slave-bin.000001 # Query 1 # use `test`; INSERT INTO t1 VALUES (4)
> +slave-bin.000001 # Query 1 # use `test`; INSERT INTO t1 VALUES (5)
> +slave-bin.000001 # Query 1 # use `test`; INSERT INTO t1 VALUES (6)
> +show binlog events in 'slave-relay-bin.000002';
> +Log_name Pos Event_type Server_id End_log_pos Info
> +slave-relay-bin.000002 # Format_desc 2 # Server ver: 5.1.32-debug-log, Binlog ver:
> 4
> +slave-relay-bin.000002 # Rotate 2 # slave-relay-bin.000003;pos=4
> +==== Clean up ====
> +[on master]
> +DROP TABLE t1;
>
> === added file 'mysql-test/suite/rpl/t/rpl_bug28777-2-slave.opt'
> --- a/mysql-test/suite/rpl/t/rpl_bug28777-2-slave.opt 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_bug28777-2-slave.opt 2009-02-11 08:57:59 +0000
> @@ -0,0 +1 @@
> +--relay-log=$MYSQLTEST_VARDIR/tmp/slave-relay-bin --skip-log-bin
> --skip-log-slave-update
>
> === added file 'mysql-test/suite/rpl/t/rpl_bug28777-2.test'
> --- a/mysql-test/suite/rpl/t/rpl_bug28777-2.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_bug28777-2.test 2009-02-11 08:57:59 +0000
> @@ -0,0 +1,46 @@
> +# ==== Purpose ====
> +#
> +# Test that show bin log event can work with relay log file when binlog is close in
> slave.
> +#
> +# ==== Method ====
> +#
> +# Do 'show binlog events' for relay log file in slave.
> +#
> +
> +source include/have_binlog_format_statement.inc;
> +source include/master-slave-2.inc;
> +
> +
> +--echo ==== Initialize ====
> +
> +--echo [on master]
> +--connection master
> +
> +CREATE TABLE t1 (a INT);
> +SHOW CREATE TABLE t1;
> +
> +
> +INSERT INTO t1 VALUES (1);
> +INSERT INTO t1 VALUES (2);
> +INSERT INTO t1 VALUES (3);
> +INSERT INTO t1 VALUES (4);
> +INSERT INTO t1 VALUES (5);
> +INSERT INTO t1 VALUES (6);
> +SELECT * FROM t1 ORDER BY a;
> +
> +--echo [on slave]
> +sync_slave_with_master;
> +
> +
> +--echo ==== Verify results on slave ====
> +--replace_column 2 # 5 #
> +show binlog events in 'slave-relay-bin.000002';
> +
> +--echo ==== Clean up ====
> +
> +--echo [on master]
> +connection master;
> +DROP TABLE t1;
> +
> +#--echo [on slave]
> +sync_slave_with_master;
>
> === added file 'mysql-test/suite/rpl/t/rpl_bug28777-slave.opt'
> --- a/mysql-test/suite/rpl/t/rpl_bug28777-slave.opt 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_bug28777-slave.opt 2009-02-11 08:57:59 +0000
> @@ -0,0 +1 @@
> +--relay-log=$MYSQLTEST_VARDIR/tmp/slave-relay-bin
>
> === added file 'mysql-test/suite/rpl/t/rpl_bug28777.test'
> --- a/mysql-test/suite/rpl/t/rpl_bug28777.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_bug28777.test 2009-02-11 08:57:59 +0000
> @@ -0,0 +1,48 @@
> +# ==== Purpose ====
> +#
> +# Test that show bin log event can work with relay log file and bin log file.
> +#
> +# ==== Method ====
> +#
> +# Do 'show binlog events' for relay log file and bin log file in slave.
> +#
> +
> +source include/have_binlog_format_statement.inc;
> +source include/master-slave.inc;
> +
> +
> +--echo ==== Initialize ====
> +
> +--echo [on master]
> +--connection master
> +
> +CREATE TABLE t1 (a INT);
> +SHOW CREATE TABLE t1;
> +
> +
> +INSERT INTO t1 VALUES (1);
> +INSERT INTO t1 VALUES (2);
> +INSERT INTO t1 VALUES (3);
> +INSERT INTO t1 VALUES (4);
> +INSERT INTO t1 VALUES (5);
> +INSERT INTO t1 VALUES (6);
> +SELECT * FROM t1 ORDER BY a;
> +
> +--echo [on slave]
> +sync_slave_with_master;
> +
> +
> +--echo ==== Verify results on slave ====
> +--replace_column 2 # 5 #
> +show binlog events in 'slave-bin.000001';
> +--replace_column 2 # 5 #
> +show binlog events in 'slave-relay-bin.000002';
> +
> +--echo ==== Clean up ====
> +
> +--echo [on master]
> +connection master;
> +DROP TABLE t1;
> +
> +#--echo [on slave]
> +sync_slave_with_master;
>
> === modified file 'sql/sql_parse.cc'
> --- a/sql/sql_parse.cc 2009-02-05 06:16:00 +0000
> +++ b/sql/sql_parse.cc 2009-02-11 08:57:59 +0000
> @@ -2321,7 +2321,7 @@ mysql_execute_command(THD *thd)
> {
> if (check_global_access(thd, REPL_SLAVE_ACL))
> goto error;
> - res = mysql_show_binlog_events(thd);
> + res = mysql_show_binlog_events(thd,active_mi);
> break;
> }
> #endif
>
> === modified file 'sql/sql_repl.cc'
> --- a/sql/sql_repl.cc 2009-01-23 12:22:05 +0000
> +++ b/sql/sql_repl.cc 2009-02-11 08:57:59 +0000
> @@ -1389,7 +1389,7 @@ int cmp_master_pos(const char* log_file_
> @retval FALSE success
> @retval TRUE failure
> */
> -bool mysql_show_binlog_events(THD* thd)
> +bool mysql_show_binlog_events(THD* thd, Master_info* mi)
> {
> Protocol *protocol= thd->protocol;
> List<Item> field_list;
> @@ -1414,7 +1414,7 @@ bool mysql_show_binlog_events(THD* thd)
> */
> ha_binlog_wait(thd);
>
> - if (mysql_bin_log.is_open())
> + if (mysql_bin_log.is_open() || mi->rli.relay_log.is_open())
> {
> LEX_MASTER_INFO *lex_mi= &thd->lex->mi;
> SELECT_LEX_UNIT *unit= &thd->lex->unit;
> @@ -1438,10 +1438,18 @@ bool mysql_show_binlog_events(THD* thd)
>
> linfo.index_file_offset = 0;
>
> - if (mysql_bin_log.find_log_pos(&linfo, name, 1))
> + if (!mysql_bin_log.is_open() || mysql_bin_log.find_log_pos(&linfo, name,
> 1))
> {
> - errmsg = "Could not find target log";
> - goto err;
> + if (log_file_name)
> + mi->rli.relay_log.make_log_name(search_file_name, log_file_name);
> + else
> + name=0; // Find first log
> +
> + if(mi->rli.relay_log.find_log_pos(&linfo, name, 1))
> + {
> + errmsg = "Could not find target log";
> + goto err;
> + }
> }
>
> pthread_mutex_lock(&LOCK_thread_count);
>
> === modified file 'sql/sql_repl.h'
> --- a/sql/sql_repl.h 2008-03-14 17:38:54 +0000
> +++ b/sql/sql_repl.h 2009-02-11 08:57:59 +0000
> @@ -39,7 +39,7 @@ extern my_bool opt_sporadic_binlog_dump_
> int start_slave(THD* thd, Master_info* mi, bool net_report);
> int stop_slave(THD* thd, Master_info* mi, bool net_report);
> bool change_master(THD* thd, Master_info* mi);
> -bool mysql_show_binlog_events(THD* thd);
> +bool mysql_show_binlog_events(THD* thd, Master_info* mi);
> int cmp_master_pos(const char* log_file_name1, ulonglong log_pos1,
> const char* log_file_name2, ulonglong log_pos2);
> int reset_slave(THD *thd, Master_info* mi);
>
>
>