Commit 8fcc0bfe authored by Monty's avatar Monty

Fixed bug in semi_sync replication tests.

The problem was that wait_for_slave_io_to_start reported that the io thread
was ready, when it was still initializing. This caused test suite to
continue too early, for example before the semi sync plugin was properly
enabled.

Fixed by introducing a new internal stage: "Preparing". Slave_IO_Running is
now set to "Yes" only when all initializing is done and the IO thread is
ready to read things from the master.

The only test affected by this change is rpl_flsh_tbls, which got stuck in
the preparing phase while trying to read the GTID position from a table.
Fixed by having this test waiting for Preparing instead of Yes.
parent 661a6d89
...@@ -45,7 +45,13 @@ drop table t1; ...@@ -45,7 +45,13 @@ drop table t1;
connection slave; connection slave;
flush tables with read lock; flush tables with read lock;
start slave; start slave;
source include/wait_for_slave_to_start.inc;
# The IO thread will not be able to read the GTID because of flush tables
let $slave_param= Slave_IO_Running;
let $slave_param_value= Preparing;
source include/wait_for_slave_param.inc;
--source include/wait_for_slave_sql_to_start.inc
--error 1192 --error 1192
stop slave; stop slave;
......
...@@ -22,7 +22,8 @@ include/wait_for_slave_to_stop.inc ...@@ -22,7 +22,8 @@ include/wait_for_slave_to_stop.inc
drop table t1; drop table t1;
flush tables with read lock; flush tables with read lock;
start slave; start slave;
include/wait_for_slave_to_start.inc include/wait_for_slave_param.inc [Slave_IO_Running]
include/wait_for_slave_sql_to_start.inc
stop slave; stop slave;
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
unlock tables; unlock tables;
......
...@@ -14,6 +14,10 @@ DROP TABLE t1; ...@@ -14,6 +14,10 @@ DROP TABLE t1;
[connection slave] [connection slave]
include/install_semisync.inc include/install_semisync.inc
[connection slave] [connection slave]
show global status like "Slave%_running";
Variable_name Value
Slave_running ON
Slaves_running 1
UNINSTALL PLUGIN rpl_semi_sync_slave; UNINSTALL PLUGIN rpl_semi_sync_slave;
Warnings: Warnings:
Warning 1620 Plugin is busy and will be uninstalled on shutdown Warning 1620 Plugin is busy and will be uninstalled on shutdown
...@@ -21,6 +25,10 @@ select plugin_name,plugin_status from information_schema.plugins where plugin_na ...@@ -21,6 +25,10 @@ select plugin_name,plugin_status from information_schema.plugins where plugin_na
plugin_name plugin_status plugin_name plugin_status
rpl_semi_sync_slave DELETED rpl_semi_sync_slave DELETED
[connection master] [connection master]
show global status like "Slave%_connect%";
Variable_name Value
Slave_connections 2
Slaves_connected 1
UNINSTALL PLUGIN rpl_semi_sync_master; UNINSTALL PLUGIN rpl_semi_sync_master;
Warnings: Warnings:
Warning 1620 Plugin is busy and will be uninstalled on shutdown Warning 1620 Plugin is busy and will be uninstalled on shutdown
......
...@@ -22,7 +22,8 @@ include/wait_for_slave_to_stop.inc ...@@ -22,7 +22,8 @@ include/wait_for_slave_to_stop.inc
drop table t1; drop table t1;
flush tables with read lock; flush tables with read lock;
start slave; start slave;
include/wait_for_slave_to_start.inc include/wait_for_slave_param.inc [Slave_IO_Running]
include/wait_for_slave_sql_to_start.inc
stop slave; stop slave;
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
unlock tables; unlock tables;
......
...@@ -57,6 +57,8 @@ DROP TABLE t1; ...@@ -57,6 +57,8 @@ DROP TABLE t1;
# possible at this state # possible at this state
--connection slave --connection slave
--echo [connection slave] --echo [connection slave]
show global status like "Slave%_running";
UNINSTALL PLUGIN rpl_semi_sync_slave; UNINSTALL PLUGIN rpl_semi_sync_slave;
select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'rpl_%'; select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'rpl_%';
...@@ -64,6 +66,10 @@ select plugin_name,plugin_status from information_schema.plugins where plugin_na ...@@ -64,6 +66,10 @@ select plugin_name,plugin_status from information_schema.plugins where plugin_na
# possible at this state # possible at this state
--connection master --connection master
--echo [connection master] --echo [connection master]
# The following is to catch errors if the next uninstall plugin would succeed
show global status like "Slave%_connect%";
UNINSTALL PLUGIN rpl_semi_sync_master; UNINSTALL PLUGIN rpl_semi_sync_master;
select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'rpl_%'; select plugin_name,plugin_status from information_schema.plugins where plugin_name like 'rpl_%';
......
...@@ -7287,8 +7287,8 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff) ...@@ -7287,8 +7287,8 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff)
get_master_info(&thd->variables.default_master_connection, get_master_info(&thd->variables.default_master_connection,
Sql_condition::WARN_LEVEL_NOTE); Sql_condition::WARN_LEVEL_NOTE);
if (mi) if (mi)
tmp= (my_bool) (mi->slave_running == MYSQL_SLAVE_RUN_CONNECT && tmp= (my_bool) (mi->slave_running == MYSQL_SLAVE_RUN_READING &&
mi->rli.slave_running); mi->rli.slave_running != MYSQL_SLAVE_NOT_RUN);
} }
mysql_mutex_unlock(&LOCK_active_mi); mysql_mutex_unlock(&LOCK_active_mi);
if (mi) if (mi)
......
...@@ -1321,7 +1321,7 @@ bool Master_info_index::start_all_slaves(THD *thd) ...@@ -1321,7 +1321,7 @@ bool Master_info_index::start_all_slaves(THD *thd)
Try to start all slaves that are configured (host is defined) Try to start all slaves that are configured (host is defined)
and are not already running and are not already running
*/ */
if ((mi->slave_running != MYSQL_SLAVE_RUN_CONNECT || if ((mi->slave_running == MYSQL_SLAVE_NOT_RUN ||
!mi->rli.slave_running) && *mi->host) !mi->rli.slave_running) && *mi->host)
{ {
if ((error= start_slave(thd, mi, 1))) if ((error= start_slave(thd, mi, 1)))
......
...@@ -2615,6 +2615,8 @@ static bool send_show_master_info_header(THD *thd, bool full, ...@@ -2615,6 +2615,8 @@ static bool send_show_master_info_header(THD *thd, bool full,
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
/* Text for Slave_IO_Running */
static const char *slave_running[]= { "No", "Connecting", "Preparing", "Yes" };
static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full, static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full,
String *gtid_pos) String *gtid_pos)
...@@ -2668,9 +2670,7 @@ static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full, ...@@ -2668,9 +2670,7 @@ static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full,
&my_charset_bin); &my_charset_bin);
protocol->store((ulonglong) mi->rli.group_relay_log_pos); protocol->store((ulonglong) mi->rli.group_relay_log_pos);
protocol->store(mi->rli.group_master_log_name, &my_charset_bin); protocol->store(mi->rli.group_master_log_name, &my_charset_bin);
protocol->store(mi->slave_running == MYSQL_SLAVE_RUN_CONNECT ? protocol->store(slave_running[mi->slave_running], &my_charset_bin);
"Yes" : (mi->slave_running == MYSQL_SLAVE_RUN_NOT_CONNECT ?
"Connecting" : "No"), &my_charset_bin);
protocol->store(mi->rli.slave_running ? "Yes":"No", &my_charset_bin); protocol->store(mi->rli.slave_running ? "Yes":"No", &my_charset_bin);
protocol->store(rpl_filter->get_do_db()); protocol->store(rpl_filter->get_do_db());
protocol->store(rpl_filter->get_ignore_db()); protocol->store(rpl_filter->get_ignore_db());
...@@ -2713,7 +2713,7 @@ static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full, ...@@ -2713,7 +2713,7 @@ static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full,
Seconds_Behind_Master: if SQL thread is running and I/O thread is Seconds_Behind_Master: if SQL thread is running and I/O thread is
connected, we can compute it otherwise show NULL (i.e. unknown). connected, we can compute it otherwise show NULL (i.e. unknown).
*/ */
if ((mi->slave_running == MYSQL_SLAVE_RUN_CONNECT) && if ((mi->slave_running == MYSQL_SLAVE_RUN_READING) &&
mi->rli.slave_running) mi->rli.slave_running)
{ {
long time_diff; long time_diff;
......
...@@ -132,11 +132,11 @@ extern my_bool opt_replicate_annotate_row_events; ...@@ -132,11 +132,11 @@ extern my_bool opt_replicate_annotate_row_events;
extern ulonglong relay_log_space_limit; extern ulonglong relay_log_space_limit;
/* /*
3 possible values for Master_info::slave_running and 4 possible values for Master_info::slave_running and
Relay_log_info::slave_running. Relay_log_info::slave_running.
The values 0,1,2 are very important: to keep the diff small, I didn't The values 0,1,2,3 are very important: to keep the diff small, I didn't
substitute places where we use 0/1 with the newly defined symbols. So don't change substitute places where we use 0/1 with the newly defined symbols.
these values. So don't change these values.
The same way, code is assuming that in Relay_log_info we use only values The same way, code is assuming that in Relay_log_info we use only values
0/1. 0/1.
I started with using an enum, but I started with using an enum, but
...@@ -145,6 +145,7 @@ extern ulonglong relay_log_space_limit; ...@@ -145,6 +145,7 @@ extern ulonglong relay_log_space_limit;
#define MYSQL_SLAVE_NOT_RUN 0 #define MYSQL_SLAVE_NOT_RUN 0
#define MYSQL_SLAVE_RUN_NOT_CONNECT 1 #define MYSQL_SLAVE_RUN_NOT_CONNECT 1
#define MYSQL_SLAVE_RUN_CONNECT 2 #define MYSQL_SLAVE_RUN_CONNECT 2
#define MYSQL_SLAVE_RUN_READING 3
#define RPL_LOG_NAME (rli->group_master_log_name[0] ? rli->group_master_log_name :\ #define RPL_LOG_NAME (rli->group_master_log_name[0] ? rli->group_master_log_name :\
"FIRST") "FIRST")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment