diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 12:24:36 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 12:24:36 +0000 |
commit | 06eaf7232e9a920468c0f8d74dcf2fe8b555501c (patch) | |
tree | e2c7b5777f728320e5b5542b6213fd3591ba51e2 /mysql-test/suite/perfschema/t/setup_actors.test | |
parent | Initial commit. (diff) | |
download | mariadb-06eaf7232e9a920468c0f8d74dcf2fe8b555501c.tar.xz mariadb-06eaf7232e9a920468c0f8d74dcf2fe8b555501c.zip |
Adding upstream version 1:10.11.6.upstream/1%10.11.6
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'mysql-test/suite/perfschema/t/setup_actors.test')
-rw-r--r-- | mysql-test/suite/perfschema/t/setup_actors.test | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/mysql-test/suite/perfschema/t/setup_actors.test b/mysql-test/suite/perfschema/t/setup_actors.test new file mode 100644 index 00000000..9e9e0a4e --- /dev/null +++ b/mysql-test/suite/perfschema/t/setup_actors.test @@ -0,0 +1,230 @@ +# Check the impact of different entries in performance_schema.setup_actors +# on when and how activity of users is recordeed in performance_schema.threads. +# The checks for indirect activity caused by users, system threads etc. +# are within setup_actors1.test. + +--source include/not_windows.inc +--source include/not_embedded.inc +--source include/have_perfschema.inc + +# The initial number of rows is 1. The initial row always looks like this: +# mysql> select * from performance_schema.setup_actors; +# +------+------+------+---------+---------+ +# | HOST | USER | ROLE | ENABLED | HISTORY | +# +------+------+------+---------+---------+ +# | % | % | % | YES | YES | +# +------+------+------+---------+---------+ +select * from performance_schema.setup_actors; + +truncate table performance_schema.setup_actors; + +insert into performance_schema.setup_actors +values ('hosta', 'user1', '%', 'YES', 'YES'); + +insert into performance_schema.setup_actors +values ('%', 'user2', '%', 'YES', 'YES'); + +insert into performance_schema.setup_actors +values ('localhost', 'user3', '%', 'YES', 'YES'); + +insert into performance_schema.setup_actors +values ('hostb', '%', '%', 'YES', 'YES'); + +select * from performance_schema.setup_actors +order by USER, HOST, ROLE; + +create user user1@localhost; +grant ALL on *.* to user1@localhost; +create user user2@localhost; +grant ALL on *.* to user2@localhost; +create user user3@localhost; +grant ALL on *.* to user3@localhost; +create user user4@localhost; +grant ALL on *.* to user4@localhost; +create user user5@localhost; +grant select on test.* to user5@localhost; + +flush privileges; + +connect (con1, localhost, user1, , ); + +# INSTRUMENTED must be NO because there is no match in performance_schema.setup_actors +select NAME, TYPE, INSTRUMENTED, PROCESSLIST_USER, PROCESSLIST_HOST +from performance_schema.threads +where PROCESSLIST_ID = connection_id(); +let $con1_thread_id= `select THREAD_ID from performance_schema.threads + where PROCESSLIST_ID = connection_id()`; + +--connection default +insert into performance_schema.setup_actors +values ('%', 'user1', '%', 'YES', 'YES'); + +--connection con1 +# INSTRUMENTED must be NO because there was no match in performance_schema.setup_actors +# when our current session made its connect. Later changes in setup_actors have no +# impact. +select NAME, TYPE, INSTRUMENTED, PROCESSLIST_USER, PROCESSLIST_HOST +from performance_schema.threads +where PROCESSLIST_ID = connection_id(); + +--disconnect con1 + +connect (con2, localhost, user2, , ); + +# INSTRUMENTED must be YES because there is a match via +# (HOST,USER,ROLE) = ('%', 'user2', '%') in performance_schema.setup_actors. +select NAME, TYPE, INSTRUMENTED, PROCESSLIST_USER, PROCESSLIST_HOST +from performance_schema.threads +where PROCESSLIST_ID=connection_id(); +let $con2_thread_id= `select THREAD_ID from performance_schema.threads + where PROCESSLIST_ID = connection_id()`; + +--disconnect con2 + +--connection default +# If a thread dies, we don't expect its THREAD_ID value will be re-used. +if ($con2_thread_id <= $con1_thread_id) +{ + --echo ERROR: THREAD_ID of con2 is not bigger than THREAD_ID of con1 + eval SELECT $con2_thread_id as THREAD_ID_con2, $con1_thread_id THREAD_ID_con1; +} + +--disable_warnings +drop table if exists test.t1; +--enable_warnings +create table test.t1 (col1 bigint); +lock table test.t1 write; + +connect (con3, localhost, user3, , ); + +# INSTRUMENTED must be YES because there is a match via +# (HOST,USER,ROLE) = ('localhost', 'user3', '%') in performance_schema.setup_actors. +select NAME, TYPE, INSTRUMENTED, PROCESSLIST_USER, PROCESSLIST_HOST +from performance_schema.threads +where PROCESSLIST_ID = connection_id(); + +# PROCESSLIST_ columns are: +# (if name like '%OneConnection') all the same as what you'd get if you +# run a select on INFORMATION_SCHEMA.PROCESSLIST for the corresponding thread. +# Check at least once that this is fulfilled. +# Note(mleich): +# A join between INFORMATION_SCHEMA.PROCESSLIST and performance_schema.threads +# Example: +# select count(*) = 1 +# from performance_schema.threads T inner join information_schema.PROCESSLIST P +# on T.PROCESSLIST_ID = P.ID and T.PROCESSLIST_USER = P.USER and +# T.PROCESSLIST_HOST = P.HOST and T.PROCESSLIST_DB = P.DB and +# T.PROCESSLIST_COMMAND = P.COMMAND and T.PROCESSLIST_INFO = P.INFO +# where T.PROCESSLIST_ID = connection_id() and T.NAME = 'thread/sql/one_connection' +# executed by the current connection looks like some of the most elegant solutions +# for revealing this. But such a join suffers from sporadic differences like +# column | observation +# -------|------------- +# state | "Sending data" vs. "executing" +# time | 0 vs. 1 (high load on the testing box) +# info | <full statement> vs. NULL (use of "--ps-protocol") +# IMHO the differences are harmless. +# Therefore we use here a different solution. +# +--echo # Send a statement to the server, but do not wait till the result +--echo # comes back. We will pull this later. +send +insert into test.t1 set col1 = 1; +connect (con4, localhost, user4, , ); +--echo # Poll till INFO is no more NULL and State = 'Waiting for table metadata lock'. +let $wait_condition= select count(*) from information_schema.processlist + where user = 'user3' and info is not null + and state = 'Waiting for table metadata lock'; +--source include/wait_condition.inc +# Expect to get 1 now +select count(*) = 1 +from performance_schema.threads T inner join information_schema.PROCESSLIST P + on T.PROCESSLIST_ID = P.ID and T.PROCESSLIST_USER = P.USER and + T.PROCESSLIST_HOST = P.HOST and T.PROCESSLIST_DB = P.DB and + T.PROCESSLIST_COMMAND = P.COMMAND and T.PROCESSLIST_INFO = P.INFO +where T.PROCESSLIST_USER = 'user3' and T.NAME = 'thread/sql/one_connection'; + +# Resolve the situation + some cleanup +--connection default +unlock tables; +--connection con3 +--echo # Reap the result of the no more blocked insert +--reap +--connection default +drop table test.t1; +--disconnect con3 + +--connection con4 +# INSTRUMENTED must be NO because there is no match in performance_schema.setup_actors +select NAME, TYPE, INSTRUMENTED, PROCESSLIST_USER, PROCESSLIST_HOST +from performance_schema.threads +where PROCESSLIST_ID = connection_id(); + +--disconnect con4 + +--connection default + +insert into performance_schema.setup_actors +values ('localhost', '%', '%', 'YES', 'YES'); + +select * from performance_schema.setup_actors +order by USER, HOST, ROLE; + +connect (con4b, localhost, user4, , ); + +# INSTRUMENTED must be YES because there is a match via +# (HOST,USER,ROLE) = ('localhost', '%', '%') in performance_schema.setup_actors. +select NAME, TYPE, INSTRUMENTED, PROCESSLIST_USER, PROCESSLIST_HOST +from performance_schema.threads +where PROCESSLIST_ID = connection_id(); + +--disconnect con4b + +--connection default +insert into performance_schema.setup_actors +values ('%', 'user5', '%', 'YES', 'YES'); + +create sql security definer view test.v1 as select NAME, TYPE, INSTRUMENTED, PROCESSLIST_USER, PROCESSLIST_HOST +from performance_schema.threads +where PROCESSLIST_ID = connection_id(); + +connect (con5, localhost, user5, , ); + +--error ER_TABLEACCESS_DENIED_ERROR +select * from performance_schema.threads; +# 1. INSTRUMENTED must be YES because there are two matches +# (HOST,USER,ROLE) = ('localhost', '%', '%') +# (HOST,USER,ROLE) = ('%', 'user5', '%') +# in performance_schema.setup_actors. +# But the instrument will only count once which means we must get only one row. +# 2. PROCESSLIST_USER refers to USER(), the user who connected, +# not the user we might be temporarily acting as (with definer's rights). +# Therefore PROCESSLIST_USER must be 'user5' though we run with right's of definer 'root' +select * from test.v1; + +--disconnect con5 +--source include/wait_until_disconnected.inc + + +--connection default + +drop view test.v1; +revoke all privileges, grant option from user1@localhost; +revoke all privileges, grant option from user2@localhost; +revoke all privileges, grant option from user3@localhost; +revoke all privileges, grant option from user4@localhost; +revoke all privileges, grant option from user5@localhost; +drop user user1@localhost; +drop user user2@localhost; +drop user user3@localhost; +drop user user4@localhost; +drop user user5@localhost; +flush privileges; + +truncate table performance_schema.setup_actors; + +insert into performance_schema.setup_actors +values ('%', '%', '%', 'YES', 'YES'); + +select * from performance_schema.setup_actors; + |