From: Christopher Powers Date: August 19 2011 6:59am Subject: bzr push into mysql-trunk branch (chris.powers:3382 to 3383) WL#4896 List-Archive: http://lists.mysql.com/commits/140713 Message-Id: <201108190700.p7J70Q4d018569@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3383 Christopher Powers 2011-08-19 WL#4896 "Performance Schema Net IO" Final version of socket_summary_by_instance_func.test modified: mysql-test/suite/perfschema/include/socket_check1.inc mysql-test/suite/perfschema/include/socket_event.inc mysql-test/suite/perfschema/include/socket_summary_check.inc mysql-test/suite/perfschema/r/socket_summary_by_instance_func.result* mysql-test/suite/perfschema/t/socket_summary_by_instance_func.test 3382 Marc Alff 2011-08-18 [merge] Merge mysql-trunk --> mysql-trunk-wl4896 added: mysql-test/r/multi_plugin_load.result mysql-test/r/multi_plugin_load_add.result mysql-test/r/multi_plugin_load_add2.result mysql-test/t/multi_plugin_load-master.opt mysql-test/t/multi_plugin_load.test mysql-test/t/multi_plugin_load_add-master.opt mysql-test/t/multi_plugin_load_add.test mysql-test/t/multi_plugin_load_add2-master.opt mysql-test/t/multi_plugin_load_add2.test modified: mysql-test/include/plugin.defs mysql-test/mysql-test-run.pl mysql-test/r/mysqld--help-notwin.result mysql-test/r/mysqld--help-win.result sql/mysqld.cc sql/mysqld.h sql/sql_class.cc sql/sql_derived.cc sql/sql_plugin.cc sql/sql_plugin.h sql/sql_show.cc storage/innobase/buf/buf0flu.c === modified file 'mysql-test/suite/perfschema/include/socket_check1.inc' --- a/mysql-test/suite/perfschema/include/socket_check1.inc 2011-08-15 06:26:10 +0000 +++ b/mysql-test/suite/perfschema/include/socket_check1.inc 2011-08-19 06:59:27 +0000 @@ -1,3 +1,21 @@ +# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. +# +# 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., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +# + # Example how to use this auxiliary script #----------------------------------------- # @@ -8,9 +26,9 @@ ### $check_num is used for the generation of titles and gets incremented after ### every call of the current script. # let $check_num= 1; -### $column_list is used for the generation of error information and valid for +### $diff_column_list is used for the generation of error information and valid for ### every sub test. -# let $column_list= +# let $diff_column_list= # t2.COUNT_READ - t1.COUNT_READ AS D_COUNT_READ, # t2.COUNT_READ AS S2_COUNT_READ, # t1.COUNT_READ AS S1_COUNT_READ, @@ -40,6 +58,10 @@ # # let stmt1= SELECT col2 FROM does_not_exist; # let stmt2= SELECT col2 FROM does_not_exist WHERE col1 = 0; +### $msg is used to generate some explanation of what we compare. +# let $msg= +# # One statement is longer than the other. +# # Both statements fail with the same error message (table does not exist); # let $my_rules= # t2.COUNT_READ - t1.COUNT_READ = 0 AND # t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt2') - LENGTH('$stmt1') AND @@ -59,24 +81,27 @@ --echo # $title_prefix.$check_num Compare impact of statements --echo # $stmt2 --echo # $stmt1 +--echo $msg -# MLML: Disable this later -if (`SELECT CONCAT("$stmt1","$stmt2","$my_rules") LIKE '%_not_set%'`) +# Enable this when extending the checks for SQL statements. +if(0) { - --echo # INTERNAL ERROR: - --echo # At least one of the variables has no value (is like '%_not_set') - --echo # stmt1 : $stmt1 - --echo # stmt2 : $stmt2 - --echo # my_rules : $my_rules - --echo # Sorry, have to abort - exit; + if (`SELECT CONCAT("$stmt1","$stmt2","$my_rules") LIKE '%_not_set%'`) + { + --echo # INTERNAL ERROR: + --echo # At least one of the variables has no value (is like '%_not_set') + --echo # stmt1 : $stmt1 + --echo # stmt2 : $stmt2 + --echo # my_rules : $my_rules + --echo # Sorry, have to abort + exit; + } } -if(`SELECT ($my_rules) <> 1 +if(`SELECT NOT ( $my_rules ) $part AND t2.statement = '$stmt2' AND t1.statement = '$stmt1'`) { - --disable_abort_on_error --enable_query_log --enable_result_log --echo # The compared statistics looks suspicious @@ -91,16 +116,19 @@ if(`SELECT ($my_rules) <> 1 --echo --vertical_results eval - SELECT $column_list + SELECT $diff_column_list $part AND t1.statement = '$stmt1' AND t2.statement = '$stmt2'; --echo --horizontal_results eval - SELECT LPAD(COUNT_READ, 8, ' ') AS CNT_READ, LPAD(SUM_NUMBER_OF_BYTES_READ, 10,' ') AS BYTES_READ, - LPAD(COUNT_WRITE,9, ' ') AS CNT_WRITE,LPAD(SUM_NUMBER_OF_BYTES_WRITE, 11,' ') AS BYTES_WRITE, - LPAD(COUNT_MISC, 8, ' ') AS CNT_MISC, statement + SELECT + LPAD(COUNT_READ, 8, ' ') AS CNT_READ, + LPAD(SUM_NUMBER_OF_BYTES_READ, 10,' ') AS BYTES_READ, + LPAD(COUNT_WRITE,9, ' ') AS CNT_WRITE, + LPAD(SUM_NUMBER_OF_BYTES_WRITE, 11,' ') AS BYTES_WRITE, + LPAD(COUNT_MISC, 8, ' ') AS CNT_MISC, statement FROM mysqltest.socket_summary_by_instance_detail WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin AND EVENT_NAME LIKE ('%client_connection') @@ -112,6 +140,7 @@ if(`SELECT ($my_rules) <> 1 let $stmt1= stmt1_not_set; let $stmt2= stmt2_not_set; let $my_rules= my_rules_not_set; +let $msg= msg_not_set; inc $check_num; === modified file 'mysql-test/suite/perfschema/include/socket_event.inc' --- a/mysql-test/suite/perfschema/include/socket_event.inc 2011-08-15 06:26:10 +0000 +++ b/mysql-test/suite/perfschema/include/socket_event.inc 2011-08-19 06:59:27 +0000 @@ -18,20 +18,23 @@ # include/socket_event.inc # -# Auxiliary routine -# - running some statement in connection con1 -# and checking the changes for the client_connction" entry belonging to con1 -# within socket_summary_by_instance and -# - checking if the changes to values caused by the statement execution are -# reasonable and stable +# Auxiliary routine running +# - some statement in connection con1 +# or +# - connect/disconnect +# $loop_rounds times and checking if the changes to values caused by the action +# are reasonable. # # Requirements: -# 1. Have socket_summary_by_instance_func running -# 2. Have a connection con1 -# @con1_object_instance_begin needs to be the OBJECT_INSTANCE_BEGIN -# value of the "client_connction" entry belonging to con1 within -# socket_summary_by_instance. -# 3. $statement needs to contain the statement to be executed by con1. +# 1. Have socket_summary_by_instance_func running +# 2a. Have a connection con1 +# @con1_object_instance_begin needs to be the OBJECT_INSTANCE_BEGIN +# value of the "client_connction" entry belonging to con1 within +# socket_summary_by_instance. +# $statement needs to contain the statement to be executed by con1. +# or +# 2b. Have assigned values to the following variables +# $connect_host $connect_db $connect_user # let $my_errno= 0; @@ -51,12 +54,23 @@ eval $insert_before; #================== if($is_connect) { - let $statement= Connect (con1,$connect_host,$connect_user,,$connect_db,,); + let $statement= Connect (con*,$connect_host,$connect_user,,$connect_db,,); # Some statements fail with ER_ACCESS_DENIED_ERROR --disable_abort_on_error - --connect (con1,$connect_host,$connect_user,,$connect_db,,) + --connect (con$loop_round,$connect_host,$connect_user,,$connect_db,,) --enable_abort_on_error let $my_errno= $mysql_errno; + if(!$my_errno) + { + # Note(mleich): + # We are aware that this additional statement is overhead. + # But it ensures that SUM_NUMBER_OF_BYTES_READ and + # SUM_NUMBER_OF_BYTES_WRITE are updated. + # And this avoids the instabilities found when running + # the connect without this additional statement. + DO 1; + } + --connection default } if(!$is_connect) { @@ -71,6 +85,7 @@ if(!$is_connect) # One of the statements to be checked is expected to fail with ER_NO_SUCH_TABLE. --disable_abort_on_error eval $statement; + --connection default --enable_abort_on_error --disable_query_log --disable_result_log @@ -82,24 +97,73 @@ if(!$is_connect) --connection default # Variants: #---------- -# 1. Connect failed ($my_errno <> 0) +# 1. Connect failed ($my_errno <> 0) # no entry in performance_schema.threads -> wait_till_sleep.inc cannot be used -# Just 3 seconds sleep -# 2. Connect with success ($my_errno = 0) +# short life entry in socket_summary_by_instance -> wait till it doesn't exist +# 2. Connect with success ($my_errno = 0) # entry in performance_schema.threads -> wait_till_sleep.inc can be used -# Additional 3 second sleep +# entry in socket_summary_by_instance -> wait till it does exist # 3. SQL command failed ($my_errno <> 0) # entry in performance_schema.threads -> wait_till_sleep.inc can be used if($is_connect) { + let $part= + FROM performance_schema.socket_summary_by_instance + WHERE EVENT_NAME LIKE '%client_connection' + AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin; + if(!$my_errno) { + # Wait till the new connection is visible in performance_schema.threads + # and processlist_command is 'Sleep'. --source ../include/wait_till_sleep.inc + + # A successful connect causes that a new second row in + # performance_schema.socket_summary_by_instance shows up. + # Wait till this row is there. + let $wait_timeout= 10; + let $wait_condition= + SELECT COUNT(*) = 1 + $part; + --source include/wait_condition.inc + if (!$success) + { + --echo # Error: We did not reach the expected state where a new + --echo # row in socket_summary_by_instance is visible + eval + SELECT * + $part; + --echo # abort + exit; + } } if($my_errno) { - --sleep 6 + # Experiments with high parallel load showed that there is a very + # period of time where a "client_connection" entry for a failing + # Connect is visible. + # We hope that sleep 1 is long enough so that PERFORMANCE_SCHEMA + # can remove this row before we collect the after action state. + let $wait_timeou= 5; + let $wait_condition= + SELECT COUNT(*) = 0 + $part; + --source include/wait_condition.inc + if(!$success) + { + --echo # Error: We did not reach the expected state. + --echo # A failing connect causes a "client_connection" entry + --echo # within socket_summary_by_instance having an extreme + --echo # short lifetime. + --echo # This entry must have now disappeared. + eval + SELECT * + $part; + --echo # abort + exit; + } } + # --sleep 3 } if(!$is_connect) { @@ -138,26 +202,48 @@ if($is_connect) # Only in case the connect was successful ($my_errno = 0) than we have to disconnect. if(!$my_errno) { - --disconnect con1 + --disconnect con$loop_round # Wait till the connection using the DB = 'mysqltest' or - # 'mysqlsupertest' has disappeared - let $wait_timeout= 5; - let $wait_condition= - SELECT COUNT(*) = 0 + # 'mysqlsupertest' has disappeared from performance_schema.threads + let $part= FROM performance_schema.threads WHERE processlist_db IN ('mysqltest','mysqlsupertest'); + let $wait_timeout= 10; + let $wait_condition= + SELECT COUNT(*) = 0 + $part; --source include/wait_condition.inc if (!$success) { --echo # Error: The disconnect of the connection with processlist_db --echo # IN ('mysqltest','mysqlsupertest') failed - SELECT * FROM performance_schema.threads - WHERE processlist_db IN ('mysqltest','mysqlsupertest'); + SELECT * + $part; + --echo # abort + exit; + } + # Wait in addition till the corresponding 'client_connection' entry of + # the connection using the DB = 'mysqltest' or 'mysqlsupertest' has disappeared. + let $part= + FROM performance_schema.socket_summary_by_instance + WHERE EVENT_NAME LIKE '%client_connection' + AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin; + let $wait_timeout= 10; + let $wait_condition= + SELECT COUNT(*) = 0 + $part; + --source include/wait_condition.inc + if (!$success) + { + --echo # Error: The entry of the disconnectd connection with processlist_db + --echo # IN ('mysqltest','mysqlsupertest') did not disappear + SELECT * + $part; --echo # abort exit; } } - --sleep 3 + # --sleep 3 } inc $loop_round; === modified file 'mysql-test/suite/perfschema/include/socket_summary_check.inc' --- a/mysql-test/suite/perfschema/include/socket_summary_check.inc 2011-08-16 15:12:11 +0000 +++ b/mysql-test/suite/perfschema/include/socket_summary_check.inc 2011-08-19 06:59:27 +0000 @@ -52,7 +52,7 @@ eval $insert_after; # 1. The content of socket_summary_by_instance must be consistent to the # content of socket_instances -#----------------------------------------------------------------------- +#======================================================================= let $part1= FROM performance_schema.socket_summary_by_instance WHERE (EVENT_NAME,OBJECT_INSTANCE_BEGIN) @@ -66,8 +66,6 @@ if(`SELECT COUNT(*) $part1`) eval SELECT 'not in socket_instances' AS state, EVENT_NAME, OBJECT_INSTANCE_BEGIN $part1; - --echo # abort 1 -# exit; } --vertical_results @@ -76,7 +74,7 @@ if(`SELECT COUNT(*) $part1`) # 2. The computation of statistics must be roughly correct. # # If we run this check sufficient frequent than AVG_TIMER_* can be removed from other checks. -#----------------------------------------------------------------------------------------------- +#=============================================================================================== let $my_lo= 0.98; let $my_hi= 1.02; @@ -87,10 +85,14 @@ COUNT_WRITE * AVG_TIMER_WRITE BETWEEN SU COUNT_MISC * AVG_TIMER_MISC BETWEEN SUM_TIMER_MISC * $my_lo AND SUM_TIMER_MISC * $my_hi; let $part= -SUM_TIMER_WAIT * $my_lo, COUNT_STAR * AVG_TIMER_WAIT, SUM_TIMER_WAIT * $my_hi, COUNT_STAR, SUM_TIMER_WAIT, AVG_TIMER_WAIT, -SUM_TIMER_READ * $my_lo, COUNT_READ * AVG_TIMER_READ, SUM_TIMER_READ * $my_hi, COUNT_READ, SUM_TIMER_READ, AVG_TIMER_READ, -SUM_TIMER_WRITE * $my_lo, COUNT_WRITE * AVG_TIMER_WRITE, SUM_TIMER_WRITE * $my_hi, COUNT_WRITE, SUM_TIMER_WRITE, AVG_TIMER_WRITE, -SUM_TIMER_MISC * $my_lo, COUNT_MISC * AVG_TIMER_MISC, SUM_TIMER_MISC * $my_hi, COUNT_MISC, SUM_TIMER_MISC, AVG_TIMER_MISC; +SUM_TIMER_WAIT * $my_lo, COUNT_STAR * AVG_TIMER_WAIT, SUM_TIMER_WAIT * $my_hi, + COUNT_STAR, SUM_TIMER_WAIT, AVG_TIMER_WAIT, +SUM_TIMER_READ * $my_lo, COUNT_READ * AVG_TIMER_READ, SUM_TIMER_READ * $my_hi, + COUNT_READ, SUM_TIMER_READ, AVG_TIMER_READ, +SUM_TIMER_WRITE * $my_lo, COUNT_WRITE * AVG_TIMER_WRITE, SUM_TIMER_WRITE * $my_hi, + COUNT_WRITE, SUM_TIMER_WRITE, AVG_TIMER_WRITE, +SUM_TIMER_MISC * $my_lo, COUNT_MISC * AVG_TIMER_MISC, SUM_TIMER_MISC * $my_hi, + COUNT_MISC, SUM_TIMER_MISC, AVG_TIMER_MISC; if(`SELECT SUM($my_rules) <> COUNT(*) FROM mysqltest.my_socket_summary_by_instance WHERE pk = 'After'`) @@ -111,10 +113,6 @@ if(`SELECT SUM($my_rules) <> COUNT(*) FR $part FROM performance_schema.socket_summary_by_instance ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; - --echo # abort 2 - # MLML? SHOW STATUS LIKE 'Performance_schema_socket_%_lost'; - SHOW STATUS LIKE 'Performance_schema_%_lost'; -# exit; } @@ -153,9 +151,6 @@ if(`SELECT SUM($my_rules) <> COUNT(*) FR FROM mysqltest.my_socket_summary_by_instance WHERE pk = 'After' AND NOT ($my_rules) ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; - - --echo # abort 3 -# exit; } @@ -189,8 +184,6 @@ if(`SELECT SUM($my_rules) <> COUNT(*) FR FROM mysqltest.my_socket_summary_by_instance WHERE pk = 'After' ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; - --echo # abort 4 -# exit; } @@ -220,8 +213,6 @@ if(`SELECT SUM($my_rules) <> COUNT(*) FR FROM mysqltest.my_socket_summary_by_instance WHERE pk = 'After' ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; - --echo # abort 5 -# exit; } @@ -251,8 +242,6 @@ if(`SELECT SUM($my_rules) <> COUNT(*) FR FROM mysqltest.my_socket_summary_by_instance WHERE pk = 'After' ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; - --echo # abort 6 -# exit; } --horizontal_results === modified file 'mysql-test/suite/perfschema/r/socket_summary_by_instance_func.result' (properties changed: -x to +x) --- a/mysql-test/suite/perfschema/r/socket_summary_by_instance_func.result 2011-08-16 03:57:30 +0000 +++ b/mysql-test/suite/perfschema/r/socket_summary_by_instance_func.result 2011-08-19 06:59:27 +0000 @@ -6,9 +6,17 @@ # (logging enabled) # - the test might abort # -# 0. Build or set prequisites -# 1. Check the base line -# 2. Check connect +# 0. Check, build or set prequisites +UPDATE performance_schema.threads +SET INSTRUMENTED='NO' WHERE PROCESSLIST_ID = CONNECTION_ID(); +# 1. Basic checks +# 1.1 Check that the entry of the disconnected old default session really +# disappeared from performance_schema.socket_summary_by_instance. +# 1.2 Check the impact of TRUNCATE on socket_summary_by_instance. +# It must reset all counters. +TRUNCATE TABLE performance_schema.socket_summary_by_instance; +# 1.3 Check the base line +# 2. Variations on Connect # 2.1 Connect fails because the user is unknown # length of user name = 4 character # length of default db = 9 character @@ -33,103 +41,162 @@ DROP USER 'root012345'@'localhost'; # length of default db = 9 character GRANT ALL PRIVILEGES ON *.* to 'root0123456789'@'localhost'; DROP USER 'root0123456789'@'localhost'; -# 3 Check SELECTs +# 2.7 Connect should pass, host = ::ffff:127.0.0.1 +# length of user name = 4 character +# length of default db = 9 character +# connection runs through server_tcpip_socket ! +# 3 Variations on SELECT # 3.1 Check a SELECT ending with server sending an error message. # Error message is short (unknown table). SELECT col2 FROM does_not_exist; ERROR 42S02: Table 'mysqltest.does_not_exist' doesn't exist -# 3.2 Check a SELECT ending with server sending an error message. +# 3.2 SELECT ending with server sending an error message. # Now the statement is a bit longer but the error message # length does again not depend on statement. SELECT col2 FROM does_not_exist WHERE col1 = 0; ERROR 42S02: Table 'mysqltest.does_not_exist' doesn't exist -# 3.3 Check a SELECT ending with server sending an error message. +# 3.3 SELECT ending with server sending an error message. # The statement has the same length like in 3.2 but the error # message is now different and much longer. SELECT col2 FROM does_not_exist WHERE col1 A 0; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'A 0' at line 1 -# 3.4 Check a SELECT ending with server sending an error message. +# 3.4 SELECT ending with server sending an error message. # Statement and error message are a bit longer than in 3.1 # because the table name is longer. SELECT col2 FROM does_not_exist0123; ERROR 42S02: Table 'mysqltest.does_not_exist0123' doesn't exist -# 3.5 Check a SELECT earning an empty result set. -SELECT col2 FROM mysqltest.my_aux WHERE col1 = 0; +# 3.5 SELECT earning an empty result set. +SELECT col2 FROM mysqltest.my_aux WHERE col1 = -1; col2 -# 3.6 Check a SELECT earning an empty result set. +# 3.6 SELECT earning an empty result set. # Short column name is replaced by longer alias. -SELECT col2 AS my_lovely_col FROM mysqltest.my_aux WHERE col1 = 0; -my_lovely_col -# 3.7 Check a SELECT earning one row with an empty string. +SELECT col2 AS my_super_col FROM mysqltest.my_aux WHERE col1 = -1; +my_super_col +# 3.7 SELECT earning one row with an empty string. SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; col2 -# 3.8 Check a SELECT earning one row with one string one char long. +# 3.8 SELECT earning one row with one string one char long. SELECT col2 FROM mysqltest.my_aux WHERE col1 = 2; col2 a -# 3.9 Check a SELECT earning one row with one string 1024 char long. +# 3.9 SELECT earning one row with one string 1024 char long. SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3; col2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa! aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -# 3.10 Check a SELECT earning two rows with an empty string -SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -UNION ALL -SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; -col2 - - -SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -UNION DISTINCT -SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; +# 3.10 SELECT earning two rows with an empty string +SELECT col2 FROM mysqltest.my_aux WHERE col1 < 2; col2 -SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3 -UNION ALL -SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3; -col2 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa! aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa! aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -SELECT col2 FROM mysqltest.my_aux WHERE col1 < 3; -col2 -a -# 4. Check delta details +# 3.11 Check that the preceding Connects/SQL command runs have not +# caused some unexpected state. +# 4. Check delta (value_after_action - value_before_action) details # 4.1 Check that -# - increased COUNT_* leads to increased -# SUM_TIMER_* and SUM_NUMBER_OF_BYTES_* # - no change in COUNT_* leads to no change in -# SUM_TIMER_* and SUM_NUMBER_OF_BYTES_* +# SUM_TIMER_* and no change in SUM_NUMBER_OF_BYTES_* +# - increased COUNT_READ leads to increased +# SUM_TIMER_READ and SUM_NUMBER_OF_BYTES_READ +# - increased COUNT_WRITE leads to increased +# SUM_TIMER_READ and SUM_NUMBER_OF_BYTES_READ +# - increased COUNT_MISC leads to increased +# SUM_TIMER_MISC +# Attention: There are exceptions but they are not valid +# for this test. # 4.2 Results must be stable -# Everything except "client_connection" for default connection -# because the default connection runs include/wait_till_sleep.inc -# which means a varying amount of statements. -# 4.3 Check the differences caused by SQL statements -# 4.3.1 Compare impact of statements +# 4.3 Counters must be 0 in client_connection for the default session +# Instrumenting is disabled since a long time and the counter were +# reset via TRUNCATE just after the disabling. +# 4.4 Check the differences caused by SQL statements +# 4.4.1 There must be no changes in counters of instances +# NOT LIKE '%client_connection' because everything gets charged +# into client_connection of the acting connection. +# 4.4.2 In case of SELECT and our scenarios even COUNT_READ and COUNT_MISC +# are stable. +# 4.4.3 In our testing scenarios we get for the client_connection entry +# of the acting connection +# -> OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin +# COUNT_MISC = 0 AND SUM_TIMER_MISC = 0 +# Check the differences between changes caused by SQL statements +# These differences must correspond to parameters like +# - statement, table name or column name length +# - number of rows in result set, size of rows in result set etc. +# 4.4.4 Compare impact of statements # SELECT col2 FROM does_not_exist WHERE col1 = 0 # SELECT col2 FROM does_not_exist -# 4.3.2 Compare impact of statements +# One statement is longer than the other. +# Both statements fail with the same error message (table does not exist) +# 4.4.5 Compare impact of statements # SELECT col2 FROM does_not_exist WHERE col1 A 0 # SELECT col2 FROM does_not_exist WHERE col1 = 0 -# 4.3.3 Compare impact of statements +# Both statements have the same length and fail. +# The length of the error messages differs. +# 4.4.6 Compare impact of statements # SELECT col2 FROM does_not_exist0123 # SELECT col2 FROM does_not_exist -# 4.3.4 Compare impact of statements -# SELECT col2 AS my_lovely_col FROM mysqltest.my_aux WHERE col1 = 0 -# SELECT col2 FROM mysqltest.my_aux WHERE col1 = 0 -# 4.3.5 Compare impact of statements +# Both statements fail (table does not exist). +# The length of the statement and the length of the error messages differs. +# Reason for both differences is the length of the table name. +# 4.4.7 Compare impact of statements +# SELECT col2 AS my_super_col FROM mysqltest.my_aux WHERE col1 = -1 +# SELECT col2 FROM mysqltest.my_aux WHERE col1 = -1 +# Both statements get an empty result set. +# The length of the statements and the length of the result sets differs. +# Reason for both differences is the length of the some column name. +# 4.4.8 Compare impact of statements # SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# SELECT col2 FROM mysqltest.my_aux WHERE col1 = 0 -# 4.3.6 Compare impact of statements +# SELECT col2 FROM mysqltest.my_aux WHERE col1 = -1 +# Both statements differ in the statement length. +# One statement earns an empty result set. +# The other statement earns one row containing an empty string. +# 4.4.9 Compare impact of statements # SELECT col2 FROM mysqltest.my_aux WHERE col1 = 2 # SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# 4.3.7 Compare impact of statements +# Both statements have the same length. +# One statement earns an one row containing an empty string. +# The other statement earns one row containing a string 1 byte long. +# 4.4.10 Compare impact of statements # SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3 # SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# 4.3.2 Failing (->2.1) vs. passing (-> 2.3) connect -# FIXME: To be implemented after the bug fixes -# 4.3.3 2.3 vs. 2.4 -# FIXME: To be implemented after the bug fixes -# 4.4 Check the differences caused by SQL statements -# FIXME: To be implemented after the bug fixes +# Both statements have the same length. +# One statement earns an one row containing an empty string. +# The other statement earns one row containing a string 1024 byte long. +# 4.4.11 Compare impact of statements +# SELECT col2 FROM mysqltest.my_aux WHERE col1 < 2 +# SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 +# Both statements have the same length. +# One statement earns an one row containing an empty string. +# The other statement earns two rows containing an empty string. +# 4.5 Check the differences caused by Connects +# Attention: Succesful Connects run an additional "DO 1". +# 4.5.1 Connects do not charge anything into READ or WRITE counters +# of the instance with EVENT_NAME NOT LIKE ('%client_connection%'). +# This mean all these counters must be 0. +# 4.5.2 Connects using for host the value 'localhost' +# 4.5.2.1 For the instance with EVENT_NAME LIKE '%server_tcpip_socket' +# COUNT_MISC = 0 AND SUM_TIMER_MISC = 0 must be valid +# because we run through server_unix_socket. +# 4.5.2.2 For the instance with EVENT_NAME LIKE '%server_unix_socket' +# COUNT_MISC > 0 AND SUM_TIMER_MISC > 0 must be valid. +# 4.5.3 Connects using for host a value <> 'localhost' +# 4.5.3.1 For the instance with EVENT_NAME LIKE '%server_unix_socket' +# COUNT_MISC = 0 AND SUM_TIMER_MISC = 0 must be valid +# because we run through server_tcpip_socket. +# 4.5.3.2 For the instance with EVENT_NAME LIKE '%server_tcpip_socket' +# COUNT_MISC > 0 AND SUM_TIMER_MISC > 0 must be valid. +# 4.5.4 Failing Connects do not cause any row with EVENT_NAME +# LIKE '%client_connection' +# 4.5.5 Successful Connects cause a new instance with EVENT_NAME +# LIKE '%client_connection' +# 4.6 Check the differences caused by Connects +# - INSTANCES with an EVENT_NAME like server_tcpip_socket or +# server_unix_socket are already checked +# - the stability of results is already checked +# So we con go with the results of the first run. +# 4.6.1 The SUM_OF_BYTES_WRITE value is the same for all Connects. +# 4.6.2 The SUM_OF_BYTES_WRITE value hast to be > 100. +# 4.6.3 COUNT_READ, COUNT_WRITE and COUNT_MISC have to be to be > 0 +# 4.6.4 Checks based on comparison of results for connects +# 4.6.4 The user name length affects the SUM_OF_BYTES_READ value +# 4.6.5 The database name length affects the SUM_OF_BYTES_READ value # 5. Cleanup === modified file 'mysql-test/suite/perfschema/t/socket_summary_by_instance_func.test' --- a/mysql-test/suite/perfschema/t/socket_summary_by_instance_func.test 2011-08-17 20:29:21 +0000 +++ b/mysql-test/suite/perfschema/t/socket_summary_by_instance_func.test 2011-08-19 06:59:27 +0000 @@ -15,13 +15,46 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA # + # Some functional checks for the content of the performance_schema table -# socket_summary_by_instance +# socket_summary_by_instance. # # Created: mleich 2011-07-01 # +# Rough description of "What is when tested" +# 1. Impact of successful connect +# A new row with EVENT_NAME "client_connection" shows up +# is tested in 0 and 4.5. +# 2. Impact of disconnect +# A row with EVENT_NAME "client_connection" disappears up +# is tested in 0. and 1.2. +# 3. Disabling the instrumentation for some thread causes that the +# counter for this thread become static is tested in 4.3. +# Nearby the beginning of this test and somewhere in the middle. +# 4. TRUNCATE table resets the counter is tested nearby the beginning. +# 5. Consistency within a row like MIN_* <= AVG_* <= MAX_* +# -> include/socket_summary_check.inc which is called at +# various places +# 6. Consistency of the instances mentioned in socket_summary_by_event +# and socket_summary_by_instance is checked per call of +# include/socket_summary_check.inc +# 7. Check if changes in counters of instances caused by actions +# are reasonable is tested for +# - Connects+SQL statements in 4.1 and 4.2 +# - SQL statements in 4.4 +# - Connects in 4.5 +# +# Embedded server does not supprt the performance_schema. --source include/not_embedded.inc +--source include/not_windows.inc + +# The values in the performance_schema tables depend on how much communication +# happens per SQL statement within our MTR tests. And there is a significant +# difference between standard statement execution and execution via +# prepared statement. +--source ../include/no_protocol.inc + #=================================== # Set IP address defaults with respect to IPV6 support @@ -68,8 +101,8 @@ if($my_socket_debug) --disable_query_log ---echo # 0. Build or set prequisites -#=================================== +--echo # 0. Check, build or set prequisites +#========================================== # Set $print_details to 1 in case you want that the exact diffs caused # by the execution of a statement get printed. # Disadvantage of printing details: @@ -81,11 +114,80 @@ if($my_socket_debug) let $print_details= 0; # -# Number of attempts within the test checking the stability of counter increments. +# Number of attempts within the test checking the stability of counter changes. # -# let $loop_rounds= 10; -let $loop_rounds= 1; +let $loop_rounds= 10; +# This test of PERFORMANCE_SCHEMA functionality is very vulnerable. +# Ensure that we have in the moment exact one +# - connection +# - instance with EVENT_NAME LIKE '%client_connection' +# - instance with EVENT_NAME LIKE '%server_tcpip_socket' +# - instance with EVENT_NAME LIKE '%server_unix_socket' +#======================================================= +let $my_rules= COUNT(*) = 1; +let $part= +FROM performance_schema.threads +WHERE NAME LIKE '%one_connection'; +let $wait_condition= +SELECT $my_rules $part; +let $wait_timeout= 5; +--source include/wait_condition.inc +if(!$success) +{ + --echo # ERROR: There must be only one user connection + eval + SELECT * $part; + --echo # abort + exit; +} +let $part= +FROM performance_schema.socket_summary_by_instance +WHERE EVENT_NAME LIKE '%client_connection'; +let $wait_condition= +SELECT $my_rules $part; +let $wait_timeout= 5; +--source include/wait_condition.inc +if(!$success) +{ + --echo # ERROR: There must be only one instance with this EVENT_NAME. + eval + SELECT * $part; + --echo # abort + exit; +} +let $part= +FROM performance_schema.socket_summary_by_instance +WHERE EVENT_NAME LIKE '%server_unix_socket'; +let $wait_condition= +SELECT $my_rules $part; +let $wait_timeout= 5; +--source include/wait_condition.inc +if(!$success) +{ + --echo # ERROR: There must be only one instance with this EVENT_NAME. + eval + SELECT * $part; + --echo # abort + exit; +} +let $part= +FROM performance_schema.socket_summary_by_instance +WHERE EVENT_NAME LIKE '%server_tcpip_socket'; +let $wait_condition= +SELECT $my_rules $part; +let $wait_timeout= 5; +--source include/wait_condition.inc +if(!$success) +{ + --echo # ERROR: There must be only one instance with this EVENT_NAME. + eval + SELECT * $part; + --echo # abort + exit; +} + +--disable_query_log # # Additional SCHEMA used for # - detection of our "worker" session within the PROCESSLIST. @@ -96,18 +198,14 @@ CREATE SCHEMA mysqltest; CREATE SCHEMA mysqlsupertest; # -# Disable the instrumentation for connection default. -# This connection observes the impact of the acting connections -# and should not have an impact on statistics. -# -# UPDATE performance_schema.threads -# SET INSTRUMENTED='NO' WHERE PROCESSLIST_ID = CONNECTION_ID(); - -# # Clear summary tables of previous entries # TRUNCATE performance_schema.socket_summary_by_instance; TRUNCATE performance_schema.socket_summary_by_event_name; +# Disable instrumenting of the current default session. +# Required for check 1.1 +UPDATE performance_schema.threads +SET INSTRUMENTED='NO' WHERE PROCESSLIST_ID = CONNECTION_ID(); # # Auxiliary tables for storing current values at certain points of time. @@ -122,14 +220,24 @@ CREATE TABLE mysqltest.my_socket_summary SELECT *, 'Pseudo_Before' AS pk FROM performance_schema.socket_summary_by_instance WHERE 1 = 0; +# The CAST(... AS DECIMAL) prevents errors which might show up in case +# we run with the original data type UNSIGNED BIGINT. +# Example: +# - A and B UNSIGNED BIGINT +# - A < B +# - A - B ---> Error CREATE TABLE mysqltest.socket_summary_by_instance_detail AS SELECT EVENT_NAME,OBJECT_INSTANCE_BEGIN, - COUNT_READ, SUM_TIMER_READ, SUM_NUMBER_OF_BYTES_READ, - COUNT_WRITE,SUM_TIMER_WRITE,SUM_NUMBER_OF_BYTES_WRITE, - COUNT_MISC, SUM_TIMER_MISC + CAST(COUNT_READ AS DECIMAL) AS COUNT_READ, + CAST(SUM_TIMER_READ AS DECIMAL) AS SUM_TIMER_READ, + CAST(SUM_NUMBER_OF_BYTES_READ AS DECIMAL) SUM_NUMBER_OF_BYTES_READ, + CAST(COUNT_WRITE AS DECIMAL) AS COUNT_WRITE, + CAST(SUM_TIMER_WRITE AS DECIMAL) AS SUM_TIMER_WRITE, + CAST(SUM_NUMBER_OF_BYTES_WRITE AS DECIMAL) AS SUM_NUMBER_OF_BYTES_WRITE, + CAST(COUNT_MISC AS DECIMAL) AS COUNT_MISC, + CAST(SUM_TIMER_MISC AS DECIMAL) AS SUM_TIMER_MISC FROM performance_schema.socket_summary_by_instance WHERE 1 = 2; - ALTER TABLE mysqltest.socket_summary_by_instance_detail ADD statement VARCHAR(500), ADD run INTEGER; @@ -140,15 +248,16 @@ CREATE FUNCTION mysqltest.min_of_triple (f1 BIGINT UNSIGNED, f2 BIGINT UNSIGNED, f3 BIGINT UNSIGNED) RETURNS BIGINT UNSIGNED RETURN IF(IF(f1 < f2,f1,f2) < f3,IF(f1 < f2,f1,f2), f3); - CREATE FUNCTION mysqltest.max_of_triple (f1 BIGINT UNSIGNED, f2 BIGINT UNSIGNED, f3 BIGINT UNSIGNED) RETURNS BIGINT UNSIGNED RETURN IF(IF(f1 > f2,f1,f2) > f3,IF(f1 > f2,f1,f2), f3); + # # Auxiliary table for experiments with SELECTs earning different result sets. # CREATE TABLE mysqltest.my_aux (col1 INTEGER, col2 VARCHAR(1024), PRIMARY KEY(col1)); +INSERT INTO mysqltest.my_aux SET col1 = 0, col2 = REPEAT('a',0); INSERT INTO mysqltest.my_aux SET col1 = 1, col2 = REPEAT('a',0); INSERT INTO mysqltest.my_aux SET col1 = 2, col2 = REPEAT('a',1); INSERT INTO mysqltest.my_aux SET col1 = 3, col2 = REPEAT('a',1024); @@ -220,15 +329,21 @@ WHERE (EVENT_NAME,OBJECT_INSTANCE_BEGIN) NOT IN (SELECT EVENT_NAME,OBJECT_INSTANCE_BEGIN FROM mysqltest.my_socket_summary_by_instance AS t2 WHERE pk = 'Before'); -# + +# Use this whenever you print data. let $column_list= -COUNT_READ, SUM_TIMER_READ, SUM_NUMBER_OF_BYTES_READ, -COUNT_WRITE, SUM_TIMER_WRITE, SUM_NUMBER_OF_BYTES_WRITE, -COUNT_MISC, SUM_TIMER_MISC, Statement; -let $counter_column_list= -COUNT_READ, SUM_NUMBER_OF_BYTES_READ, -COUNT_WRITE, SUM_NUMBER_OF_BYTES_WRITE, -COUNT_MISC, Statement; +RPAD(EVENT_NAME, 38, ' ') AS EVENT_NAME, +LPAD(OBJECT_INSTANCE_BEGIN, 20, ' ') AS OBJECT_INSTANCE, +LPAD(COUNT_READ, 7, ' ') AS CREAD, +LPAD(SUM_TIMER_READ, 12, ' ') AS TREAD, +LPAD(SUM_NUMBER_OF_BYTES_READ, 7, ' ') AS BREAD, +LPAD(COUNT_WRITE, 7, ' ') AS CWRITE, +LPAD(SUM_TIMER_WRITE, 12, ' ') AS TWRITE, +LPAD(SUM_NUMBER_OF_BYTES_WRITE, 7, ' ') AS BWRITE, +LPAD(COUNT_MISC, 7, ' ') AS CMISC, +LPAD(SUM_TIMER_MISC, 13, ' ') AS TMISC, +RPAD(STATEMENT, 50, ' ') AS STATEMENT, +LPAD(RUN, 5, ' ') AS RUN; # Determine OBJECT_INSTANCE_BEGIN of the connection default # which acts as the observer @@ -241,34 +356,126 @@ eval $insert_before; eval $insert_after; eval $get_object_instance_begin; SET @default_object_instance_begin = @con1_object_instance_begin; -# SELECT @default_object_instance_begin; -# SELECT * FROM performance_schema.threads; -# SELECT * FROM performance_schema.socket_summary_by_instance -# WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin; + +# Wait till the old default connection has disappeared +let $wait_timeout= 5; +let $wait_condition= +SELECT COUNT(*) = 1 +FROM performance_schema.threads +WHERE processlist_user = 'root'; +--source include/wait_condition.inc +if (!$success) +{ + --enable_query_log + --enable_result_log + --echo # Error: The disconnect of the old default connection + --echo # (user = 'root') failed. We expect to have only one connection + --echo # with user = 'root'. And this is our current connection. + SELECT * FROM performance_schema.threads + WHERE processlist_user = 'root'; + --echo # abort + exit; +} + +# Disable instrumenting of the current default session. +# Required for check 1.2 UPDATE performance_schema.threads SET INSTRUMENTED='NO' WHERE PROCESSLIST_ID = CONNECTION_ID(); + +--echo # 1. Basic checks +--echo # 1.1 Check that the entry of the disconnected old default session really +--echo # disappeared from performance_schema.socket_summary_by_instance. +#=============================================================================== +# This failed at some point in history when the instrumenting for the +# session to be disconnected was disabled. +if(`SELECT COUNT(*) FROM performance_schema.socket_summary_by_instance +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND EVENT_NAME LIKE '%client_connection'`) +{ + --enable_query_log + --enable_result_log + --echo # Error: The disconnected old default session did not disappear from + --echo # socket_summary_by_instance. + SELECT * FROM performance_schema.socket_summary_by_instance + WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND EVENT_NAME LIKE '%client_connection'; +} + +--echo # 1.2 Check the impact of TRUNCATE on socket_summary_by_instance. +--echo # It must reset all counters. +#======================================================================= +# We did a Connect and executed some statements within our new default session. +# This specific history must have caused that none of the counters within +# the client_connection for this session is 0. +# +# C_STAR TIMER_WAIT C_READ TIMER_READ BYTES_READ C_WRITE TIMER_WRITE BYTES_WRITE C_MISC TIMER_MISC +# 26 98238140 15 14874860 645 5 47217170 178 6 36146110 +# +# Ensure that the counters are <> 0 so that TRUNCATE has a visible effect. +let $my_rules= +COUNT_STAR > 0 AND SUM_TIMER_WAIT > 0 +AND +COUNT_READ > 0 AND SUM_TIMER_READ > 0 AND SUM_NUMBER_OF_BYTES_READ > 0 +AND +COUNT_WRITE > 0 AND SUM_TIMER_WRITE > 0 AND SUM_NUMBER_OF_BYTES_WRITE > 0 +AND +COUNT_MISC > 0 AND SUM_TIMER_MISC > 0; +if(`SELECT COUNT(*) FROM performance_schema.socket_summary_by_instance + WHERE NOT ( $my_rules ) + AND OBJECT_INSTANCE_BEGIN = @default_object_instance_begin`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + eval + SELECT + COUNT_STAR, SUM_TIMER_WAIT, + COUNT_READ, SUM_TIMER_READ, SUM_NUMBER_OF_BYTES_READ, + COUNT_WRITE, SUM_TIMER_WRITE, SUM_NUMBER_OF_BYTES_WRITE, + COUNT_MISC, SUM_TIMER_MISC + FROM performance_schema.socket_summary_by_instance + WHERE OBJECT_INSTANCE_BEGIN = @default_object_instance_begin; +} TRUNCATE TABLE performance_schema.socket_summary_by_instance; -TRUNCATE TABLE performance_schema.socket_summary_by_event_name; -# TRUNCATE TABLE performance_schema.socket_summary_by_instance; -# TRUNCATE TABLE performance_schema.socket_summary_by_event_name; -# sleep 3; -# SELECT * FROM performance_schema.socket_summary_by_instance -# WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin; -# SELECT * FROM performance_schema.socket_summary_by_instance; -# SELECT * FROM mysqltest.socket_summary_by_instance_detail; -# SELECT * FROM information_schema.processlist; -# SELECT * FROM performance_schema.threads; -# exit; ---disable_query_log +let $my_rules= +COUNT_STAR = 0 AND SUM_TIMER_WAIT = 0 +AND +COUNT_READ = 0 AND SUM_TIMER_READ = 0 AND SUM_NUMBER_OF_BYTES_READ = 0 +AND +COUNT_WRITE = 0 AND SUM_TIMER_WRITE = 0 AND SUM_NUMBER_OF_BYTES_WRITE = 0 +AND +COUNT_MISC = 0 AND SUM_TIMER_MISC = 0; +if(`SELECT COUNT(*) FROM performance_schema.socket_summary_by_instance + WHERE NOT ( $my_rules ) + AND OBJECT_INSTANCE_BEGIN = @default_object_instance_begin`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + eval + SELECT + COUNT_STAR, SUM_TIMER_WAIT, + COUNT_READ,SUM_TIMER_READ,SUM_NUMBER_OF_BYTES_READ, + COUNT_WRITE,SUM_TIMER_WRITE,SUM_NUMBER_OF_BYTES_WRITE, + COUNT_MISC,SUM_TIMER_MISC + FROM performance_schema.socket_summary_by_instance + WHERE OBJECT_INSTANCE_BEGIN = @default_object_instance_begin; +} ---echo # 1. Check the base line -#============================== +--echo # 1.3 Check the base line +#=============================== --source ../include/socket_summary_check.inc ---disable_query_log ---disable_query_log +# --disable_query_log +# --disable_query_log ---echo # 2. Check connect +--echo # 2. Variations on Connect let $is_connect= 1; --echo # 2.1 Connect fails because the user is unknown --echo # length of user name = 4 character @@ -328,16 +535,28 @@ let $connect_user= root0123456789; --source ../include/socket_event.inc DROP USER 'root0123456789'@'localhost'; +--echo # 2.7 Connect should pass, host = $my_localhost +--echo # length of user name = 4 character +--echo # length of default db = 9 character +--echo # connection runs through server_tcpip_socket ! #======================================================================== ---connect (con1,$my_localhost,root,,mysqltest,,) +let $connect_host= $my_localhost; +let $connect_db= mysqltest; +let $connect_user= root; +--source ../include/socket_event.inc + +#======================================================================== +--connect (con1,localhost,root,,mysqltest,,) --connection default --source ../include/wait_till_sleep.inc --disable_query_log -# MLML: Experiment -let $loop_rounds= 10; ---echo # 3 Check SELECTs -# Attention: Don't use any double quotes within the statements. +--echo # 3 Variations on SELECT +# Attention: Don't use +# - any double quotes within the statements because sourced scripts +# already "decorate" $variables with double quotes +# - UNION because this leads to result set related byte write +# counters which cannot good compared to select without union let $is_connect= 0; eval $get_object_instance_begin; --echo # 3.1 Check a SELECT ending with server sending an error message. @@ -346,108 +565,138 @@ eval $get_object_instance_begin; let $statement= SELECT col2 FROM does_not_exist; --source ../include/socket_event.inc ---echo # 3.2 Check a SELECT ending with server sending an error message. +--echo # 3.2 SELECT ending with server sending an error message. --echo # Now the statement is a bit longer but the error message --echo # length does again not depend on statement. #======================================================================= let $statement= SELECT col2 FROM does_not_exist WHERE col1 = 0; --source ../include/socket_event.inc ---echo # 3.3 Check a SELECT ending with server sending an error message. +--echo # 3.3 SELECT ending with server sending an error message. --echo # The statement has the same length like in 3.2 but the error --echo # message is now different and much longer. #======================================================================= let $statement= SELECT col2 FROM does_not_exist WHERE col1 A 0; --source ../include/socket_event.inc ---echo # 3.4 Check a SELECT ending with server sending an error message. +--echo # 3.4 SELECT ending with server sending an error message. --echo # Statement and error message are a bit longer than in 3.1 --echo # because the table name is longer. #======================================================================= let $statement= SELECT col2 FROM does_not_exist0123; --source ../include/socket_event.inc ---echo # 3.5 Check a SELECT earning an empty result set. +--echo # 3.5 SELECT earning an empty result set. #======================================================= -let $statement= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 0; +let $statement= SELECT col2 FROM mysqltest.my_aux WHERE col1 = -1; --source ../include/socket_event.inc ---echo # 3.6 Check a SELECT earning an empty result set. +--echo # 3.6 SELECT earning an empty result set. --echo # Short column name is replaced by longer alias. #========================================================== -let $statement= SELECT col2 AS my_lovely_col FROM mysqltest.my_aux WHERE col1 = 0; +let $statement= SELECT col2 AS my_super_col FROM mysqltest.my_aux WHERE col1 = -1; --source ../include/socket_event.inc ---echo # 3.7 Check a SELECT earning one row with an empty string. +--echo # 3.7 SELECT earning one row with an empty string. #================================================================ let $statement= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; --source ../include/socket_event.inc ---echo # 3.8 Check a SELECT earning one row with one string one char long. +--echo # 3.8 SELECT earning one row with one string one char long. #========================================================================= let $statement= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 2; --source ../include/socket_event.inc ---echo # 3.9 Check a SELECT earning one row with one string 1024 char long. +--echo # 3.9 SELECT earning one row with one string 1024 char long. #========================================================================== let $statement= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3; --source ../include/socket_event.inc ---echo # 3.10 Check a SELECT earning two rows with an empty string +--echo # 3.10 SELECT earning two rows with an empty string #========================================================================== -let $statement= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -UNION ALL -SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; ---source ../include/socket_event.inc - -let $statement= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -UNION DISTINCT -SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; +let $statement= SELECT col2 FROM mysqltest.my_aux WHERE col1 < 2; --source ../include/socket_event.inc -let $statement= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3 -UNION ALL -SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3; ---source ../include/socket_event.inc - -let $statement= SELECT col2 FROM mysqltest.my_aux WHERE col1 < 3; ---source ../include/socket_event.inc - ---echo # 4. Check delta details +--echo # 3.11 Check that the preceding Connects/SQL command runs have not +--echo # caused some unexpected state. #========================================================================== -# 4.0 0. Negative deltas cannot have happened because the counter columns within +let $my_rules= COUNT(*) = 2; +let $part= +FROM performance_schema.threads +WHERE NAME LIKE '%one_connection'; +if(`SELECT NOT ( $my_rules ) $part `) +{ + --echo # ERROR: There must be only two user connections + eval + SELECT * $part; + --echo # abort + exit; +} +let $part= +FROM performance_schema.socket_summary_by_instance +WHERE EVENT_NAME LIKE '%client_connection'; +if(`SELECT NOT ( $my_rules ) $part `) +{ + --echo # ERROR: There must be only two instances with this EVENT_NAME. + eval + SELECT * $part; + --echo # abort + exit; +} +let $my_rules= COUNT(*) = 1; +let $part= +FROM performance_schema.socket_summary_by_instance +WHERE EVENT_NAME LIKE '%server_unix_socket'; +if(`SELECT NOT ( $my_rules ) $part `) +{ + --echo # ERROR: There must be only one instance with this EVENT_NAME. + eval + SELECT * $part; + --echo # abort + exit; +} +let $part= +FROM performance_schema.socket_summary_by_instance +WHERE EVENT_NAME LIKE '%server_tcpip_socket'; +if(`SELECT NOT ( $my_rules ) $part `) +{ + --echo # ERROR: There must be only one instance with this EVENT_NAME. + eval + SELECT * $part; + --echo # abort + exit; +} + +--echo # 4. Check delta (value_after_action - value_before_action) details +# 4.0 . Negative deltas cannot have happened because the counter columns within # socket_summary_by_instance_detail are defined as UNSIGNED BIGINT. # = The INSERT which computes the diff would have been failed. --echo # 4.1 Check that ---echo # - increased COUNT_* leads to increased ---echo # SUM_TIMER_* and SUM_NUMBER_OF_BYTES_* --echo # - no change in COUNT_* leads to no change in ---echo # SUM_TIMER_* and SUM_NUMBER_OF_BYTES_* - +--echo # SUM_TIMER_* and no change in SUM_NUMBER_OF_BYTES_* +--echo # - increased COUNT_READ leads to increased +--echo # SUM_TIMER_READ and SUM_NUMBER_OF_BYTES_READ +--echo # - increased COUNT_WRITE leads to increased +--echo # SUM_TIMER_READ and SUM_NUMBER_OF_BYTES_READ +--echo # - increased COUNT_MISC leads to increased +--echo # SUM_TIMER_MISC +--echo # Attention: There are exceptions but they are not valid +--echo # for this test. +#========================================================================== let $my_rules= -((COUNT_READ = 0 AND SUM_TIMER_READ = 0 AND SUM_NUMBER_OF_BYTES_READ = 0) +((COUNT_READ = 0 AND SUM_TIMER_READ = 0 AND SUM_NUMBER_OF_BYTES_READ = 0) OR - (COUNT_READ > 0 AND SUM_TIMER_READ > 0 AND SUM_NUMBER_OF_BYTES_READ > 0) - OR - (COUNT_READ > 0 AND SUM_TIMER_READ = 0 AND SUM_NUMBER_OF_BYTES_READ > 0)) + (COUNT_READ > 0 AND SUM_TIMER_READ > 0 AND SUM_NUMBER_OF_BYTES_READ > 0)) AND ((COUNT_WRITE = 0 AND SUM_TIMER_WRITE = 0 AND SUM_NUMBER_OF_BYTES_WRITE = 0) OR (COUNT_WRITE > 0 AND SUM_TIMER_WRITE > 0 AND SUM_NUMBER_OF_BYTES_WRITE > 0)) AND -((COUNT_MISC = 0 AND SUM_TIMER_MISC = 0) - OR - (COUNT_MISC > 0 AND SUM_TIMER_MISC > 0) +((COUNT_MISC = 0 AND SUM_TIMER_MISC = 0) OR - (COUNT_MISC > 0 AND SUM_TIMER_MISC = 0)); - -# In case of SQL statements and the instance for the connection which runs the -# statement COUNT_MISC is 1 AND SUM_TIMER_MISC is 0 !! -# MLML: Ask Chris, if this is really correct. - +(COUNT_MISC > 0 AND SUM_TIMER_MISC > 0)); if(`SELECT COUNT(*) FROM mysqltest.socket_summary_by_instance_detail - WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin - AND NOT ( $my_rules )`) + WHERE NOT ( $my_rules ) `) { --enable_query_log --enable_result_log @@ -456,46 +705,44 @@ if(`SELECT COUNT(*) FROM mysqltest.socke --echo # $my_rules --echo # eval - SELECT EVENT_NAME, LPAD(OBJECT_INSTANCE_BEGIN,20,' ') AS OBJECT_INSTANCE, - LPAD(COUNT_READ,7,' ') AS CREAD, LPAD(SUM_TIMER_READ,12,' ') AS TREAD, LPAD(SUM_NUMBER_OF_BYTES_READ,7,' ') AS BREAD, - LPAD(COUNT_WRITE,7,' ') AS CWRITE, LPAD(SUM_TIMER_WRITE,12,' ') AS TWRITE,LPAD(SUM_NUMBER_OF_BYTES_WRITE,7,' ') AS BWRITE, - LPAD(COUNT_MISC,7,' ') AS CMISC, LPAD(SUM_TIMER_MISC,13,' ') AS TMISC, - RPAD(statement,50,' ') AS STATEMENT, LPAD(run, 5, ' ') AS RUN + SELECT + $column_list FROM mysqltest.socket_summary_by_instance_detail WHERE NOT ( $my_rules ) - ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN; + ORDER BY EVENT_NAME, OBJECT_INSTANCE, STATEMENT, RUN; } --echo # 4.2 Results must be stable ---echo # Everything except "client_connection" for default connection ---echo # because the default connection runs include/wait_till_sleep.inc ---echo # which means a varying amount of statements. #========================================================================== -# This check might fail after the bug fixes # Enable the following lines for debugging the check -# UPDATE mysqltest.socket_summary_by_instance_detail -# SET COUNT_READ = 13 -# WHERE statement LIKE 'Connect%abc%' -# AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin -# LIMIT 1; -# UPDATE mysqltest.socket_summary_by_instance_detail -# SET COUNT_WRITE = 13 -# WHERE statement LIKE '%WHERE col1 = 3' -# AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin -# AND EVENT_NAME LIKE '%client_connection' -# LIMIT 1; +if(0) +{ + --enable_info + UPDATE mysqltest.socket_summary_by_instance_detail + SET COUNT_WRITE = 13 + WHERE statement LIKE '%WHERE col1 = 3' + AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND EVENT_NAME LIKE '%client_connection' + LIMIT 1; + --disable_info +} -# MLML: IMHO the most reasonable rule +# eval +# SELECT +# $column_list +# FROM mysqltest.socket_summary_by_instance_detail +# WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin +# ORDER BY EVENT_NAME, statement,run; + +# In case we are able to wait all time till perfschema has finished the +# maintenance of counters than the following must be valid. let $my_rules= -COUNT(DISTINCT COUNT_READ) = 1 AND COUNT(DISTINCT SUM_NUMBER_OF_BYTES_READ) = 1 AND COUNT(DISTINCT COUNT_WRITE) = 1 AND -COUNT(DISTINCT SUM_NUMBER_OF_BYTES_WRITE) = 1 AND -COUNT(DISTINCT COUNT_MISC) = 1; +COUNT(DISTINCT SUM_NUMBER_OF_BYTES_WRITE) = 1; -# Comment(ML): -# In case we do not get the results somehow deterministic than we -# we should go with the less strict check based on CV. +# In case we do not get the results somehow deterministic than we +# we should go with the less strict check based on CV. # # Compute coefficient of variation (CV) to detect 'notable' variances in the # byte count and operation counts. The acceptable range for the CV is purely @@ -512,8 +759,7 @@ let $part= FROM mysqltest.socket_summary_by_instance_detail WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin GROUP BY EVENT_NAME, statement -HAVING ($my_rules) <> 1; - +HAVING NOT ($my_rules) ; if(`SELECT COUNT(statement) $part`) { --enable_query_log @@ -522,53 +768,138 @@ if(`SELECT COUNT(statement) $part`) --echo # We expect --echo # $my_rules --echo # for GROUP BY EVENT_NAME, statement - select @default_object_instance_begin as 'Default Object Instance'; - # eval - # SELECT EVENT_NAME, statement - # $part - # ORDER BY EVENT_NAME, statement; + eval + SELECT $column_list + FROM mysqltest.socket_summary_by_instance_detail + WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND (EVENT_NAME, statement) + IN (SELECT EVENT_NAME, statement + $part) + ORDER BY EVENT_NAME, statement, run, OBJECT_INSTANCE_BEGIN; +} - --echo MLML: Experiment +--echo # 4.3 Counters must be 0 in client_connection for the default session +--echo # Instrumenting is disabled since a long time and the counter were +--echo # reset via TRUNCATE just after the disabling. +#========================================================================== +let $my_rules= +COUNT_STAR = 0 AND SUM_TIMER_WAIT = 0 +AND +COUNT_READ = 0 AND SUM_TIMER_READ = 0 AND SUM_NUMBER_OF_BYTES_READ = 0 +AND +COUNT_WRITE = 0 AND SUM_TIMER_WRITE = 0 AND SUM_NUMBER_OF_BYTES_WRITE = 0 +AND +COUNT_MISC = 0 AND SUM_TIMER_MISC = 0; +if(`SELECT COUNT(*) FROM performance_schema.socket_summary_by_instance + WHERE NOT ( $my_rules ) + AND OBJECT_INSTANCE_BEGIN = @default_object_instance_begin`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + # MLML: Try $column_list eval - SELECT EVENT_NAME, statement, - $my_rules AS my_col - $part - ORDER BY EVENT_NAME, statement; + SELECT + COUNT_STAR, SUM_TIMER_WAIT, + COUNT_READ,SUM_TIMER_READ,SUM_NUMBER_OF_BYTES_READ, + COUNT_WRITE,SUM_TIMER_WRITE,SUM_NUMBER_OF_BYTES_WRITE, + COUNT_MISC,SUM_TIMER_MISC + FROM performance_schema.socket_summary_by_instance + WHERE OBJECT_INSTANCE_BEGIN = @default_object_instance_begin; +} - # eval - # SELECT * FROM mysqltest.socket_summary_by_instance_detail - # WHERE EVENT_NAME, statement IN - # (SELECT EVENT_NAME, statement - # $part) - # ORDER BY EVENT_NAME, statement; +#--------------------------------------------------------------------------- +--echo # 4.4 Check the differences caused by SQL statements +--echo # 4.4.1 There must be no changes in counters of instances +--echo # NOT LIKE '%client_connection' because everything gets charged +--echo # into client_connection of the acting connection. +#=========================================================================== +let $my_rules= +COUNT_READ = 0 AND SUM_TIMER_READ = 0 AND SUM_NUMBER_OF_BYTES_READ = 0 +AND +COUNT_WRITE = 0 AND SUM_TIMER_WRITE = 0 AND SUM_NUMBER_OF_BYTES_WRITE = 0 +AND +COUNT_MISC = 0 AND SUM_TIMER_MISC = 0; +if(`SELECT COUNT(*) FROM mysqltest.socket_summary_by_instance_detail + WHERE NOT ( $my_rules ) + AND EVENT_NAME NOT LIKE '%client_connection' + AND statement NOT LIKE 'Connect%'`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # eval - SELECT object_instance_begin, $counter_column_list, EVENT_NAME, statement, run - FROM mysqltest.socket_summary_by_instance_detail t1 - WHERE (EVENT_NAME, statement) IN - (SELECT EVENT_NAME, statement $part) - AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin - ORDER BY EVENT_NAME, statement, run; + SELECT + $column_list + FROM mysqltest.socket_summary_by_instance_detail + WHERE NOT ( $my_rules ) + AND EVENT_NAME NOT LIKE '%client_connection' + AND statement NOT LIKE 'Connect%' + ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN, statement, run; +} - --echo Debug 4.2a - Dump mysqltest.socket_summary_by_instance_detail - SELECT EVENT_NAME, LPAD(OBJECT_INSTANCE_BEGIN,20,' ') AS OBJECT_INSTANCE, - LPAD(COUNT_READ,7, ' ') AS CREAD, LPAD(SUM_TIMER_READ,12,' ') AS TREAD, LPAD(SUM_NUMBER_OF_BYTES_READ,7,' ') AS BREAD, - LPAD(COUNT_WRITE,7, ' ') AS CWRITE, LPAD(SUM_TIMER_WRITE,12,' ') AS TWRITE,LPAD(SUM_NUMBER_OF_BYTES_WRITE,7,' ') AS BWRITE, - LPAD(COUNT_MISC,7,' ') AS CMISC, LPAD(SUM_TIMER_MISC,13,' ') AS TMISC, - RPAD(statement,50,' ') AS STATEMENT, LPAD(run, 5, ' ') AS RUN - FROM mysqltest.socket_summary_by_instance_detail ORDER BY EVENT_NAME, statement, run; - - --echo Debug 4.2b - Std dev and coefficient of variation for mysqltest.socket_summary_by_instance_detail - select rpad(EVENT_NAME,39,' ') as EVENT_NAME1, rpad(statement,49,' ') as STATEMENT1, - lpad(count(COUNT_READ),5,' ') as COUNT_READ, - lpad(std(COUNT_READ)/avg(COUNT_READ),10,' ') as CV_COUNT_READ, - lpad(std(SUM_NUMBER_OF_BYTES_READ)/avg(SUM_NUMBER_OF_BYTES_READ),10,' ') as CV_BYTES_READ, - lpad(std(COUNT_WRITE)/avg(COUNT_WRITE),10,' ') as CV_COUNT_WRITE, - lpad(std(SUM_NUMBER_OF_BYTES_WRITE)/avg(SUM_NUMBER_OF_BYTES_WRITE),10,' ') as CV_BYTES_WRITE, - lpad(std(COUNT_MISC)/avg(COUNT_MISC),10,' ') as CV_COUNT_MISC - from mysqltest.socket_summary_by_instance_detail +--echo # 4.4.2 In case of SELECT and our scenarios even COUNT_READ and COUNT_MISC +--echo # are stable. +let $my_rules= +COUNT(DISTINCT COUNT_READ) = 1 AND +COUNT(DISTINCT COUNT_MISC) = 1; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND statement NOT LIKE '%Connect%' +GROUP BY EVENT_NAME, statement +HAVING NOT ($my_rules) ; +if(`SELECT COUNT(statement) $part`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # for GROUP BY EVENT_NAME, statement + eval + SELECT $column_list + FROM mysqltest.socket_summary_by_instance_detail WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin - group by EVENT_NAME1, STATEMENT1; + AND (EVENT_NAME, statement) + IN (SELECT EVENT_NAME, statement + $part) + ORDER BY EVENT_NAME, statement, run, OBJECT_INSTANCE_BEGIN; +} + +--echo # 4.4.3 In our testing scenarios we get for the client_connection entry +--echo # of the acting connection +--echo # -> OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin +--echo # COUNT_MISC = 0 AND SUM_TIMER_MISC = 0 +#=========================================================================== +let $my_rules= +COUNT_MISC = 0 AND SUM_TIMER_MISC = 0; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE NOT ( $my_rules ) + AND EVENT_NAME LIKE '%client_connection' + AND statement NOT LIKE 'Connect%' + AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin; +if(`SELECT COUNT(*) $part`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + eval + SELECT + $column_list + $part + ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN, statement, run; } # Initialize variables @@ -576,13 +907,13 @@ let $my_rules= my_rules_not_set; let $stmt1= stmt1_not_set; let $stmt2= stmt2_not_set; # $title_prefix is used for the generation of titles -let $title_prefix= 4.3; +let $title_prefix= 4.4; # $check_num is used for the generation of titles and gets incremented after # every call of the current script. -let $check_num= 1; +let $check_num= 4; # $column_list is used for the generation of error information and valid for # every sub test. -let $column_list= +let $diff_column_list= t2.COUNT_READ - t1.COUNT_READ AS D_COUNT_READ, t2.COUNT_READ AS S2_COUNT_READ, t1.COUNT_READ AS S1_COUNT_READ, @@ -592,7 +923,7 @@ t1.SUM_NUMBER_OF_BYTES_READ t2.COUNT_WRITE - t1.COUNT_WRITE AS D_COUNT_WRITE, t2.COUNT_WRITE AS S2_COUNT_WRITE, t1.COUNT_WRITE AS S1_COUNT_WRITE, -t2.SUM_NUMBER_OF_BYTES_WRITE - t1.SUM_NUMBER_OF_BYTES_WRITE AS D_UM_NUMBER_OF_BYTES_WRITE, +t2.SUM_NUMBER_OF_BYTES_WRITE - t1.SUM_NUMBER_OF_BYTES_WRITE AS D_SUM_NUMBER_OF_BYTES_WRITE, t2.SUM_NUMBER_OF_BYTES_WRITE AS S2_SUM_NUMBER_OF_BYTES_WRITE, t1.SUM_NUMBER_OF_BYTES_WRITE AS S1_SUM_NUMBER_OF_BYTES_WRITE, t2.COUNT_MISC - t1.COUNT_MISC AS D_COUNT_MISC, @@ -608,7 +939,10 @@ WHERE OBJECT_INSTANCE_BEGIN <> @default_ AND EVENT_NAME LIKE ('%client_connection') AND run = 1; ---echo # $title_prefix Check the differences caused by SQL statements +--echo # Check the differences between changes caused by SQL statements +--echo # These differences must correspond to parameters like +--echo # - statement, table name or column name length +--echo # - number of rows in result set, size of rows in result set etc. # --> Statement NOT LIKE '%Connect%' let stmt1= SELECT col2 FROM does_not_exist; @@ -619,6 +953,9 @@ let stmt2= SELECT col2 FROM does_not_exi # 3 51 1 59 1 SELECT col2 FROM does_not_exist WHERE col1 = 0 # The string of the statement gets charged into SUM_NUMBER_OF_BYTES_READ. # The server error message gets charged into SUM_NUMBER_OF_BYTES_WRITE. +let $msg= +# One statement is longer than the other. +# Both statements fail with the same error message (table does not exist); # let $my_rules= t2.COUNT_READ - t1.COUNT_READ = 0 AND @@ -634,8 +971,9 @@ let $stmt2= SELECT col2 FROM does_not_ex # CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement # 3 51 1 59 1 SELECT col2 FROM does_not_exist WHERE col1 = 0 # 3 51 1 162 1 SELECT col2 FROM does_not_exist WHERE col1 A 0 -# Both statements have the same length and fail. But the second statement -# caused a longer error message. +let $msg= +# Both statements have the same length and fail. +# The length of the error messages differs.; let $my_rules= t2.COUNT_READ - t1.COUNT_READ = 0 AND t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt2') - LENGTH('$stmt1') AND @@ -649,7 +987,10 @@ let $stmt2= SELECT col2 FROM does_not_ex # CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement # 3 36 1 59 1 SELECT col2 FROM does_not_exist # 3 40 1 63 1 SELECT col2 FROM does_not_exist0123 -# Statements differ in table name length and table name is part of error message. +let $msg= +# Both statements fail (table does not exist). +# The length of the statement and the length of the error messages differs. +# Reason for both differences is the length of the table name.; let $my_rules= t2.COUNT_READ - t1.COUNT_READ = 0 AND t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt2') - LENGTH('$stmt1') AND @@ -658,40 +999,49 @@ t2.SUM_NUMBER_OF_BYTES_WRITE - t1.SUM_NU t2.COUNT_MISC - t1.COUNT_MISC = 0; --source ../include/socket_check1.inc -# How to enforce the debug info is printed? +# Assuming that some new check should be added. +# How to enforce that a lot info is printed so that it becomes easy to derive +# the right value for $my_rules? +#---------------------------------------------------------------------------- # let $my_rules= 0; -# This will cause that suite/perfschema/include/socket_check1.inc conclude that -# check failed and it will print debug information. +# This will cause that suite/perfschema/include/socket_check1.inc concludes that +# the check via $my_rules failed and it will print debug information. # let $stmt1= SELECT col2 FROM does_not_exist WHERE col1 = 0; # let $stmt2= SELECT col2 FROM does_not_exist WHERE col1 A 0; # let $my_rules= 0; # --source ../include/socket_check1.inc -let $stmt2= SELECT col2 AS my_lovely_col FROM mysqltest.my_aux WHERE col1 = 0; -let $stmt1= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 0; +let $stmt2= SELECT col2 AS my_super_col FROM mysqltest.my_aux WHERE col1 = -1; +let $stmt1= SELECT col2 FROM mysqltest.my_aux WHERE col1 = -1; +# # CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement -# 3 53 1 78 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 0 -# 3 70 1 87 1 SELECT col2 AS my_lovely_col FROM mysqltest.my_aux WHERE col1 = 0 -# Both statements get an empty result set. But the length of the statements and -# the result set column names differs. +# 3 54 1 78 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = -1 +# 3 70 1 86 1 SELECT col2 AS my_super_col FROM mysqltest.my_aux WHERE col1 = -1 +let $msg= +# Both statements get an empty result set. +# The length of the statements and the length of the result sets differs. +# Reason for both differences is the length of the some column name.; let $my_rules= t2.COUNT_READ - t1.COUNT_READ = 0 AND t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt2') - LENGTH('$stmt1') AND t2.COUNT_WRITE - t1.COUNT_WRITE = 0 AND -t2.SUM_NUMBER_OF_BYTES_WRITE - t1.SUM_NUMBER_OF_BYTES_WRITE = LENGTH('my_lovely_col') - LENGTH('col2') AND +t2.SUM_NUMBER_OF_BYTES_WRITE - t1.SUM_NUMBER_OF_BYTES_WRITE = LENGTH('my_super_col') - LENGTH('col2') AND t2.COUNT_MISC - t1.COUNT_MISC = 0; --source ../include/socket_check1.inc let $stmt2= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; -let $stmt1= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 0; +let $stmt1= SELECT col2 FROM mysqltest.my_aux WHERE col1 = -1; +# # CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement -# 3 53 1 78 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 0 -# 3 53 1 83 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# stmt1 gets an empty result set -# stmt1 gets one row containing an empty result string +# t1 3 54 1 78 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = -1 +# t2 3 53 1 83 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 +let $msg= +# Both statements differ in the statement length. +# One statement earns an empty result set. +# The other statement earns one row containing an empty string.; let $my_rules= t2.COUNT_READ - t1.COUNT_READ = 0 AND -t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt2') - LENGTH('$stmt1') AND +t1.SUM_NUMBER_OF_BYTES_READ - t2.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt1') - LENGTH('$stmt2') AND t2.COUNT_WRITE - t1.COUNT_WRITE = 0 AND t2.SUM_NUMBER_OF_BYTES_WRITE - t1.SUM_NUMBER_OF_BYTES_WRITE > 0 AND t2.COUNT_MISC - t1.COUNT_MISC = 0; @@ -699,11 +1049,14 @@ t2.COUNT_MISC - t1.COUNT_ let $stmt2= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 2; let $stmt1= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; +# # CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement # 3 53 1 83 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 # 3 53 1 84 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 2 -# stmt2 one row containing a string 1 byte long -# stmt1 one row containing an empty string +let $msg= +# Both statements have the same length. +# One statement earns an one row containing an empty string. +# The other statement earns one row containing a string 1 byte long.; let $my_rules= t2.COUNT_READ - t1.COUNT_READ = 0 AND t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt2') - LENGTH('$stmt1') AND @@ -714,193 +1067,414 @@ t2.COUNT_MISC - t1.COUNT_ let $stmt2= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3; let $stmt1= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; +# # CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement # 3 53 1 83 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 # 3 53 1 1109 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3 -# stmt2 one row containing a string 1024 byte long -# stmt1 one row containing an empty string +let $msg= +# Both statements have the same length. +# One statement earns an one row containing an empty string. +# The other statement earns one row containing a string 1024 byte long.; let $my_rules= t2.COUNT_READ - t1.COUNT_READ = 0 AND t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt2') - LENGTH('$stmt1') AND t2.COUNT_WRITE - t1.COUNT_WRITE = 0 AND -t2.SUM_NUMBER_OF_BYTES_WRITE - t1.SUM_NUMBER_OF_BYTES_WRITE = 1024 + 2 AND +t2.SUM_NUMBER_OF_BYTES_WRITE - t1.SUM_NUMBER_OF_BYTES_WRITE >= 1024 AND t2.COUNT_MISC - t1.COUNT_MISC = 0; --source ../include/socket_check1.inc -#let $stmt2= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -#UNION ALL -#SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; -#let $stmt1= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; -# CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement -# 3 53 1 83 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# 3 112 1 67 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# UNION ALL -# SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# MLML: The BYTES_WRITE seem to be wrong. -#let $my_rules= 0; -#--source ../include/socket_check1.inc - -#let $stmt2= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -#UNION DISTINCT -#SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; -#let $stmt1= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; -# CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement -# 3 53 1 83 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# 3 117 1 62 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# UNION DISTINCT -# SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# MLML: The BYTES_WRITE seem to be wrong. -#let $my_rules= 0; -#--source ../include/socket_check1.inc - -#let $stmt2= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3 -#UNION ALL -#SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3; -#let $stmt1= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3; -# CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement -# 3 53 1 1109 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3 -# 3 112 1 2119 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3 -# UNION ALL -# SELECT col2 FROM mysqltest.my_aux WHERE col1 = 3 -#let $my_rules= 0; -#--source ../include/socket_check1.inc - -let $stmt2= SELECT col2 FROM mysqltest.my_aux WHERE col1 < 3; +let $stmt2= SELECT col2 FROM mysqltest.my_aux WHERE col1 < 2; let $stmt1= SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1; -# CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement -# 3 53 1 83 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 -# 3 53 1 89 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 < 3 -# stmt2 Gives one row with string 1 byte long and one row with an empty string. -# stmt1 Gives one row with an empty string. -# BYTES_WRITE might be ok here. -#let $my_rules= 0; -#--source ../include/socket_check1.inc +# +# CNT_READ BYTES_READ CNT_WRITE BYTES_WRITE CNT_MISC statement +# t1 3 53 1 83 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 = 1 +# t2 3 53 1 88 1 SELECT col2 FROM mysqltest.my_aux WHERE col1 < 2 +let $msg= +# Both statements have the same length. +# One statement earns an one row containing an empty string. +# The other statement earns two rows containing an empty string.; +let $my_rules= +t2.COUNT_READ - t1.COUNT_READ = 0 AND +t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt2') - LENGTH('$stmt1') AND +t2.COUNT_WRITE - t1.COUNT_WRITE = 0 AND +t2.SUM_NUMBER_OF_BYTES_WRITE - t1.SUM_NUMBER_OF_BYTES_WRITE > 0 AND +t2.COUNT_MISC - t1.COUNT_MISC = 0; +--source ../include/socket_check1.inc -if(0) +--echo # 4.5 Check the differences caused by Connects +--echo # Attention: Succesful Connects run an additional "DO 1". +--echo # 4.5.1 Connects do not charge anything into READ or WRITE counters +--echo # of the instance with EVENT_NAME NOT LIKE ('%client_connection%'). +--echo # This mean all these counters must be 0. +let $my_rules= +COUNT_READ = 0 AND SUM_TIMER_READ = 0 AND SUM_NUMBER_OF_BYTES_READ = 0 AND +COUNT_WRITE = 0 AND SUM_TIMER_WRITE = 0 AND SUM_NUMBER_OF_BYTES_WRITE = 0; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND statement LIKE ('%Connect%') + AND EVENT_NAME NOT LIKE ('%client_connection%') + AND NOT ( $my_rules ); +if(`SELECT COUNT(*) $part `) { ---echo # 4.3 Check the connects ---echo # 4.3.1 Successful connects with different length of user name -# --> t2.statement LIKE 'Connect%root0123456789,%' -# --> t1.statement LIKE 'Connect%root012345,%' -# There is no client_connection entry for a connect which fails. - -let $my_val= -t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ, -t2.SUM_NUMBER_OF_BYTES_WRITE - t1.SUM_NUMBER_OF_BYTES_WRITE; -# t2.COUNT_WRITE - t1.COUNT_WRITE, -# t2.COUNT_READ - t1.COUNT_READ, -# t2.COUNT_MISC - t1.COUNT_MISC; - -# Successful connections with different username lengths -eval -SELECT $my_val, EVENT_NAME -FROM mysqltest.socket_summary_by_instance_detail t2 -JOIN mysqltest.socket_summary_by_instance_detail t1 -USING (EVENT_NAME,run) -WHERE t2.OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin - AND t1.OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin - AND t2.statement LIKE 'Connect%root0123456789,%' - AND t1.statement LIKE 'Connect%root012345,%' - AND t1.EVENT_NAME LIKE '%client_connection%' - AND run = 1; + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + eval + SELECT + $column_list + $part; +} -#eval -#SELECT $counter_column_list, EVENT_NAME -#FROM mysqltest.socket_summary_by_instance_detail t2 -#WHERE t2.statement LIKE 'Connect%root0123456789,%' -# AND run = 1; - -#eval -#SELECT $counter_column_list, EVENT_NAME -#FROM mysqltest.socket_summary_by_instance_detail t2 -#WHERE t2.OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin -# AND t2.statement LIKE 'Connect%root0123456789,%' -# AND run = 1; - -#eval -#SELECT $counter_column_list, EVENT_NAME -#FROM mysqltest.socket_summary_by_instance_detail t1 -#WHERE t1.OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin -# AND t1.statement LIKE 'Connect%root012345,%' -# AND run = 1; -} - ---echo # 4.3.2 Failing (->2.1) vs. passing (-> 2.3) connect ---echo # FIXME: To be implemented after the bug fixes -# The difference in fail/pass must somewhere show up. -#========================================================================== +--echo # 4.5.2 Connects using for host the value 'localhost' +--echo # 4.5.2.1 For the instance with EVENT_NAME LIKE '%server_tcpip_socket' +--echo # COUNT_MISC = 0 AND SUM_TIMER_MISC = 0 must be valid +--echo # because we run through server_unix_socket. +#=========================================================================== +let $my_rules= +COUNT_MISC = 0 AND SUM_TIMER_MISC = 0; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND statement LIKE ('%Connect%localhost%') + AND EVENT_NAME LIKE ('%server_tcpip_socket%') + AND NOT ( $my_rules ); +if(`SELECT COUNT(*) $part `) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + eval + SELECT + $column_list + $part; +} ---echo # 4.3.3 2.3 vs. 2.4 ---echo # FIXME: To be implemented after the bug fixes -# The difference in schema name length must somewhere show up. -#========================================================================== +--echo # 4.5.2.2 For the instance with EVENT_NAME LIKE '%server_unix_socket' +--echo # COUNT_MISC > 0 AND SUM_TIMER_MISC > 0 must be valid. +#=========================================================================== +let $my_rules= +COUNT_MISC > 0 AND SUM_TIMER_MISC > 0; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND statement LIKE ('%Connect%localhost%') + AND EVENT_NAME LIKE ('%server_unix_socket%') + AND NOT ( $my_rules ); +if(`SELECT COUNT(*) $part `) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + eval + SELECT + $column_list + $part; +} +--echo # 4.5.3 Connects using for host a value <> 'localhost' +--echo # 4.5.3.1 For the instance with EVENT_NAME LIKE '%server_unix_socket' +--echo # COUNT_MISC = 0 AND SUM_TIMER_MISC = 0 must be valid +--echo # because we run through server_tcpip_socket. +#=========================================================================== +let $my_rules= +COUNT_MISC = 0 AND SUM_TIMER_MISC = 0; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND statement LIKE ('%Connect%$my_localhost%') + AND EVENT_NAME LIKE ('%server_unix_socket%') + AND NOT ( $my_rules ); +if(`SELECT COUNT(*) $part `) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + eval + SELECT + $column_list + $part; +} +--echo # 4.5.3.2 For the instance with EVENT_NAME LIKE '%server_tcpip_socket' +--echo # COUNT_MISC > 0 AND SUM_TIMER_MISC > 0 must be valid. +#=========================================================================== +let $my_rules= +COUNT_MISC > 0 AND SUM_TIMER_MISC > 0; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND statement LIKE ('%Connect%$my_localhost%') + AND EVENT_NAME LIKE ('%server_tcpip_socket%') + AND NOT ( $my_rules ); +if(`SELECT COUNT(*) $part `) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + eval + SELECT + $column_list + $part; +} ---echo # 4.4 Check the differences caused by SQL statements -# --> Statement NOT LIKE '%Connect%' ---echo # FIXME: To be implemented after the bug fixes +--echo # 4.5.4 Failing Connects do not cause any row with EVENT_NAME +--echo # LIKE '%client_connection' +#=========================================================================== +# Debug: Try with LIKE 'Connect%root%' +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND statement LIKE ('Connect%boot%') + AND EVENT_NAME LIKE ('%client_connection'); +if(`SELECT COUNT(*) $part`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect that there are no rows because + --echo # - failing connects do not cause a row with "client_connection" + --echo # - all failing connects contain a user name LIKE '%boot%' + eval + SELECT + $column_list + $part; +} -# General architecture for checking stuff: +--echo # 4.5.5 Successful Connects cause a new instance with EVENT_NAME +--echo # LIKE '%client_connection' +#=========================================================================== +# MLML: Is checked +# - connects which should be successful have statement LIKE ('Connect%root%'). +# - We try every type of Connect $loop_rounds times. +# Therefore we should find $loop_rounds rows with +# - EVENT_NAME LIKE ('%client_connection') +# AND +# - OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin +# We do not want to count the entry of belonging to the default connection. +# AND +# - statement LIKE ('Connect%root%') +# The connects which should be successful. # -# let $my_rules= -# COUNT_READ = 0 AND -# SUM_TIMER_READ = 0 AND -# SUM_NUMBER_OF_BYTES_READ = 0 AND -# COUNT_WRITE BETWEEN 1 AND 3 AND -# SUM_TIMER_WRITE > 0 AND -# SUM_NUMBER_OF_BYTES_WRITE BETWEEN 1 AND 1000 AND -# COUNT_MISC = 0 AND -# SUM_TIMER_MISC = 0; -# -# let $part= +let $my_rules= +COUNT(*) = $loop_rounds; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE EVENT_NAME LIKE ('%client_connection') + AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND statement LIKE ('Connect%root%') +GROUP BY statement +HAVING NOT ( $my_rules ); + +# Reveal that the check that follows would catch anything: +# DELETE +# FROM mysqltest.socket_summary_by_instance_detail +# WHERE EVENT_NAME LIKE ('%client_connection') +# AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin +# AND statement LIKE ('Connect%root%') +# LIMIT 1; +# Attention: socket_summary_by_instance_detail is after that rotten. + +if(`SELECT COUNT(*) $part`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # for GROUP BY statement + --echo # + eval + SELECT + $column_list + FROM mysqltest.socket_summary_by_instance_detail + WHERE EVENT_NAME LIKE ('%client_connection') + AND OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND statement IN + (SELECT statement + $part); +} + +--echo # 4.6 Check the differences caused by Connects +--echo # - INSTANCES with an EVENT_NAME like server_tcpip_socket or +--echo # server_unix_socket are already checked +--echo # - the stability of results is already checked +--echo # So we con go with the results of the first run. + +# eval +# SELECT $column_list # FROM mysqltest.socket_summary_by_instance_detail # WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin -# GROUP BY EVENT_NAME, statement -# HAVING ($my_rules) <> 1; -# -# if(`Check if something is wrong, use $my_rules and $part here`) -# { -# --enable_query_log -# --enable_result_log -# --echo # The statistics looks suspicious. -# --echo # We expect -# --echo # $my_rules -# eval -# SELECT ..... -# } -# -# Rough idea for "Rules" for $my_rules: -# 1. Do not go with too exact values for the diffs between the diffs -# -# n = exact value measured today -# -# COUNT_READ in mysqltest.socket_summary_by_instance_detail -# means rather costs, -# difference between COUNT_READ after and before execution od connect/SQL -# -# diffdiff means differences in costs between two operations. -# Example: First operation = SELECT with length of column alias name = 1 Byte -# Second operation = Same SELECT but with length of column alias name = 11 Byte -# -# Generous for SUM_TIMER_* -# -> SUM_TIMER_READ = 0 -# -> SUM_TIMER_READ > 0 -# -# Fair strict for COUNT_* -# -> COUNT_READ = 0 -# -> COUNT_READ BETWEEN Minimum of(0.9 * n, n - 2) -# AND Maximum_of(1.1 * n, n + 2) -# -> diffdiffs often = 0 -# -# More strict for SUM_NUMBER_OF_BYTES_READ -# -> SUM_NUMBER_OF_BYTES_READ = 0 -# -> SUM_NUMBER_OF_BYTES_READ BETWEEN Minimum of(0.9 * n, n - 2) -# AND Maximum_of(1.1 * n, n + 2) -# -> SUM_NUMBER_OF_BYTES_READ BETWEEN Minimum of(0.9 * n, n - 2) -# -> diffdiffs = ~ diff in lenght of SQL command or diff in -# length of result set -# +# AND EVENT_NAME LIKE ('%client_connection') +# AND statement LIKE ('Connect%') +# AND run = 1 +# ORDER BY event_name,statement, run; +# CREAD TREAD BREAD CWRITE TWRITE BWRITE CMISC TMISC STATEMENT +# 4 6149616 79 3 34008480 117 3 38914128 Connect (con*,::ffff:127.0.0.1,root,,mysqltest,,) +# 4 7012368 84 3 10112256 117 2 43067376 Connect (con*,localhost,root,,mysqlsupertest,,) +# 4 7172880 79 3 10247688 117 2 40128000 Connect (con*,localhost,root,,mysqltest,,) +# 4 6706392 85 3 15509472 117 2 34851168 Connect (con*,localhost,root012345,,mysqltest,,) +# 4 10543632 89 3 10578744 117 2 39460872 Connect (con*,localhost,root0123456789,,mysqltest,,) + +--echo # 4.6.1 The SUM_OF_BYTES_WRITE value is the same for all Connects. +#======================================================================== +# MLML: Is checked +let $my_rules= COUNT(DISTINCT SUM_NUMBER_OF_BYTES_WRITE) = 1; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND EVENT_NAME LIKE ('%client_connection') + AND statement LIKE ('Connect%') + AND run = 1; +if(`SELECT NOT ( $my_rules) $part`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # for all Connects + --echo # + eval + SELECT + statement, SUM_NUMBER_OF_BYTES_WRITE + $part; +} + +--echo # 4.6.2 The SUM_OF_BYTES_WRITE value hast to be > 100. +#============================================================ +# MLML: Is checked +let $my_rules= SUM_NUMBER_OF_BYTES_WRITE > 100; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND EVENT_NAME LIKE ('%client_connection') + AND statement LIKE ('Connect%') + AND NOT ( $my_rules ) + AND run = 1; +if(`SELECT COUNT(*) $part`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # for all Connects + --echo # + eval + SELECT + statement, SUM_NUMBER_OF_BYTES_WRITE + $part; +} + +--echo # 4.6.3 COUNT_READ, COUNT_WRITE and COUNT_MISC have to be to be > 0 +#========================================================================= +# MLML: Is checked +let $my_rules= +COUNT_READ > 0 AND COUNT_WRITE > 0 AND COUNT_MISC > 0; +let $part= +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND EVENT_NAME LIKE ('%client_connection') + AND statement LIKE ('Connect%') + AND NOT ( $my_rules ) + AND run = 1; +if(`SELECT COUNT(*) $part`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # for all Connects + --echo # + eval + SELECT + statement, COUNT_READ, COUNT_WRITE, COUNT_MISC + $part; +} + +--echo # 4.6.4 Checks based on comparison of results for connects +let $part0= +FROM mysqltest.socket_summary_by_instance_detail t1 +JOIN mysqltest.socket_summary_by_instance_detail t2 +USING (EVENT_NAME, run) +WHERE EVENT_NAME LIKE ('%client_connection') + AND run = 1 + AND t2.OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND t1.OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin; +let $part1= +SELECT RPAD(statement,55,' ') AS STATEMENT, + LENGTH(statement), SUM_NUMBER_OF_BYTES_READ +FROM mysqltest.socket_summary_by_instance_detail +WHERE OBJECT_INSTANCE_BEGIN <> @default_object_instance_begin + AND EVENT_NAME LIKE ('%client_connection') + AND run = 1; + + +--echo # 4.6.4 The user name length affects the SUM_OF_BYTES_READ value +#====================================================================== +# MLML: Is checked +# 4 6706392 85 3 15509472 117 2 34851168 Connect (con*,localhost,root012345,,mysqltest,,) +# 4 10543632 89 3 10578744 117 2 39460872 Connect (con*,localhost,root0123456789,,mysqltest,,) +let $stmt2= Connect (con*,localhost,root0123456789,,mysqltest,,); +let $stmt1= Connect (con*,localhost,root012345,,mysqltest,,); +let $my_rules= +t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt2') - LENGTH('$stmt1'); +if(`SELECT NOT ($my_rules) + $part0 + AND t2.statement = '$stmt2' + AND t1.statement = '$stmt1'`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + eval + $part1 + AND statement IN('$stmt2','$stmt1'); +} + +--echo # 4.6.5 The database name length affects the SUM_OF_BYTES_READ value +#========================================================================== +# 4 7012368 84 3 10112256 117 2 43067376 Connect (con*,localhost,root,,mysqlsupertest,,) +# 4 7172880 79 3 10247688 117 2 40128000 Connect (con*,localhost,root,,mysqltest,,) +let $stmt2= Connect (con*,localhost,root,,mysqlsupertest,,); +let $stmt1= Connect (con*,localhost,root,,mysqltest,,); +let $my_rules= +t2.SUM_NUMBER_OF_BYTES_READ - t1.SUM_NUMBER_OF_BYTES_READ = LENGTH('$stmt2') - LENGTH('$stmt1'); +if(`SELECT NOT ($my_rules) + $part0 + AND t2.statement = '$stmt2' + AND t1.statement = '$stmt1'`) +{ + --enable_query_log + --enable_result_log + --echo # The statistics looks suspicious. + --echo # We expect + --echo # $my_rules + --echo # + eval + $part1 + AND statement IN('$stmt2','$stmt1'); +} if($print_details) { @@ -928,7 +1502,7 @@ if($print_details) WHERE OBJECT_INSTANCE_BEGIN = @default_object_instance_begin ORDER BY statement,run; --echo # 3. The "server_unix_socket" - # WHERE OBJECT_INSTANCE_BEGIN = @con1_object_instance_begin + # WHERE OBJECT_INSTANCE_BEGIN = @default_object_instance_begin SELECT EVENT_NAME, COUNT_READ, SUM_NUMBER_OF_BYTES_READ, COUNT_WRITE, SUM_NUMBER_OF_BYTES_WRITE, No bundle (reason: useless for push emails).