From d16d2df58e63d5ebe6614bbb90038e20b7ea93ed Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 23 Mar 2006 09:19:01 +0100 Subject: [PATCH] New file to remove sleeps in mysql-test-run (backported from 5.1) --- mysql-test/include/wait_slave_status.inc | 158 +++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 mysql-test/include/wait_slave_status.inc diff --git a/mysql-test/include/wait_slave_status.inc b/mysql-test/include/wait_slave_status.inc new file mode 100644 index 00000000000..7d3636e673c --- /dev/null +++ b/mysql-test/include/wait_slave_status.inc @@ -0,0 +1,158 @@ +# include/wait_slave_status.inc +# +# Created by Matthias Leich +# +# SUMMARY +# +# Waits until slave has reached certain state or maximum time reached. +# +# (This script will not work, when the SHOW command delivers more than one +# result record, because only the first record will be caught.) +# +# USAGE +# +# Set $result_pattern in test file and source this file: +# +# let $result_pattern= +# --include wait_slave_status.inc +# +# EXAMPLE +# +# The script rpl_until.test: +# ... +# --replace_result $MASTER_MYPORT MASTER_MYPORT +# --replace_column 1 # 9 # 23 # 33 # +# --vertical_results show slave status; +# +# outputs +# show slave status; +# Slave_IO_State # +# Master_Host 127.0.0.1 +# Master_User root +# Master_Port MASTER_MYPORT +# Connect_Retry 1 +# Master_Log_File master-bin.000001 +# Read_Master_Log_Pos 776 +# Relay_Log_File slave-relay-bin.000004 +# Relay_Log_Pos # +# Relay_Master_Log_File master-bin.000001 +# Slave_IO_Running Yes +# Slave_SQL_Running No +# Replicate_Do_DB +# Replicate_Ignore_DB +# Replicate_Do_Table +# Replicate_Ignore_Table +# Replicate_Wild_Do_Table +# Replicate_Wild_Ignore_Table +# Last_Errno 0 +# Last_Error +# Skip_Counter 0 +# Exec_Master_Log_Pos 319 +# Relay_Log_Space # +# Until_Condition Master +# Until_Log_File master-bin.000001 +# Until_Log_Pos 319 +# Master_SSL_Allowed No +# Master_SSL_CA_File +# Master_SSL_CA_Path +# Master_SSL_Cert +# Master_SSL_Cipher +# Master_SSL_Key +# Seconds_Behind_Master # +# +# The main problem with the "show slave status;" in rpl_until is, that +# depending on the total test engine power and the current load caused by +# other processes, the expected slave status might be not reached though +# it will happen in maybe some seconds. +# +# The typical problem with rpl_until is that Slave_IO_Running is "No" +# instead of "Yes". +# +# The expected result follows the LIKE pattern: +# +# let $result_pattern= '%127.0.0.1%root%1%master-bin.000001%776%slave-relay-bin.000004%master-bin.000001%Yes%No%0%0%319%Master%master-bin.000001%319%No%'; +# +# The Slave_IO_Running value is the "Yes" just after the "master-bin.000001". +# +# How to get this pattern ? +# +# Any lines "--replace_result ..." and "--replace_colum ..." just before +# the SHOW TABLE STATUS and of course the expected result itself +# show us columns where the content must be unified, because it is non +# deterministic or it depends on the current test environment. +# +# Unfortunately "--replace_result ..." and "--replace_colum ..." do not +# affect the result of our assignment let $my_val= `SHOW SLAVE STATUS`; +# Therefore such content must be covered by '%'. +# +# Please be careful. A more simple pattern might be dangerous, because we +# might get "wrong" matches. Example: There might be several "Yes" and "No" +# within one result row. +# +############################################################################### + +# We do not want to print the auxiliary commands, because they are not of +# interest and their amount will vary depending how fast we get the +# desired state. +--disable_query_log + +# The protocol should show +# - the setting of $result_pattern and +# - that this file is sourced , +# because this increases the chance to use the protocol as replay script. +eval SELECT "let \$result_pattern= $result_pattern ;" AS ""; +SELECT '--source include/wait_slave_status.inc' AS ""; + +# We accept to wait maximum 30 seconds (0.2 sec/loop). +let $max_wait= 150; +while ($max_wait) +{ + let $my_val= `SHOW SLAVE STATUS`; + # Now we have the first record of the SHOW result set as one fat string + # within the variable $my_val. + + eval SET @my_val = '$my_val'; + # DEBUG eval SELECT @my_val AS "response to SHOW SLAVE STATUS"; + + eval SELECT @my_val LIKE $result_pattern INTO @success; + # @success is '1' if we have a match + # '0' if we have no match + # DEBUG SELECT @success; + + let $success= `SELECT @success`; + let $no_success= `SELECT @success = 0`; + if ($success) + { + # We reached the expected result and want to jump out of the loop + # without unneeded sleeps. + # Attention: Do not set $max_wait to 0, because "while" with negative value + # does not work. + let $max_wait= 1; + } + if ($no_success) + { + # We did not reach the expected result and will have to sleep again + # or jump out of the loop, when max_wait is exhausted. + real_sleep 0.2; + } + dec $max_wait; +} +--enable_query_log +if ($no_success) +{ +let $message= ! Attention: Timeout in wait_slave_status.inc. + | Possible reasons with decreasing probability: + | - The LIKE pattern ($result_pattern) is wrong, because the + | testcase was altered or the layout of the + | SHOW SLAVE STATUS result set changed. + | - There is a new bug within the replication. + | - We met an extreme testing environment and $max_wait is + | too small.; +--source include/show_msg80.inc +--echo DEBUG INFO START (wait_slave_status.inc): +--echo $result_pattern +--vertical_results +show slave status; +--echo DEBUG INFO END +}