summaryrefslogtreecommitdiff
path: root/mysql-test/include/wait_slave_status.inc
blob: 7d3636e673cf04840fd0fa3476f69b27294de370 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
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= <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
}