Skip to content

Commit

Permalink
Post-merge test fixes part #3.
Browse files Browse the repository at this point in the history
  • Loading branch information
spetrunia committed Sep 19, 2017
1 parent da9c385 commit 262d7e4
Show file tree
Hide file tree
Showing 3 changed files with 317 additions and 2 deletions.
174 changes: 174 additions & 0 deletions 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
@@ -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 <Id> 3 <Host> 5 <Command> 6 <Time> 7 <State> 8 <Info> 9 <RExam> 10 <RSent> 11 <TID>
show processlist;

--echo connection: $con_kill
--connection $con_kill

# command will fail without high_priority
if ($throw_error) {
--error ER_LOCK_WAIT_TIMEOUT
--eval $cmd
}

if (!$throw_error) {
--eval $cmd
}

if ($use_sys_var) {
set high_priority_ddl = 1;
select @@high_priority_ddl;

# non-supported command will timeout
--error ER_LOCK_WAIT_TIMEOUT
lock tables t1 write;

if (!$should_kill) {
# regular user ddl will fail regardless of high_priority_ddl being on
--error ER_LOCK_WAIT_TIMEOUT
--eval $cmd
}

if ($should_kill) {
--eval $cmd
}

# reset high_priority_ddl
set high_priority_ddl = 0;
}

if (!$use_sys_var) {
if (!$should_kill) {
# regular user ddl will fail regardless of high_priority being on
--error ER_LOCK_WAIT_TIMEOUT
--eval $high_priority_cmd
}

if ($should_kill) {
--eval $high_priority_cmd
}
}

--echo connection: default (for show processlist)
connection default;
--replace_column 1 <Id> 3 <Host> 5 <Command> 6 <Time> 7 <State> 8 <Info> 9 <RExam> 10 <RSent> 11 <TID>
show processlist;

disconnect con1;
4 changes: 2 additions & 2 deletions storage/rocksdb/mysql-test/rocksdb/r/index.result
Expand Up @@ -51,7 +51,7 @@ a BLOB(1024),
KEY (a(768))
) ENGINE=rocksdb;
Warnings:
Warning 1071 Specified key was too long; max key length is 767 bytes
Note 1071 Specified key was too long; max key length is 767 bytes
DROP TABLE t1;
set global rocksdb_large_prefix=1;
CREATE TABLE t1 (
Expand All @@ -64,7 +64,7 @@ a BLOB(4096),
KEY (a(3073))
) ENGINE=rocksdb;
Warnings:
Warning 1071 Specified key was too long; max key length is 3072 bytes
Note 1071 Specified key was too long; max key length is 3072 bytes
DROP TABLE t1;
set global rocksdb_large_prefix=DEFAULT;
#
Expand Down

0 comments on commit 262d7e4

Please sign in to comment.