1# ==== Purpose ====
2#
3# Waits until a variable from SHOW STATUS has returned a specified
4# value, or until a timeout is reached.
5#
6# ==== Usage ====
7#
8# let $status_var= Threads_connected;
9# let $status_var_value= 1;
10# --source include/wait_for_status_var.inc
11#
12# Parameters:
13#
14# $status_var, $status_var_value
15#   This macro will wait until the variable of SHOW STATUS
16#   named $status_var gets the value $status_var_value.  See
17#   the example above.
18#
19# $status_type= GLOBAL|SESSION
20#   To specify the type (attribute) of status variable and
21#   run either SHOW GLOBAL STATUS or SHOW SESSION STATUS.
22#
23# $status_var_comparsion
24#   By default, this file waits until $status_var becomes equal to
25#   $status_var_value.  If you want to wait until $status_var
26#   becomes *unequal* to $status_var_value, set this parameter to the
27#   string '!=', like this:
28#     let $status_var_comparsion= !=;
29#
30# $status_timeout
31#   The default timeout is 1 minute. You can change the timeout by
32#   setting $status_timeout. The unit is tenths of seconds.
33#
34
35if (`SELECT STRCMP('$status_type', '') * STRCMP(UPPER('$status_type'), 'SESSION') * STRCMP(UPPER('$status_type'), 'GLOBAL')`)
36{
37  --echo **** ERROR: Unknown type of variable status_type: allowed values are: SESSION or GLOBAL ****
38  die;
39}
40
41let $_status_timeout_counter= $status_timeout;
42if (!$_status_timeout_counter)
43{
44  let $_status_timeout_counter= 600;
45}
46
47let $_status_var_comparsion= $status_var_comparsion;
48if (!$_status_var_comparsion)
49{
50  let $_status_var_comparsion= =;
51}
52
53# Get type of variable
54let $_is_number= 0;
55if (`SELECT '$status_var_value' REGEXP '^[\+\-]*[0-9]+(\.[0-9]+)*\$'`)
56{
57  let $_is_number= 1;
58}
59
60let $_show_status_value= query_get_value("SHOW $status_type STATUS LIKE '$status_var'", Value, 1);
61
62# Set way of comparing
63let $_query= SELECT NOT('$_show_status_value' $_status_var_comparsion '$status_var_value');
64if ($_is_number)
65{
66  let $_query= SELECT NOT($_show_status_value $_status_var_comparsion $status_var_value);
67}
68
69while (`$_query`)
70{
71  if (!$_status_timeout_counter)
72  {
73    --echo **** ERROR: failed while waiting for '$status_type' '$status_var' $_status_var_comparsion '$status_var_value' ****
74    --echo Note: the following output may have changed since the failure was detected
75    --echo **** Showing STATUS, PROCESSLIST ****
76    eval SHOW $status_type STATUS LIKE '$status_var';
77    SHOW PROCESSLIST;
78    die;
79  }
80  dec $_status_timeout_counter;
81  sleep 0.1;
82  let $_show_status_value= query_get_value("SHOW $status_type STATUS LIKE '$status_var'", Value, 1);
83  let $_query= SELECT NOT('$_show_status_value' $_status_var_comparsion '$status_var_value');
84  if ($_is_number)
85  {
86    let $_query= SELECT NOT($_show_status_value $_status_var_comparsion $status_var_value);
87  }
88}
89