mariadb/mysql-test/suite/multi_source/connects_tried.result
Brandon Nesterenko 74c189c312 MDEV-35304: Fix multi_source.connects_tried
Test multi_source.connects tried would sporadically fail with a result
mismatch resembling the following diff:

@@ -29,6 +29,7 @@
 SELECT @time_begin, CURRENT_TIMESTAMP(1)
 WHERE TIMESTAMPDIFF(SECOND, @time_begin, CURRENT_TIMESTAMP(1)) < 1;
 @time_begin  CURRENT_TIMESTAMP(1)
+2025-04-28 17:10:08.3  2025-04-28 17:10:09.2
 CREATE TEMPORARY TABLE status_sleep AS SELECT 'named' Connection_name, Connects_Tried Connects_Tried;
 SET @@SESSION.default_master_connection= '';
 include/wait_for_slave_param.inc [Connects_Tried]

This happened due to the reference variable @time_begin being set
_after_ the slave was started. That is, @time_begin was used as the
anchor point at which the time should start ticking for when
Connects_Tried should be incremented; however, MTR may not actually
be able to set it for some time after the slave had started due to
OS scheduling or heavy server load. The failure can be reproduced by
adding a 0.1s sleep statement in-between the aformentioned statements.

The fix is to set @time_begin before starting the slave so it is at
least always valid to reference as the start of the test case.
2025-04-29 11:00:37 -06:00

116 lines
5 KiB
Text

include/master-slave.inc [rpl_server_count=3]
[connection master]
include/rpl_stop_server.inc [server_number=1]
include/rpl_stop_server.inc [server_number=3]
connection slave;
CHANGE MASTER TO master_connect_retry=2;
CHANGE MASTER 'named' TO master_host='127.0.0.1', master_port=SERVER_MYPORT_3, master_user='root', master_ssl_verify_server_cert=0, master_connect_retry=1;
# `Connects_Tried` is 0 before connections begin.
SELECT Connection_name, Connects_Tried FROM information_schema.SLAVE_STATUS;
Connection_name Connects_Tried
0
named 0
SET @time_begin= CURRENT_TIMESTAMP(1);
START ALL SLAVES;
SET @@SESSION.default_master_connection= 'named';
include/wait_for_slave_io_error.inc [errno=2003]
SET @@SESSION.default_master_connection= '';
include/wait_for_slave_io_error.inc [errno=2003]
CREATE TEMPORARY TABLE status_begin AS
SELECT Connection_name, Connects_Tried FROM information_schema.SLAVE_STATUS;
# `Connects_Tried` is 1 immediately after connection begins.
SELECT Connection_name, Connects_Tried
FROM status_begin
WHERE Connects_Tried <= 0;
Connection_name Connects_Tried
# `Connects_Tried` takes (at least) 2s to increment for connection '' and 1s for 'named'.
SET @@SESSION.default_master_connection= 'named';
include/wait_for_slave_param.inc [Connects_Tried]
SELECT @time_begin, CURRENT_TIMESTAMP(1)
WHERE TIMESTAMPDIFF(SECOND, @time_begin, CURRENT_TIMESTAMP(1)) < 1;
@time_begin CURRENT_TIMESTAMP(1)
CREATE TEMPORARY TABLE status_sleep AS SELECT 'named' Connection_name, Connects_Tried Connects_Tried;
SET @@SESSION.default_master_connection= '';
include/wait_for_slave_param.inc [Connects_Tried]
SELECT @time_begin, CURRENT_TIMESTAMP(1)
WHERE TIMESTAMPDIFF(SECOND, @time_begin, CURRENT_TIMESTAMP(1)) < 2;
@time_begin CURRENT_TIMESTAMP(1)
INSERT INTO status_sleep SET Connection_name= '', Connects_Tried= Connects_Tried;
# Boot replication up and compare the final counts
include/rpl_start_server.inc [server_number=1]
include/rpl_start_server.inc [server_number=3]
connection slave;
SET @@SESSION.default_master_connection= 'named';
include/wait_for_slave_param.inc [Slave_IO_Running]
SET @@SESSION.default_master_connection= '';
include/wait_for_slave_param.inc [Slave_IO_Running]
CREATE TEMPORARY TABLE status_end AS
SELECT Connection_name, Connects_Tried FROM information_schema.SLAVE_STATUS;
# `Connects_Tried` increments (at least) 1 for each connection.
SELECT *
FROM status_sleep JOIN status_end USING(Connection_name)
WHERE status_end.Connects_Tried <= status_sleep.Connects_Tried;
Connection_name Connects_Tried Connects_Tried
DO SLEEP(2);
# `Connects_Tried` does not increment after connection establishes.
CREATE TEMPORARY TABLE status_after AS
SELECT Connection_name, Connects_Tried FROM information_schema.SLAVE_STATUS;
SELECT *
FROM status_end JOIN status_after USING(Connection_name)
WHERE status_after.Connects_Tried <> status_end.Connects_Tried;
Connection_name Connects_Tried Connects_Tried
# Conventional views
SELECT * FROM status_end;
Connection_name Connects_Tried
connects_tried
named connects_tried
SELECT * FROM status_end;
Connection_name Connects_Tried
connects_tried
named connects_tried
STOP ALL SLAVES;
SET @@SESSION.default_master_connection= 'named';
include/wait_for_slave_to_stop.inc
SET @@SESSION.default_master_connection= '';
include/wait_for_slave_to_stop.inc
# STOP SLAVE does not reset `Connects_Tried`.
CREATE TEMPORARY TABLE status_stop AS
SELECT Connection_name, Connects_Tried FROM information_schema.SLAVE_STATUS;
SELECT *
FROM status_after JOIN status_stop USING(Connection_name)
WHERE status_stop.Connects_Tried <> status_after.Connects_Tried;
Connection_name Connects_Tried Connects_Tried
include/start_slave.inc
# START SLAVE recounts `Connects_Tried` from 1 (for the restarted connection only).
CREATE TEMPORARY TABLE status_restart AS
SELECT Connection_name, Connects_Tried FROM information_schema.SLAVE_STATUS;
SELECT *
FROM status_stop JOIN status_restart USING(Connection_name)
WHERE status_restart.Connects_Tried NOT BETWEEN IF(
Connection_name = '', 1, status_stop.Connects_Tried
) AND status_stop.Connects_Tried;
Connection_name Connects_Tried Connects_Tried
include/stop_slave.inc
CHANGE MASTER TO Master_Retry_Count=777;
# Setting `Master_Retry_Count` resets `Connects_Tried` to 0 (for the changed connection only).
CREATE TEMPORARY TABLE status_change AS
SELECT Connection_name, Connects_Tried FROM information_schema.SLAVE_STATUS;
SELECT *
FROM status_restart JOIN status_change USING(Connection_name)
WHERE status_change.Connects_Tried <>
IF(Connection_name = '', 0, status_restart.Connects_Tried);
Connection_name Connects_Tried Connects_Tried
include/start_slave.inc
include/stop_slave.inc
RESET SLAVE;
# RESET SLAVE resets `Connects_Tried` to 0 (for the resetted connection only).
CREATE TEMPORARY TABLE status_reset AS
SELECT Connection_name, Connects_Tried FROM information_schema.SLAVE_STATUS;
SELECT *
FROM status_change JOIN status_reset USING(Connection_name)
WHERE status_reset.Connects_Tried <>
IF(Connection_name = '', 0, status_change.Connects_Tried);
Connection_name Connects_Tried Connects_Tried
# Cleanup
RESET SLAVE 'named' ALL;
include/rpl_end.inc