From 262d7e4c091afff293275b2b6a4ea9e2b5f154d4 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Tue, 19 Sep 2017 17:20:36 +0300 Subject: [PATCH] Post-merge test fixes part #3. --- .../rocksdb/include/ddl_high_priority.inc | 174 ++++++++++++++++++ .../include/ddl_high_priority_module.inc | 141 ++++++++++++++ .../rocksdb/mysql-test/rocksdb/r/index.result | 4 +- 3 files changed, 317 insertions(+), 2 deletions(-) create mode 100644 storage/rocksdb/mysql-test/rocksdb/include/ddl_high_priority.inc create mode 100644 storage/rocksdb/mysql-test/rocksdb/include/ddl_high_priority_module.inc diff --git a/storage/rocksdb/mysql-test/rocksdb/include/ddl_high_priority.inc b/storage/rocksdb/mysql-test/rocksdb/include/ddl_high_priority.inc new file mode 100644 index 0000000000000..7adca5d7cf251 --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/include/ddl_high_priority.inc @@ -0,0 +1,174 @@ +############################################################################### +# Common test file for high priority DDL +############################################################################### + + +create user test_user1@localhost; +grant all on test to test_user1@localhost; +create user test_user2@localhost; +grant all on test to test_user2@localhost; + +# Default values +--let $con_block = con1 +--let $con_kill = default +--let $should_kill = 1 +--let $recreate_table = 1 +--let $throw_error = 1 + +## +## killing conflicting shared locks by alter table +## + +--let $blocking_sql = lock tables t1 read; +--let $cmd = alter table t1 modify i bigint; +--let $high_priority_cmd = alter high_priority table t1 modify i bigint; + +--source include/ddl_high_priority_module.inc + +## +## killing conflicting shared lock in a transaction +## transaction will rollback +## + +--let $blocking_sql = begin; insert into t1 values (4); select i from t1; +--let $cmd = alter table t1 rename t1_new; +--let $high_priority_cmd = alter high_priority table t1 rename t1_new; + +--source include/ddl_high_priority_module.inc + +select * from t1_new; +drop table t1_new; + +## +## simulate conflicting DDL which will not be killed +## + +# Simulate conflicting DDL +# This will hold MDL_SHARED_NO_READ_WRITE, which may be upgraded to exclusive +# locks to run DDLs like ALTER TABLE +# the upgradable/exclusive lock should not be killed + +--let $should_kill = 0 + +--let $blocking_sql = lock tables t1 write; +--let $cmd = drop table t1; +--let $high_priority_cmd = drop high_priority table t1; + +--source include/ddl_high_priority_module.inc + +# restore $should_kill +--let $should_kill = 1 + +## +## killing conflicting transaction by drop table DDL +## + +--let $blocking_sql = lock tables t1 read; begin; insert into t1 values (4); +--let $cmd = drop table t1; +--let $high_priority_cmd = drop high_priority table t1; + +--source include/ddl_high_priority_module.inc + +## +## no effect for regular users +## + +connect (con2,localhost,test_user2,,test,,); +# $con_kill is regular user +--let $con_kill = con2 +--let $should_kill = 0 + +--let $blocking_sql = lock tables t1 read; +--let $cmd = alter table t1 modify i bigint; +--let $high_priority_cmd = alter high_priority table t1 modify i bigint; + +--source include/ddl_high_priority_module.inc + +disconnect con2; + +# restore $con_kill +--let $con_kill = default +# restore $should_kill +--let $should_kill = 1 + +## +## create/drop index +## + +# create index + +--let $blocking_sql = lock tables t1 read; +--let $cmd = create index idx1 on t1 (i); +--let $high_priority_cmd = create high_priority index idx1 on t1 (i); + +--source include/ddl_high_priority_module.inc + +# drop index (use the previously created table) +--let $recreate_table = 0 + +--let $cmd = drop index idx1 on t1; +--let $high_priority_cmd = drop high_priority index idx1 on t1; + +--source include/ddl_high_priority_module.inc + +# restore $recreate_table +--let $recreate_table = 1 + +## +## high_priority truncate table +## + +--let $blocking_sql = lock tables t1 read; +--let $cmd = truncate t1; +--let $high_priority_cmd = truncate high_priority t1; + +--source include/ddl_high_priority_module.inc + +## +## high_priority create/drop trigger +## + +--let $blocking_sql = lock tables t1 read; +--let $cmd = create trigger ins_sum before insert on t1 for each row set @sum = @sum + new.i; +--let $high_priority_cmd = create high_priority trigger ins_sum before insert on t1 for each row set @sum = @sum + new.i; + +--source include/ddl_high_priority_module.inc + +# drop trigger (use the previously created table) +--let $recreate_table = 0 + +--let $cmd = drop trigger ins_sum; +--let $high_priority_cmd = drop high_priority trigger ins_sum; + +--source include/ddl_high_priority_module.inc + +# restore $recreate_table +--let $recreate_table = 1 + +## +## high_priority optimize table +## +## "optimize table" doesn't throw errors. It catches all errors, and +## returns a result set in a table +## + +--let $throw_error = 0 + +--let $blocking_sql = lock tables t1 read; +--let $cmd = optimize table t1; +--let $high_priority_cmd = optimize high_priority table t1; + +--source include/ddl_high_priority_module.inc + +# restore throw_error +--let $throw_error = 1 + +## +## clean up +## + +drop user test_user1@localhost; +drop user test_user2@localhost; +--disable_warnings +drop table if exists t1; +--enable_warnings diff --git a/storage/rocksdb/mysql-test/rocksdb/include/ddl_high_priority_module.inc b/storage/rocksdb/mysql-test/rocksdb/include/ddl_high_priority_module.inc new file mode 100644 index 0000000000000..ffbdc3064554a --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/include/ddl_high_priority_module.inc @@ -0,0 +1,141 @@ +############################################################################### +# This file plays as a function/module for ddl_high_priority test +# +# Usage: set the following variables before including +# +# $use_sys_var: whether using sys_var or syntax to trigger high_priority +# value: 0/1 +# +# $con_block: a blocking connection +# value: con1/con2/default +# +# $con_kill: a connection that will attempt to kill $con_blocking +# value: con1/con2/default +# +# $cmd: a regular command to evaluate (to use with sys var) +# value: sql command +# +# $high_priority_cmd: a high_priority command to evaluate +# value: sql command +# +# $should_kill: Expect the con_block to be killed or not +# value: 0/1 +# +# $recreate_table: Should recreate the test table or not +# value: 0/1 +# +# $throw_error: whether a command will throw lock_wait_timeout error. +# Note, optimize table catches all errors. +# value: 0/1 +############################################################################### + +## +## Print out the parameters of the test set +## (useful for debugging) +## +--echo +--echo ## Test parameters: +--echo ## use_sys_var = $use_sys_var +--echo ## con_block = $con_block +--echo ## con_kill = $con_kill +--echo ## cmd = $cmd +--echo ## high_priority_cmd = $high_priority_cmd +--echo ## should_kill = $should_kill +--echo ## recreate_table = $recreate_table +--echo ## throw_error = $throw_error +--echo + + +## +## Setup +## + +connection default; + +# create con1 +connect (con1,localhost,test_user1,,test,,); + +if ($recreate_table) { + # create t1 + --disable_warnings + drop table if exists t1; + --enable_warnings + create table t1 (i int); + show create table t1; + insert into t1 values (1), (2), (3); +} + +## +## Testing +## + +--echo connection: $con_block +--connection $con_block +--eval $blocking_sql + +--echo connection: $con_kill +--connection $con_kill +set lock_wait_timeout = 0.02; +set high_priority_lock_wait_timeout = 0.02; + +describe t1; + +--echo connection: default (for show processlist) +connection default; +--echo # both $con_block and $con_kill exist +--replace_column 1 3 5 6