diff options
author | unknown <dlenev@mockturtle.local> | 2007-01-19 23:15:59 +0300 |
---|---|---|
committer | unknown <dlenev@mockturtle.local> | 2007-01-19 23:15:59 +0300 |
commit | ac5e6f60a80e248227207d6c375ecf6b213e3046 (patch) | |
tree | 3b3d729cb85d01f23ffaae4eeea2c049a05d701c /mysql-test/include | |
parent | 5d68cff03a464571b5a9460c0b20edc559cd14db (diff) | |
download | mariadb-git-ac5e6f60a80e248227207d6c375ecf6b213e3046.tar.gz |
Fix for bug #25044 "ALTER TABLE ... ENABLE KEYS acquires global 'opening
tables' lock."
Execution of ALTER TABLE ... ENABLE KEYS on a table (which can take rather
long time) prevented concurrent execution of all statements using tables.
The problem was caused by the fact that we were holding LOCK_open mutex
during whole duration of this statement and particularly during call
to handler::enable_indexes(). This behavior was introduced as part of the
fix for bug 14262 "SP: DROP PROCEDURE|VIEW (maybe more) write to binlog
too late (race cond)"
The patch simply restores old behavior. Note that we can safely do this as
this operation takes exclusive lock (similar to name-lock) which blocks both
DML and DDL on the table being altered.
It also introduces mysql-test/include/wait_show_pattern.inc helper script
which is used to make test-case for this bug robust enough.
mysql-test/include/wait_slave_status.inc:
Now wait_slave_status.inc reuses more generic wait_output_matches.inc script.
sql/sql_table.cc:
mysql_alter_table():
Changed ALTER TABLE ... ENABLE/DISABLE KEYS not to hold LOCK_open mutex
during call to handler::enable_indexes() as the latter can take rather
long time and therefore such ALTER would block execution of all other
statements that use tables. We can safely do this as this operation takes
exclusive lock (similar to name-lock) on the table which is altered.
mysql-test/include/wait_show_pattern.inc:
New BitKeeper file ``mysql-test/include/wait_show_pattern.inc''
mysql-test/r/alter_table-big.result:
New BitKeeper file ``mysql-test/r/alter_table-big.result''
mysql-test/t/alter_table-big.test:
New BitKeeper file ``mysql-test/t/alter_table-big.test''
Diffstat (limited to 'mysql-test/include')
-rw-r--r-- | mysql-test/include/wait_show_pattern.inc | 51 | ||||
-rw-r--r-- | mysql-test/include/wait_slave_status.inc | 43 |
2 files changed, 58 insertions, 36 deletions
diff --git a/mysql-test/include/wait_show_pattern.inc b/mysql-test/include/wait_show_pattern.inc new file mode 100644 index 00000000000..c9f84ce7f08 --- /dev/null +++ b/mysql-test/include/wait_show_pattern.inc @@ -0,0 +1,51 @@ +# include/wait_show_pattern.inc +# +# SUMMARY +# +# Waits until output produced by SHOW statement which particular type is +# specified as parameter matches certain pattern or maximum time reached. +# +# NOTES +# +# Only the first row produced by the parameter statement is checked. +# +# USAGE +# +# let $show_type= <Tail of SHOW statement>; +# let $show_pattern= 'Pattern to be used for LIKE matching'; +# --source wait_show_pattern.inc +# +# EXAMPLES +# +# alter_table-big.test, wait_slave_status.inc +# +# SEE ALSO +# +# wait_slave_status.inc, wait_condition.inc (>=5.1) +# +############################################################################### + +--disable_query_log + +# We accept to wait maximum 30 seconds (0.2 sec/loop). +let $wait_counter= 150; +while ($wait_counter) +{ + let $result= `SHOW $show_type`; + let $success= `SELECT '$result' LIKE $show_pattern`; + if ($success) + { + let $wait_counter= 0; + } + if (!$success) + { + real_sleep 0.2; + dec $wait_counter; + } +} +if (!$success) +{ + echo Timeout in wait_show_pattern.inc \$show_type= $show_type \$show_pattern= $show_pattern (\$result= '$result'); +} + +--enable_query_log diff --git a/mysql-test/include/wait_slave_status.inc b/mysql-test/include/wait_slave_status.inc index 7d3636e673c..d8d048527cf 100644 --- a/mysql-test/include/wait_slave_status.inc +++ b/mysql-test/include/wait_slave_status.inc @@ -104,50 +104,21 @@ 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"; +let $show_type= SLAVE STATUS; +let $show_pattern= $result_pattern; +--enable_query_log - 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; +--source include/wait_show_pattern.inc - 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) +if (!$success) { let $message= ! Attention: Timeout in wait_slave_status.inc. | Possible reasons with decreasing probability: - | - The LIKE pattern ($result_pattern) is wrong, because the + | - The LIKE 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 + | - We met an extreme testing environment and timeout is | too small.; --source include/show_msg80.inc --echo DEBUG INFO START (wait_slave_status.inc): |