mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
Merge.
This commit is contained in:
commit
fb1a8f04ea
21 changed files with 2149 additions and 7 deletions
|
@ -377,7 +377,7 @@ sub main {
|
|||
# directly before it executes them, like "make test-force-pl" in RPM builds.
|
||||
mtr_report("Logging: $0 ", join(" ", @ARGV));
|
||||
|
||||
$DEFAULT_SUITES.=",sequence,sql_discovery" if $source_dist;
|
||||
$DEFAULT_SUITES.=",sequence,sql_discovery,query_response_time" if $source_dist;
|
||||
|
||||
command_line_setup();
|
||||
|
||||
|
|
8
mysql-test/r/servers.result
Normal file
8
mysql-test/r/servers.result
Normal file
|
@ -0,0 +1,8 @@
|
|||
#
|
||||
# MDEV-4594 - CREATE SERVER crashes embedded
|
||||
#
|
||||
CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(HOST 'localhost');
|
||||
SELECT * FROM mysql.servers;
|
||||
Server_name Host Db Username Password Port Socket Wrapper Owner
|
||||
s1 localhost 0 mysql
|
||||
DROP SERVER s1;
|
|
@ -19,7 +19,7 @@ concat("test1", x)
|
|||
test1-12
|
||||
show status like 'audit_null%';
|
||||
Variable_name Value
|
||||
Audit_null_called 21
|
||||
Audit_null_called 22
|
||||
Audit_null_general_error 1
|
||||
Audit_null_general_log 7
|
||||
Audit_null_general_result 5
|
||||
|
|
|
@ -27,7 +27,8 @@ perl;
|
|||
feedback debug temp-pool ssl des-key-file xtradb sequence
|
||||
thread-concurrency super-large-pages mutex-deadlock-detector
|
||||
null-audit aria pbxt oqgraph sphinx thread-handling
|
||||
test-sql-discovery rpl-semi-sync query-cache-info/;
|
||||
test-sql-discovery rpl-semi-sync query-cache-info
|
||||
query-response-time/;
|
||||
|
||||
# And substitute the content some environment variables with their
|
||||
# names:
|
||||
|
|
8
mysql-test/t/servers.test
Normal file
8
mysql-test/t/servers.test
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Generic tests for servers (do not require FEDERATED)
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-4594 - CREATE SERVER crashes embedded
|
||||
--echo #
|
||||
CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(HOST 'localhost');
|
||||
SELECT * FROM mysql.servers;
|
||||
DROP SERVER s1;
|
2
plugin/query_response_time/CMakeLists.txt
Normal file
2
plugin/query_response_time/CMakeLists.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
ADD_DEFINITIONS(-DHAVE_RESPONSE_TIME_DISTRIBUTION)
|
||||
MYSQL_ADD_PLUGIN(QUERY_RESPONSE_TIME query_response_time.cc query_response_time.h plugin.cc)
|
|
@ -0,0 +1,27 @@
|
|||
SHOW VARIABLES WHERE VARIABLE_NAME LIKE 'query_response_time%' AND VARIABLE_NAME!='query_response_time_exec_time_debug';
|
||||
Variable_name Value
|
||||
query_response_time_flush OFF
|
||||
query_response_time_range_base 10
|
||||
query_response_time_stats OFF
|
||||
SHOW CREATE TABLE INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
Table Create Table
|
||||
QUERY_RESPONSE_TIME CREATE TEMPORARY TABLE `QUERY_RESPONSE_TIME` (
|
||||
`TIME` varchar(14) NOT NULL DEFAULT '',
|
||||
`COUNT` int(11) unsigned NOT NULL DEFAULT '0',
|
||||
`TOTAL` varchar(14) NOT NULL DEFAULT ''
|
||||
) ENGINE=MEMORY DEFAULT CHARSET=utf8
|
||||
SELECT PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_TYPE, PLUGIN_AUTHOR, PLUGIN_DESCRIPTION, PLUGIN_LICENSE, PLUGIN_MATURITY FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'query_response_time%';;
|
||||
PLUGIN_NAME QUERY_RESPONSE_TIME
|
||||
PLUGIN_VERSION 1.0
|
||||
PLUGIN_TYPE INFORMATION SCHEMA
|
||||
PLUGIN_AUTHOR Percona and Sergey Vojtovich
|
||||
PLUGIN_DESCRIPTION Query Response Time Distribution INFORMATION_SCHEMA Plugin
|
||||
PLUGIN_LICENSE GPL
|
||||
PLUGIN_MATURITY Alpha
|
||||
PLUGIN_NAME QUERY_RESPONSE_TIME_AUDIT
|
||||
PLUGIN_VERSION 1.0
|
||||
PLUGIN_TYPE AUDIT
|
||||
PLUGIN_AUTHOR Percona and Sergey Vojtovich
|
||||
PLUGIN_DESCRIPTION Query Response Time Distribution Audit Plugin
|
||||
PLUGIN_LICENSE GPL
|
||||
PLUGIN_MATURITY Alpha
|
|
@ -0,0 +1,3 @@
|
|||
SHOW VARIABLES WHERE VARIABLE_NAME LIKE 'query_response_time%' AND VARIABLE_NAME!='query_response_time_exec_time_debug';
|
||||
SHOW CREATE TABLE INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
--query_vertical SELECT PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_TYPE, PLUGIN_AUTHOR, PLUGIN_DESCRIPTION, PLUGIN_LICENSE, PLUGIN_MATURITY FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'query_response_time%';
|
|
@ -0,0 +1,36 @@
|
|||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
EVAL SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=$base;
|
||||
SET GLOBAL query_response_time_flush=1;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=1;
|
||||
|
||||
CALL test_f(310000);
|
||||
CALL test_f(320000);
|
||||
CALL test_f(330000);
|
||||
CALL test_f(340000);
|
||||
CALL test_f(350000);
|
||||
CALL test_f(360000);
|
||||
CALL test_f(370000);
|
||||
CALL test_f(380000);
|
||||
CALL test_f(390000);
|
||||
CALL test_f(400000);
|
||||
CALL test_f(1100000);
|
||||
CALL test_f(1200000);
|
||||
CALL test_f(1300000);
|
||||
CALL test_f(1500000);
|
||||
CALL test_f(1400000);
|
||||
CALL test_f(500000);
|
||||
CALL test_f(2100000);
|
||||
CALL test_f(2300000);
|
||||
CALL test_f(2500000);
|
||||
CALL test_f(3100000);
|
||||
CALL test_f(4100000);
|
||||
CALL test_f(5100000);
|
||||
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
|
||||
SET SESSION query_response_time_exec_time_debug=default;
|
|
@ -0,0 +1,392 @@
|
|||
CREATE TABLE t(a INT);
|
||||
CREATE PROCEDURE test_f(t INT)
|
||||
BEGIN
|
||||
SET SESSION query_response_time_exec_time_debug=t;
|
||||
INSERT INTO t VALUES(1);
|
||||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
DELETE FROM t;
|
||||
END^
|
||||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=1;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect query_response_time_range_base value: '1'
|
||||
SET GLOBAL query_response_time_flush=1;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=1;
|
||||
CALL test_f(310000);
|
||||
CALL test_f(320000);
|
||||
CALL test_f(330000);
|
||||
CALL test_f(340000);
|
||||
CALL test_f(350000);
|
||||
CALL test_f(360000);
|
||||
CALL test_f(370000);
|
||||
CALL test_f(380000);
|
||||
CALL test_f(390000);
|
||||
CALL test_f(400000);
|
||||
CALL test_f(1100000);
|
||||
CALL test_f(1200000);
|
||||
CALL test_f(1300000);
|
||||
CALL test_f(1500000);
|
||||
CALL test_f(1400000);
|
||||
CALL test_f(500000);
|
||||
CALL test_f(2100000);
|
||||
CALL test_f(2300000);
|
||||
CALL test_f(2500000);
|
||||
CALL test_f(3100000);
|
||||
CALL test_f(4100000);
|
||||
CALL test_f(5100000);
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 2
|
||||
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
TIME COUNT TOTAL
|
||||
0.000001 45 0.000000
|
||||
0.000003 0 0.000000
|
||||
0.000007 0 0.000000
|
||||
0.000015 0 0.000000
|
||||
0.000030 0 0.000000
|
||||
0.000061 0 0.000000
|
||||
0.000122 0 0.000000
|
||||
0.000244 0 0.000000
|
||||
0.000488 0 0.000000
|
||||
0.000976 0 0.000000
|
||||
0.001953 0 0.000000
|
||||
0.003906 0 0.000000
|
||||
0.007812 0 0.000000
|
||||
0.015625 0 0.000000
|
||||
0.031250 0 0.000000
|
||||
0.062500 0 0.000000
|
||||
0.125000 44 4.400000
|
||||
0.250000 0 0.000000
|
||||
0.500000 10 3.550000
|
||||
1.000000 1 0.500000
|
||||
2.000000 5 6.500000
|
||||
4.000000 4 10.000000
|
||||
8.000000 2 9.200000
|
||||
16.000000 0 0.000000
|
||||
32.000000 0 0.000000
|
||||
64.000000 0 0.000000
|
||||
128.000000 0 0.000000
|
||||
256.000000 0 0.000000
|
||||
512.000000 0 0.000000
|
||||
1024.000000 0 0.000000
|
||||
2048.000000 0 0.000000
|
||||
4096.000000 0 0.000000
|
||||
8192.000000 0 0.000000
|
||||
16384.000000 0 0.000000
|
||||
32768.000000 0 0.000000
|
||||
65536.000000 0 0.000000
|
||||
131072.000000 0 0.000000
|
||||
262144.000000 0 0.000000
|
||||
524288.000000 0 0.000000
|
||||
1048576.000000 0 0.000000
|
||||
2097152.000000 0 0.000000
|
||||
4194304.000000 0 0.000000
|
||||
8388608.000000 0 0.000000
|
||||
TOO LONG 0 TOO LONG
|
||||
SET SESSION query_response_time_exec_time_debug=default;
|
||||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=2;
|
||||
SET GLOBAL query_response_time_flush=1;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=1;
|
||||
CALL test_f(310000);
|
||||
CALL test_f(320000);
|
||||
CALL test_f(330000);
|
||||
CALL test_f(340000);
|
||||
CALL test_f(350000);
|
||||
CALL test_f(360000);
|
||||
CALL test_f(370000);
|
||||
CALL test_f(380000);
|
||||
CALL test_f(390000);
|
||||
CALL test_f(400000);
|
||||
CALL test_f(1100000);
|
||||
CALL test_f(1200000);
|
||||
CALL test_f(1300000);
|
||||
CALL test_f(1500000);
|
||||
CALL test_f(1400000);
|
||||
CALL test_f(500000);
|
||||
CALL test_f(2100000);
|
||||
CALL test_f(2300000);
|
||||
CALL test_f(2500000);
|
||||
CALL test_f(3100000);
|
||||
CALL test_f(4100000);
|
||||
CALL test_f(5100000);
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 2
|
||||
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
TIME COUNT TOTAL
|
||||
0.000001 45 0.000000
|
||||
0.000003 0 0.000000
|
||||
0.000007 0 0.000000
|
||||
0.000015 0 0.000000
|
||||
0.000030 0 0.000000
|
||||
0.000061 0 0.000000
|
||||
0.000122 0 0.000000
|
||||
0.000244 0 0.000000
|
||||
0.000488 0 0.000000
|
||||
0.000976 0 0.000000
|
||||
0.001953 0 0.000000
|
||||
0.003906 0 0.000000
|
||||
0.007812 0 0.000000
|
||||
0.015625 0 0.000000
|
||||
0.031250 0 0.000000
|
||||
0.062500 0 0.000000
|
||||
0.125000 44 4.400000
|
||||
0.250000 0 0.000000
|
||||
0.500000 10 3.550000
|
||||
1.000000 1 0.500000
|
||||
2.000000 5 6.500000
|
||||
4.000000 4 10.000000
|
||||
8.000000 2 9.200000
|
||||
16.000000 0 0.000000
|
||||
32.000000 0 0.000000
|
||||
64.000000 0 0.000000
|
||||
128.000000 0 0.000000
|
||||
256.000000 0 0.000000
|
||||
512.000000 0 0.000000
|
||||
1024.000000 0 0.000000
|
||||
2048.000000 0 0.000000
|
||||
4096.000000 0 0.000000
|
||||
8192.000000 0 0.000000
|
||||
16384.000000 0 0.000000
|
||||
32768.000000 0 0.000000
|
||||
65536.000000 0 0.000000
|
||||
131072.000000 0 0.000000
|
||||
262144.000000 0 0.000000
|
||||
524288.000000 0 0.000000
|
||||
1048576.000000 0 0.000000
|
||||
2097152.000000 0 0.000000
|
||||
4194304.000000 0 0.000000
|
||||
8388608.000000 0 0.000000
|
||||
TOO LONG 0 TOO LONG
|
||||
SET SESSION query_response_time_exec_time_debug=default;
|
||||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=10;
|
||||
SET GLOBAL query_response_time_flush=1;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=1;
|
||||
CALL test_f(310000);
|
||||
CALL test_f(320000);
|
||||
CALL test_f(330000);
|
||||
CALL test_f(340000);
|
||||
CALL test_f(350000);
|
||||
CALL test_f(360000);
|
||||
CALL test_f(370000);
|
||||
CALL test_f(380000);
|
||||
CALL test_f(390000);
|
||||
CALL test_f(400000);
|
||||
CALL test_f(1100000);
|
||||
CALL test_f(1200000);
|
||||
CALL test_f(1300000);
|
||||
CALL test_f(1500000);
|
||||
CALL test_f(1400000);
|
||||
CALL test_f(500000);
|
||||
CALL test_f(2100000);
|
||||
CALL test_f(2300000);
|
||||
CALL test_f(2500000);
|
||||
CALL test_f(3100000);
|
||||
CALL test_f(4100000);
|
||||
CALL test_f(5100000);
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 10
|
||||
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
TIME COUNT TOTAL
|
||||
0.000001 45 0.000000
|
||||
0.000010 0 0.000000
|
||||
0.000100 0 0.000000
|
||||
0.001000 0 0.000000
|
||||
0.010000 0 0.000000
|
||||
0.100000 0 0.000000
|
||||
1.000000 55 8.450000
|
||||
10.000000 11 25.700000
|
||||
100.000000 0 0.000000
|
||||
1000.000000 0 0.000000
|
||||
10000.000000 0 0.000000
|
||||
100000.000000 0 0.000000
|
||||
1000000.000000 0 0.000000
|
||||
TOO LONG 0 TOO LONG
|
||||
SET SESSION query_response_time_exec_time_debug=default;
|
||||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=7;
|
||||
SET GLOBAL query_response_time_flush=1;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=1;
|
||||
CALL test_f(310000);
|
||||
CALL test_f(320000);
|
||||
CALL test_f(330000);
|
||||
CALL test_f(340000);
|
||||
CALL test_f(350000);
|
||||
CALL test_f(360000);
|
||||
CALL test_f(370000);
|
||||
CALL test_f(380000);
|
||||
CALL test_f(390000);
|
||||
CALL test_f(400000);
|
||||
CALL test_f(1100000);
|
||||
CALL test_f(1200000);
|
||||
CALL test_f(1300000);
|
||||
CALL test_f(1500000);
|
||||
CALL test_f(1400000);
|
||||
CALL test_f(500000);
|
||||
CALL test_f(2100000);
|
||||
CALL test_f(2300000);
|
||||
CALL test_f(2500000);
|
||||
CALL test_f(3100000);
|
||||
CALL test_f(4100000);
|
||||
CALL test_f(5100000);
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 7
|
||||
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
TIME COUNT TOTAL
|
||||
0.000001 45 0.000000
|
||||
0.000008 0 0.000000
|
||||
0.000059 0 0.000000
|
||||
0.000416 0 0.000000
|
||||
0.002915 0 0.000000
|
||||
0.020408 0 0.000000
|
||||
0.142857 44 4.400000
|
||||
1.000000 11 4.050000
|
||||
7.000000 11 25.700000
|
||||
49.000000 0 0.000000
|
||||
343.000000 0 0.000000
|
||||
2401.000000 0 0.000000
|
||||
16807.000000 0 0.000000
|
||||
117649.000000 0 0.000000
|
||||
823543.000000 0 0.000000
|
||||
5764801.000000 0 0.000000
|
||||
TOO LONG 0 TOO LONG
|
||||
SET SESSION query_response_time_exec_time_debug=default;
|
||||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=156;
|
||||
SET GLOBAL query_response_time_flush=1;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=1;
|
||||
CALL test_f(310000);
|
||||
CALL test_f(320000);
|
||||
CALL test_f(330000);
|
||||
CALL test_f(340000);
|
||||
CALL test_f(350000);
|
||||
CALL test_f(360000);
|
||||
CALL test_f(370000);
|
||||
CALL test_f(380000);
|
||||
CALL test_f(390000);
|
||||
CALL test_f(400000);
|
||||
CALL test_f(1100000);
|
||||
CALL test_f(1200000);
|
||||
CALL test_f(1300000);
|
||||
CALL test_f(1500000);
|
||||
CALL test_f(1400000);
|
||||
CALL test_f(500000);
|
||||
CALL test_f(2100000);
|
||||
CALL test_f(2300000);
|
||||
CALL test_f(2500000);
|
||||
CALL test_f(3100000);
|
||||
CALL test_f(4100000);
|
||||
CALL test_f(5100000);
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 156
|
||||
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
TIME COUNT TOTAL
|
||||
0.000041 45 0.000000
|
||||
0.006410 0 0.000000
|
||||
1.000000 55 8.450000
|
||||
156.000000 11 25.700000
|
||||
24336.000000 0 0.000000
|
||||
3796416.000000 0 0.000000
|
||||
TOO LONG 0 TOO LONG
|
||||
SET SESSION query_response_time_exec_time_debug=default;
|
||||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=1000;
|
||||
SET GLOBAL query_response_time_flush=1;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=1;
|
||||
CALL test_f(310000);
|
||||
CALL test_f(320000);
|
||||
CALL test_f(330000);
|
||||
CALL test_f(340000);
|
||||
CALL test_f(350000);
|
||||
CALL test_f(360000);
|
||||
CALL test_f(370000);
|
||||
CALL test_f(380000);
|
||||
CALL test_f(390000);
|
||||
CALL test_f(400000);
|
||||
CALL test_f(1100000);
|
||||
CALL test_f(1200000);
|
||||
CALL test_f(1300000);
|
||||
CALL test_f(1500000);
|
||||
CALL test_f(1400000);
|
||||
CALL test_f(500000);
|
||||
CALL test_f(2100000);
|
||||
CALL test_f(2300000);
|
||||
CALL test_f(2500000);
|
||||
CALL test_f(3100000);
|
||||
CALL test_f(4100000);
|
||||
CALL test_f(5100000);
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 1000
|
||||
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
TIME COUNT TOTAL
|
||||
0.000001 45 0.000000
|
||||
0.001000 0 0.000000
|
||||
1.000000 55 8.450000
|
||||
1000.000000 11 25.700000
|
||||
1000000.000000 0 0.000000
|
||||
TOO LONG 0 TOO LONG
|
||||
SET SESSION query_response_time_exec_time_debug=default;
|
||||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=1001;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect query_response_time_range_base value: '1001'
|
||||
SET GLOBAL query_response_time_flush=1;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=1;
|
||||
CALL test_f(310000);
|
||||
CALL test_f(320000);
|
||||
CALL test_f(330000);
|
||||
CALL test_f(340000);
|
||||
CALL test_f(350000);
|
||||
CALL test_f(360000);
|
||||
CALL test_f(370000);
|
||||
CALL test_f(380000);
|
||||
CALL test_f(390000);
|
||||
CALL test_f(400000);
|
||||
CALL test_f(1100000);
|
||||
CALL test_f(1200000);
|
||||
CALL test_f(1300000);
|
||||
CALL test_f(1500000);
|
||||
CALL test_f(1400000);
|
||||
CALL test_f(500000);
|
||||
CALL test_f(2100000);
|
||||
CALL test_f(2300000);
|
||||
CALL test_f(2500000);
|
||||
CALL test_f(3100000);
|
||||
CALL test_f(4100000);
|
||||
CALL test_f(5100000);
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
Variable_name Value
|
||||
query_response_time_range_base 1000
|
||||
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
TIME COUNT TOTAL
|
||||
0.000001 45 0.000000
|
||||
0.001000 0 0.000000
|
||||
1.000000 55 8.450000
|
||||
1000.000000 11 25.700000
|
||||
1000000.000000 0 0.000000
|
||||
TOO LONG 0 TOO LONG
|
||||
SET SESSION query_response_time_exec_time_debug=default;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=default;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=default;
|
||||
DROP PROCEDURE test_f;
|
||||
DROP TABLE t;
|
|
@ -0,0 +1,44 @@
|
|||
--source include/have_debug.inc
|
||||
|
||||
# The file with expected results fits only to a run without
|
||||
# ps-protocol/sp-protocol/cursor-protocol/view-protocol.
|
||||
if (`SELECT $PS_PROTOCOL + $SP_PROTOCOL + $CURSOR_PROTOCOL
|
||||
+ $VIEW_PROTOCOL > 0`)
|
||||
{
|
||||
--skip Test requires: ps-protocol/sp-protocol/cursor-protocol/view-protocol disabled
|
||||
}
|
||||
|
||||
|
||||
CREATE TABLE t(a INT);
|
||||
|
||||
delimiter ^;
|
||||
CREATE PROCEDURE test_f(t INT)
|
||||
BEGIN
|
||||
SET SESSION query_response_time_exec_time_debug=t;
|
||||
INSERT INTO t VALUES(1);
|
||||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
DELETE FROM t;
|
||||
END^
|
||||
delimiter ;^
|
||||
|
||||
--let base=1
|
||||
--source query_response_time-stored.inc
|
||||
--let base=2
|
||||
--source query_response_time-stored.inc
|
||||
--let base=10
|
||||
--source query_response_time-stored.inc
|
||||
--let base=7
|
||||
--source query_response_time-stored.inc
|
||||
--let base=156
|
||||
--source query_response_time-stored.inc
|
||||
--let base=1000
|
||||
--source query_response_time-stored.inc
|
||||
--let base=1001
|
||||
--source query_response_time-stored.inc
|
||||
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=default;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=default;
|
||||
|
||||
DROP PROCEDURE test_f;
|
||||
|
||||
DROP TABLE t;
|
|
@ -0,0 +1,41 @@
|
|||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
EVAL SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=$base;
|
||||
SET GLOBAL query_response_time_flush=1;
|
||||
# Following two queries check works of FLUSH and
|
||||
# respecting of "QUERY_RESPONSE_TIME_STATS" variable (see launchpad bug #855312)
|
||||
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=1;
|
||||
|
||||
SET SESSION query_response_time_exec_time_debug=310000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=320000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=330000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=340000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=350000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=360000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=370000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=380000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=390000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=400000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=1100000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=1200000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=1300000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=1500000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=1400000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=500000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=2100000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=2300000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=2500000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=3100000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=4100000; SELECT 1;
|
||||
SET SESSION query_response_time_exec_time_debug=5100000; SELECT 1;
|
||||
|
||||
SET SESSION query_response_time_exec_time_debug=100000;
|
||||
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=0;
|
||||
|
||||
SHOW GLOBAL VARIABLES where Variable_name like 'QUERY_RESPONSE_TIME_RANGE_BASE';
|
||||
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
|
||||
|
||||
SET SESSION query_response_time_exec_time_debug=default;
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,28 @@
|
|||
--source include/have_debug.inc
|
||||
|
||||
# The file with expected results fits only to a run without
|
||||
# ps-protocol/sp-protocol/cursor-protocol/view-protocol.
|
||||
if (`SELECT $PS_PROTOCOL + $SP_PROTOCOL + $CURSOR_PROTOCOL
|
||||
+ $VIEW_PROTOCOL > 0`)
|
||||
{
|
||||
--skip Test requires: ps-protocol/sp-protocol/cursor-protocol/view-protocol disabled
|
||||
}
|
||||
|
||||
|
||||
--let base=1
|
||||
--source query_response_time.inc
|
||||
--let base=2
|
||||
--source query_response_time.inc
|
||||
--let base=10
|
||||
--source query_response_time.inc
|
||||
--let base=7
|
||||
--source query_response_time.inc
|
||||
--let base=156
|
||||
--source query_response_time.inc
|
||||
--let base=1000
|
||||
--source query_response_time.inc
|
||||
--let base=1001
|
||||
--source query_response_time.inc
|
||||
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_RANGE_BASE=default;
|
||||
SET GLOBAL QUERY_RESPONSE_TIME_STATS=default;
|
|
@ -0,0 +1 @@
|
|||
--plugin-load=$QUERY_RESPONSE_TIME_SO --plugin-query-response-time=ON --plugin-query-response-time-audit=ON
|
|
@ -0,0 +1,12 @@
|
|||
package My::Suite::Query_response_time;
|
||||
|
||||
@ISA = qw(My::Suite);
|
||||
|
||||
return "No QUERY_RESPONSE_TIME plugin" unless
|
||||
$ENV{QUERY_RESPONSE_TIME_SO} or
|
||||
$::mysqld_variables{'query-response-time'} eq "ON";
|
||||
|
||||
return "Not run for embedded server" if $::opt_embedded_server;
|
||||
|
||||
bless { };
|
||||
|
163
plugin/query_response_time/plugin.cc
Normal file
163
plugin/query_response_time/plugin.cc
Normal file
|
@ -0,0 +1,163 @@
|
|||
/* Copyright (C) 2013 Percona and Sergey Vojtovich
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#define MYSQL_SERVER
|
||||
#include <sql_class.h>
|
||||
#include <table.h>
|
||||
#include <sql_show.h>
|
||||
#include <mysql/plugin_audit.h>
|
||||
#include "query_response_time.h"
|
||||
|
||||
|
||||
ulong opt_query_response_time_range_base= QRT_DEFAULT_BASE;
|
||||
my_bool opt_query_response_time_stats= 0;
|
||||
static my_bool opt_query_response_time_flush= 0;
|
||||
|
||||
|
||||
static void query_response_time_flush_update(
|
||||
MYSQL_THD thd __attribute__((unused)),
|
||||
struct st_mysql_sys_var *var __attribute__((unused)),
|
||||
void *tgt __attribute__((unused)),
|
||||
const void *save __attribute__((unused)))
|
||||
{
|
||||
query_response_time_flush();
|
||||
}
|
||||
|
||||
|
||||
static MYSQL_SYSVAR_ULONG(range_base, opt_query_response_time_range_base,
|
||||
PLUGIN_VAR_RQCMDARG,
|
||||
"Select base of log for query_response_time ranges. WARNING: variable "
|
||||
"change affect only after flush",
|
||||
NULL, NULL, QRT_DEFAULT_BASE, 2, QRT_MAXIMUM_BASE, 1);
|
||||
static MYSQL_SYSVAR_BOOL(stats, opt_query_response_time_stats,
|
||||
PLUGIN_VAR_OPCMDARG,
|
||||
"Enable or disable query response time statisics collecting",
|
||||
NULL, NULL, FALSE);
|
||||
static MYSQL_SYSVAR_BOOL(flush, opt_query_response_time_flush,
|
||||
PLUGIN_VAR_NOCMDOPT,
|
||||
"Update of this variable flushes statistics and re-reads "
|
||||
"query_response_time_range_base",
|
||||
NULL, query_response_time_flush_update, FALSE);
|
||||
#ifndef DBUG_OFF
|
||||
static MYSQL_THDVAR_ULONGLONG(exec_time_debug, PLUGIN_VAR_NOCMDOPT,
|
||||
"Pretend queries take this many microseconds. When 0 (the default) use "
|
||||
"the actual execution time. Used only for debugging.",
|
||||
NULL, NULL, 0, 0, LONG_TIMEOUT, 1);
|
||||
#endif
|
||||
|
||||
|
||||
static struct st_mysql_sys_var *query_response_time_info_vars[]=
|
||||
{
|
||||
MYSQL_SYSVAR(range_base),
|
||||
MYSQL_SYSVAR(stats),
|
||||
MYSQL_SYSVAR(flush),
|
||||
#ifndef DBUG_OFF
|
||||
MYSQL_SYSVAR(exec_time_debug),
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
ST_FIELD_INFO query_response_time_fields_info[] =
|
||||
{
|
||||
{ "TIME", QRT_TIME_STRING_LENGTH, MYSQL_TYPE_STRING, 0, 0, "", SKIP_OPEN_TABLE },
|
||||
{ "COUNT", MY_INT32_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, MY_I_S_UNSIGNED, "", SKIP_OPEN_TABLE },
|
||||
{ "TOTAL", QRT_TIME_STRING_LENGTH, MYSQL_TYPE_STRING, 0, 0, "", SKIP_OPEN_TABLE },
|
||||
{ 0, 0, MYSQL_TYPE_NULL, 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
|
||||
static int query_response_time_info_init(void *p)
|
||||
{
|
||||
ST_SCHEMA_TABLE *i_s_query_response_time= (ST_SCHEMA_TABLE *) p;
|
||||
i_s_query_response_time->fields_info= query_response_time_fields_info;
|
||||
i_s_query_response_time->fill_table= query_response_time_fill;
|
||||
query_response_time_init();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int query_response_time_info_deinit(void *arg __attribute__((unused)))
|
||||
{
|
||||
opt_query_response_time_stats= 0;
|
||||
query_response_time_free();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static struct st_mysql_information_schema query_response_time_info_descriptor=
|
||||
{ MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION };
|
||||
|
||||
|
||||
static void query_response_time_audit_notify(MYSQL_THD thd,
|
||||
unsigned int event_class,
|
||||
const void *event)
|
||||
{
|
||||
const struct mysql_event_general *event_general=
|
||||
(const struct mysql_event_general *) event;
|
||||
DBUG_ASSERT(event_class == MYSQL_AUDIT_GENERAL_CLASS);
|
||||
if (event_general->event_subclass == MYSQL_AUDIT_GENERAL_STATUS &&
|
||||
opt_query_response_time_stats)
|
||||
{
|
||||
#ifndef DBUG_OFF
|
||||
if (THDVAR(thd, exec_time_debug))
|
||||
query_response_time_collect(thd->lex->sql_command != SQLCOM_SET_OPTION ?
|
||||
THDVAR(thd, exec_time_debug) : 0);
|
||||
else
|
||||
#endif
|
||||
query_response_time_collect(thd->utime_after_query - thd->utime_after_lock);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static struct st_mysql_audit query_response_time_audit_descriptor=
|
||||
{
|
||||
MYSQL_AUDIT_INTERFACE_VERSION, NULL, query_response_time_audit_notify,
|
||||
{ (unsigned long) MYSQL_AUDIT_GENERAL_CLASSMASK }
|
||||
};
|
||||
|
||||
|
||||
maria_declare_plugin(query_response_time)
|
||||
{
|
||||
MYSQL_INFORMATION_SCHEMA_PLUGIN,
|
||||
&query_response_time_info_descriptor,
|
||||
"QUERY_RESPONSE_TIME",
|
||||
"Percona and Sergey Vojtovich",
|
||||
"Query Response Time Distribution INFORMATION_SCHEMA Plugin",
|
||||
PLUGIN_LICENSE_GPL,
|
||||
query_response_time_info_init,
|
||||
query_response_time_info_deinit,
|
||||
0x0100,
|
||||
NULL,
|
||||
query_response_time_info_vars,
|
||||
"1.0",
|
||||
MariaDB_PLUGIN_MATURITY_ALPHA
|
||||
},
|
||||
{
|
||||
MYSQL_AUDIT_PLUGIN,
|
||||
&query_response_time_audit_descriptor,
|
||||
"QUERY_RESPONSE_TIME_AUDIT",
|
||||
"Percona and Sergey Vojtovich",
|
||||
"Query Response Time Distribution Audit Plugin",
|
||||
PLUGIN_LICENSE_GPL,
|
||||
NULL,
|
||||
NULL,
|
||||
0x0100,
|
||||
NULL,
|
||||
NULL,
|
||||
"1.0",
|
||||
MariaDB_PLUGIN_MATURITY_ALPHA
|
||||
}
|
||||
maria_declare_plugin_end;
|
302
plugin/query_response_time/query_response_time.cc
Normal file
302
plugin/query_response_time/query_response_time.cc
Normal file
|
@ -0,0 +1,302 @@
|
|||
#include "mysql_version.h"
|
||||
#include "my_global.h"
|
||||
#ifdef HAVE_RESPONSE_TIME_DISTRIBUTION
|
||||
#include "mysql_com.h"
|
||||
#include "rpl_tblmap.h"
|
||||
#include "table.h"
|
||||
#include "field.h"
|
||||
#include "sql_show.h"
|
||||
#include "query_response_time.h"
|
||||
|
||||
#define TIME_STRING_POSITIVE_POWER_LENGTH QRT_TIME_STRING_POSITIVE_POWER_LENGTH
|
||||
#define TIME_STRING_NEGATIVE_POWER_LENGTH 6
|
||||
#define TOTAL_STRING_POSITIVE_POWER_LENGTH QRT_TOTAL_STRING_POSITIVE_POWER_LENGTH
|
||||
#define TOTAL_STRING_NEGATIVE_POWER_LENGTH 6
|
||||
#define MINIMUM_BASE 2
|
||||
#define MAXIMUM_BASE QRT_MAXIMUM_BASE
|
||||
#define POSITIVE_POWER_FILLER QRT_POSITIVE_POWER_FILLER
|
||||
#define NEGATIVE_POWER_FILLER QRT_NEGATIVE_POWER_FILLER
|
||||
#define TIME_OVERFLOW QRT_TIME_OVERFLOW
|
||||
#define DEFAULT_BASE QRT_DEFAULT_BASE
|
||||
|
||||
#define do_xstr(s) do_str(s)
|
||||
#define do_str(s) #s
|
||||
#define do_format(filler,width) "%" filler width "lld"
|
||||
/*
|
||||
Format strings for snprintf. Generate from:
|
||||
POSITIVE_POWER_FILLER and TIME_STRING_POSITIVE_POWER_LENGTH
|
||||
NEFATIVE_POWER_FILLER and TIME_STRING_NEGATIVE_POWER_LENGTH
|
||||
*/
|
||||
#define TIME_STRING_POSITIVE_POWER_FORMAT do_format(POSITIVE_POWER_FILLER,do_xstr(TIME_STRING_POSITIVE_POWER_LENGTH))
|
||||
#define TIME_STRING_NEGATIVE_POWER_FORMAT do_format(NEGATIVE_POWER_FILLER,do_xstr(TIME_STRING_NEGATIVE_POWER_LENGTH))
|
||||
#define TIME_STRING_FORMAT TIME_STRING_POSITIVE_POWER_FORMAT "." TIME_STRING_NEGATIVE_POWER_FORMAT
|
||||
|
||||
#define TOTAL_STRING_POSITIVE_POWER_FORMAT do_format(POSITIVE_POWER_FILLER,do_xstr(TOTAL_STRING_POSITIVE_POWER_LENGTH))
|
||||
#define TOTAL_STRING_NEGATIVE_POWER_FORMAT do_format(NEGATIVE_POWER_FILLER,do_xstr(TOTAL_STRING_NEGATIVE_POWER_LENGTH))
|
||||
#define TOTAL_STRING_FORMAT TOTAL_STRING_POSITIVE_POWER_FORMAT "." TOTAL_STRING_NEGATIVE_POWER_FORMAT
|
||||
|
||||
#define TIME_STRING_LENGTH QRT_TIME_STRING_LENGTH
|
||||
#define TIME_STRING_BUFFER_LENGTH (TIME_STRING_LENGTH + 1 /* '\0' */)
|
||||
|
||||
#define TOTAL_STRING_LENGTH QRT_TOTAL_STRING_LENGTH
|
||||
#define TOTAL_STRING_BUFFER_LENGTH (TOTAL_STRING_LENGTH + 1 /* '\0' */)
|
||||
|
||||
/*
|
||||
Calculate length of "log linear"
|
||||
1)
|
||||
(MINIMUM_BASE ^ result) <= (10 ^ STRING_POWER_LENGTH) < (MINIMUM_BASE ^ (result + 1))
|
||||
|
||||
2)
|
||||
(MINIMUM_BASE ^ result) <= (10 ^ STRING_POWER_LENGTH)
|
||||
and
|
||||
(MINIMUM_BASE ^ (result + 1)) > (10 ^ STRING_POWER_LENGTH)
|
||||
|
||||
3)
|
||||
result <= LOG(MINIMUM_BASE, 10 ^ STRING_POWER_LENGTH)= STRING_POWER_LENGTH * LOG(MINIMUM_BASE,10)
|
||||
result + 1 > LOG(MINIMUM_BASE, 10 ^ STRING_POWER_LENGTH)= STRING_POWER_LENGTH * LOG(MINIMUM_BASE,10)
|
||||
|
||||
4) STRING_POWER_LENGTH * LOG(MINIMUM_BASE,10) - 1 < result <= STRING_POWER_LENGTH * LOG(MINIMUM_BASE,10)
|
||||
|
||||
MINIMUM_BASE= 2 always, LOG(MINIMUM_BASE,10)= 3.3219280948873626, result= (int)3.3219280948873626 * STRING_POWER_LENGTH
|
||||
|
||||
Last counter always use for time overflow
|
||||
*/
|
||||
#define POSITIVE_POWER_COUNT ((int)(3.32192809 * TIME_STRING_POSITIVE_POWER_LENGTH))
|
||||
#define NEGATIVE_POWER_COUNT ((int)(3.32192809 * TIME_STRING_NEGATIVE_POWER_LENGTH))
|
||||
#define OVERALL_POWER_COUNT (NEGATIVE_POWER_COUNT + 1 + POSITIVE_POWER_COUNT)
|
||||
|
||||
#define MILLION ((unsigned long)1000 * 1000)
|
||||
|
||||
namespace query_response_time
|
||||
{
|
||||
|
||||
class utility
|
||||
{
|
||||
public:
|
||||
utility() : m_base(0)
|
||||
{
|
||||
m_max_dec_value= MILLION;
|
||||
for(int i= 0; TIME_STRING_POSITIVE_POWER_LENGTH > i; ++i)
|
||||
m_max_dec_value *= 10;
|
||||
setup(DEFAULT_BASE);
|
||||
}
|
||||
public:
|
||||
uint base() const { return m_base; }
|
||||
uint negative_count() const { return m_negative_count; }
|
||||
uint positive_count() const { return m_positive_count; }
|
||||
uint bound_count() const { return m_bound_count; }
|
||||
ulonglong max_dec_value() const { return m_max_dec_value; }
|
||||
ulonglong bound(uint index) const { return m_bound[ index ]; }
|
||||
public:
|
||||
void setup(uint base)
|
||||
{
|
||||
if(base != m_base)
|
||||
{
|
||||
m_base= base;
|
||||
|
||||
const ulonglong million= 1000 * 1000;
|
||||
ulonglong value= million;
|
||||
m_negative_count= 0;
|
||||
while(value > 0)
|
||||
{
|
||||
m_negative_count += 1;
|
||||
value /= m_base;
|
||||
}
|
||||
m_negative_count -= 1;
|
||||
|
||||
value= million;
|
||||
m_positive_count= 0;
|
||||
while(value < m_max_dec_value)
|
||||
{
|
||||
m_positive_count += 1;
|
||||
value *= m_base;
|
||||
}
|
||||
m_bound_count= m_negative_count + m_positive_count;
|
||||
|
||||
value= million;
|
||||
for(uint i= 0; i < m_negative_count; ++i)
|
||||
{
|
||||
value /= m_base;
|
||||
m_bound[m_negative_count - i - 1]= value;
|
||||
}
|
||||
value= million;
|
||||
for(uint i= 0; i < m_positive_count; ++i)
|
||||
{
|
||||
m_bound[m_negative_count + i]= value;
|
||||
value *= m_base;
|
||||
}
|
||||
}
|
||||
}
|
||||
private:
|
||||
uint m_base;
|
||||
uint m_negative_count;
|
||||
uint m_positive_count;
|
||||
uint m_bound_count;
|
||||
ulonglong m_max_dec_value; /* for TIME_STRING_POSITIVE_POWER_LENGTH=7 is 10000000 */
|
||||
ulonglong m_bound[OVERALL_POWER_COUNT];
|
||||
};
|
||||
|
||||
static
|
||||
void print_time(char* buffer, std::size_t buffer_size, const char* format,
|
||||
uint64 value)
|
||||
{
|
||||
ulonglong second= (value / MILLION);
|
||||
ulonglong microsecond= (value % MILLION);
|
||||
my_snprintf(buffer, buffer_size, format, second, microsecond);
|
||||
}
|
||||
|
||||
class time_collector
|
||||
{
|
||||
public:
|
||||
time_collector(utility& u) : m_utility(&u)
|
||||
{
|
||||
my_atomic_rwlock_init(&time_collector_lock);
|
||||
}
|
||||
~time_collector()
|
||||
{
|
||||
my_atomic_rwlock_destroy(&time_collector_lock);
|
||||
}
|
||||
uint32 count(uint index) const
|
||||
{
|
||||
my_atomic_rwlock_rdlock(&time_collector_lock);
|
||||
uint32 result= my_atomic_load32((int32*)&m_count[index]);
|
||||
my_atomic_rwlock_rdunlock(&time_collector_lock);
|
||||
return result;
|
||||
}
|
||||
uint64 total(uint index) const
|
||||
{
|
||||
my_atomic_rwlock_rdlock(&time_collector_lock);
|
||||
uint64 result= my_atomic_load64((int64*)&m_total[index]);
|
||||
my_atomic_rwlock_rdunlock(&time_collector_lock);
|
||||
return result;
|
||||
}
|
||||
public:
|
||||
void flush()
|
||||
{
|
||||
my_atomic_rwlock_wrlock(&time_collector_lock);
|
||||
memset((void*)&m_count,0,sizeof(m_count));
|
||||
memset((void*)&m_total,0,sizeof(m_total));
|
||||
my_atomic_rwlock_wrunlock(&time_collector_lock);
|
||||
}
|
||||
void collect(uint64 time)
|
||||
{
|
||||
int i= 0;
|
||||
for(int count= m_utility->bound_count(); count > i; ++i)
|
||||
{
|
||||
if(m_utility->bound(i) > time)
|
||||
{
|
||||
my_atomic_rwlock_wrlock(&time_collector_lock);
|
||||
my_atomic_add32((int32*)(&m_count[i]), 1);
|
||||
my_atomic_add64((int64*)(&m_total[i]), time);
|
||||
my_atomic_rwlock_wrunlock(&time_collector_lock);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
private:
|
||||
utility* m_utility;
|
||||
/* The lock for atomic operations on m_count and m_total. Only actually
|
||||
used on architectures that do not have atomic implementation of atomic
|
||||
operations. */
|
||||
my_atomic_rwlock_t time_collector_lock;
|
||||
uint32 m_count[OVERALL_POWER_COUNT + 1];
|
||||
uint64 m_total[OVERALL_POWER_COUNT + 1];
|
||||
};
|
||||
|
||||
class collector
|
||||
{
|
||||
public:
|
||||
collector() : m_time(m_utility)
|
||||
{
|
||||
m_utility.setup(DEFAULT_BASE);
|
||||
m_time.flush();
|
||||
}
|
||||
public:
|
||||
void flush()
|
||||
{
|
||||
m_utility.setup(opt_query_response_time_range_base);
|
||||
m_time.flush();
|
||||
}
|
||||
int fill(THD* thd, TABLE_LIST *tables, COND *cond)
|
||||
{
|
||||
DBUG_ENTER("fill_schema_query_response_time");
|
||||
TABLE *table= static_cast<TABLE*>(tables->table);
|
||||
Field **fields= table->field;
|
||||
for(uint i= 0, count= bound_count() + 1 /* with overflow */; count > i; ++i)
|
||||
{
|
||||
char time[TIME_STRING_BUFFER_LENGTH];
|
||||
char total[TOTAL_STRING_BUFFER_LENGTH];
|
||||
if(i == bound_count())
|
||||
{
|
||||
assert(sizeof(TIME_OVERFLOW) <= TIME_STRING_BUFFER_LENGTH);
|
||||
assert(sizeof(TIME_OVERFLOW) <= TOTAL_STRING_BUFFER_LENGTH);
|
||||
memcpy(time,TIME_OVERFLOW,sizeof(TIME_OVERFLOW));
|
||||
memcpy(total,TIME_OVERFLOW,sizeof(TIME_OVERFLOW));
|
||||
}
|
||||
else
|
||||
{
|
||||
print_time(time, sizeof(time), TIME_STRING_FORMAT, this->bound(i));
|
||||
print_time(total, sizeof(total), TOTAL_STRING_FORMAT, this->total(i));
|
||||
}
|
||||
fields[0]->store(time,strlen(time),system_charset_info);
|
||||
fields[1]->store(this->count(i));
|
||||
fields[2]->store(total,strlen(total),system_charset_info);
|
||||
if (schema_table_store_record(thd, table))
|
||||
{
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
void collect(ulonglong time)
|
||||
{
|
||||
m_time.collect(time);
|
||||
}
|
||||
uint bound_count() const
|
||||
{
|
||||
return m_utility.bound_count();
|
||||
}
|
||||
ulonglong bound(uint index)
|
||||
{
|
||||
return m_utility.bound(index);
|
||||
}
|
||||
ulonglong count(uint index)
|
||||
{
|
||||
return m_time.count(index);
|
||||
}
|
||||
ulonglong total(uint index)
|
||||
{
|
||||
return m_time.total(index);
|
||||
}
|
||||
private:
|
||||
utility m_utility;
|
||||
time_collector m_time;
|
||||
};
|
||||
|
||||
static collector g_collector;
|
||||
|
||||
} // namespace query_response_time
|
||||
|
||||
void query_response_time_init()
|
||||
{
|
||||
}
|
||||
|
||||
void query_response_time_free()
|
||||
{
|
||||
query_response_time::g_collector.flush();
|
||||
}
|
||||
|
||||
void query_response_time_flush()
|
||||
{
|
||||
query_response_time::g_collector.flush();
|
||||
}
|
||||
void query_response_time_collect(ulonglong query_time)
|
||||
{
|
||||
query_response_time::g_collector.collect(query_time);
|
||||
}
|
||||
|
||||
int query_response_time_fill(THD* thd, TABLE_LIST *tables, COND *cond)
|
||||
{
|
||||
return query_response_time::g_collector.fill(thd,tables,cond);
|
||||
}
|
||||
#endif // HAVE_RESPONSE_TIME_DISTRIBUTION
|
67
plugin/query_response_time/query_response_time.h
Normal file
67
plugin/query_response_time/query_response_time.h
Normal file
|
@ -0,0 +1,67 @@
|
|||
#ifndef QUERY_RESPONSE_TIME_H
|
||||
#define QUERY_RESPONSE_TIME_H
|
||||
|
||||
/*
|
||||
Settings for query response time
|
||||
*/
|
||||
|
||||
/*
|
||||
Maximum string length for (10 ^ (-1 * QRT_STRING_NEGATIVE_POWER_LENGTH)) in text representation.
|
||||
Example: for 6 is 0.000001
|
||||
Always 2
|
||||
|
||||
Maximum string length for (10 ^ (QRT_STRING_POSITIVE_POWER_LENGTH + 1) - 1) in text representation.
|
||||
Example: for 7 is 9999999.0
|
||||
*/
|
||||
#define QRT_TIME_STRING_POSITIVE_POWER_LENGTH 7
|
||||
#define QRT_TOTAL_STRING_POSITIVE_POWER_LENGTH 7
|
||||
|
||||
/*
|
||||
Minimum base for log - ALWAYS 2
|
||||
Maximum base for log:
|
||||
*/
|
||||
#define QRT_MAXIMUM_BASE 1000
|
||||
|
||||
/*
|
||||
Filler for whole number (positive power)
|
||||
Example: for
|
||||
QRT_POSITIVE_POWER_FILLER ' '
|
||||
QRT_POSITIVE_POWER_LENGTH 7
|
||||
and number 7234 result is:
|
||||
' 7234'
|
||||
*/
|
||||
#define QRT_POSITIVE_POWER_FILLER ""
|
||||
/*
|
||||
Filler for fractional number. Similiary to whole number
|
||||
*/
|
||||
#define QRT_NEGATIVE_POWER_FILLER "0"
|
||||
|
||||
/*
|
||||
Message if time too big for statistic collecting (very long query)
|
||||
*/
|
||||
#define QRT_TIME_OVERFLOW "TOO LONG"
|
||||
|
||||
#define QRT_DEFAULT_BASE 10
|
||||
|
||||
#define QRT_TIME_STRING_LENGTH \
|
||||
max( (QRT_TIME_STRING_POSITIVE_POWER_LENGTH + 1 /* '.' */ + 6 /*QRT_TIME_STRING_NEGATIVE_POWER_LENGTH*/), \
|
||||
(sizeof(QRT_TIME_OVERFLOW) - 1) )
|
||||
|
||||
#define QRT_TOTAL_STRING_LENGTH \
|
||||
max( (QRT_TOTAL_STRING_POSITIVE_POWER_LENGTH + 1 /* '.' */ + 6 /*QRT_TOTAL_STRING_NEGATIVE_POWER_LENGTH*/), \
|
||||
(sizeof(QRT_TIME_OVERFLOW) - 1) )
|
||||
|
||||
extern ST_SCHEMA_TABLE query_response_time_table;
|
||||
|
||||
#ifdef HAVE_RESPONSE_TIME_DISTRIBUTION
|
||||
extern void query_response_time_init ();
|
||||
extern void query_response_time_free ();
|
||||
extern void query_response_time_flush ();
|
||||
extern void query_response_time_collect(ulonglong query_time);
|
||||
extern int query_response_time_fill (THD* thd, TABLE_LIST *tables, COND *cond);
|
||||
|
||||
extern ulong opt_query_response_time_range_base;
|
||||
extern my_bool opt_query_response_time_stats;
|
||||
#endif // HAVE_RESPONSE_TIME_DISTRIBUTION
|
||||
|
||||
#endif // QUERY_RESPONSE_TIME_H
|
|
@ -1847,8 +1847,8 @@ void clean_up(bool print_message)
|
|||
my_tz_free();
|
||||
my_dboptions_cache_free();
|
||||
ignore_db_dirs_free();
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
servers_free(1);
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
acl_free(1);
|
||||
grant_free();
|
||||
#endif
|
||||
|
@ -4682,6 +4682,8 @@ a file name for --log-bin-index option", opt_binlog_index_name);
|
|||
init_update_queries();
|
||||
init_global_user_stats();
|
||||
init_global_client_stats();
|
||||
if (!opt_bootstrap)
|
||||
servers_init(0);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
@ -5088,9 +5090,6 @@ int mysqld_main(int argc, char **argv)
|
|||
if (!opt_noacl)
|
||||
(void) grant_init();
|
||||
|
||||
if (!opt_bootstrap)
|
||||
servers_init(0);
|
||||
|
||||
if (!opt_noacl)
|
||||
{
|
||||
#ifdef HAVE_DLOPEN
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
#include "sql_parse.h" // cleanup_items
|
||||
#include "sql_base.h" // close_thread_tables
|
||||
#include "transaction.h" // trans_commit_stmt
|
||||
#include "sql_audit.h"
|
||||
|
||||
/*
|
||||
Sufficient max length of printed destinations and frame offsets (all uints).
|
||||
|
@ -3132,6 +3133,10 @@ sp_instr_stmt::execute(THD *thd, uint *nextp)
|
|||
|
||||
query_cache_end_of_result(thd);
|
||||
|
||||
mysql_audit_general(thd, MYSQL_AUDIT_GENERAL_STATUS,
|
||||
thd->stmt_da->is_error() ? thd->stmt_da->sql_errno() : 0,
|
||||
command_name[COM_QUERY].str);
|
||||
|
||||
if (!res && unlikely(thd->enable_slow_log))
|
||||
log_slow_statement(thd);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue