mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			159 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
# 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= <pattern used for LIKE on the result of
 | 
						|
#                           SHOW STATUS SLAVE>
 | 
						|
#      --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
 | 
						|
}
 |