summaryrefslogtreecommitdiff
path: root/mysql-test/suite/perfschema/include/socket_summary_check_dbg.inc
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/suite/perfschema/include/socket_summary_check_dbg.inc')
-rw-r--r--mysql-test/suite/perfschema/include/socket_summary_check_dbg.inc236
1 files changed, 236 insertions, 0 deletions
diff --git a/mysql-test/suite/perfschema/include/socket_summary_check_dbg.inc b/mysql-test/suite/perfschema/include/socket_summary_check_dbg.inc
new file mode 100644
index 00000000000..64ee19c3d9b
--- /dev/null
+++ b/mysql-test/suite/perfschema/include/socket_summary_check_dbg.inc
@@ -0,0 +1,236 @@
+# include/socket_summary_check.inc
+#
+# Auxiliary routine to be sourced by socket_summary_by_instance_func.test
+# or other routines sourced within this script.
+#
+# Purpose
+# Various checks for the content of the table socket_summary_by_instance.
+#
+# It is intentional that we do not try to cram as much checks as possible into
+# one single SQL statement.
+# Reasons:
+# - We check performance_schema here and NOT something like optimizer.
+# - This test should work even if some other feature has become buggy.
+# - In case some check gives unexpected results than we print the
+# relevant content of the table and the values which we expect.
+# In case of all checks in one statement such a printout would be too huge.
+#
+# IMPORTANT:
+# The maximum number of rows which the table socket_summary_by_instance
+# can keep is limited via the system variables max_socket_classes and
+# max_socket_instances. We are running with the default values here.
+# They are sufficient high so that these limits cannot harm the current test.
+# FIXME: Check at the beginning of the test that the limits are sufficient
+# for the current test.
+#
+
+--disable_query_log
+# Insert the current state into mysqltest.my_socket_summary_by_instance.
+eval $insert_after;
+--enable_query_log
+
+
+# 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)
+ NOT IN (SELECT EVENT_NAME,OBJECT_INSTANCE_BEGIN
+FROM performance_schema.socket_instances);
+if(`SELECT COUNT(*) $part1`)
+{
+ --echo # There is an inconsistency between the content of the tables
+ --echo # socket_instances and socket_summary_by_instance
+ --echo #
+ eval
+ SELECT 'not in socket_instances' AS state, EVENT_NAME, OBJECT_INSTANCE_BEGIN
+ $part1;
+ --echo # abort 1
+ # exit;
+}
+
+--vertical_results
+
+
+# 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.99;
+let $my_hi= 1.01;
+
+let $my_rules=
+COUNT_STAR * AVG_TIMER_WAIT BETWEEN SUM_TIMER_WAIT * $my_lo AND SUM_TIMER_WAIT * $my_hi AND
+COUNT_READ * AVG_TIMER_READ BETWEEN SUM_TIMER_READ * $my_lo AND SUM_TIMER_READ * $my_hi AND
+COUNT_WRITE * AVG_TIMER_WRITE BETWEEN SUM_TIMER_WRITE * $my_lo AND SUM_TIMER_WRITE * $my_hi AND
+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;
+
+if(`SELECT SUM($my_rules) <> COUNT(*) FROM mysqltest.my_socket_summary_by_instance
+ WHERE pk = 'After'`)
+{
+ --echo # The statistics looks suspicious.
+ --echo # We expect
+ --echo # $my_rules
+ eval
+ SELECT EVENT_NAME, OBJECT_INSTANCE_BEGIN,
+ $part
+ FROM mysqltest.my_socket_summary_by_instance
+ WHERE pk = 'After'
+ ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN;
+
+ -- echo # Debug 2a: Dump socket_summary_by_instance
+ eval
+ SELECT EVENT_NAME, OBJECT_INSTANCE_BEGIN,
+ $part
+ FROM performance_schema.socket_summary_by_instance
+ ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN;
+ --echo # abort 2
+# exit;
+}
+
+
+# 3. Check the relation between AVG_*, MIN_TIMER_* and MAX_TIMER_*
+#
+# If we run this check sufficient frequent than only the following
+# additional checks are required:
+# a) If (SUM_TIMER_*(new) - SUM_TIMER_*(old) < MIN_TIMER_*(old))
+# than MIN_TIMER_*(new) = SUM_TIMER_*(new) - SUM_TIMER_*(old).
+# b) If (SUM_TIMER_*(new) - SUM_TIMER_*(old) > MAX_TIMER_*(old))
+# than MAX_TIMER_*(new) = SUM_TIMER_*(new) - SUM_TIMER_*(old).
+# in order to remove MIN_TIMER_* and MAX_TIMER_* from other checks
+# Between the states "new" and "old" must be exact one statement.
+#-----------------------------------------------------------------------------------------------
+let $my_rules=
+AVG_TIMER_WAIT >= MIN_TIMER_WAIT AND MAX_TIMER_WAIT >= AVG_TIMER_WAIT AND
+AVG_TIMER_READ >= MIN_TIMER_READ AND MAX_TIMER_READ >= AVG_TIMER_READ AND
+AVG_TIMER_WRITE >= MIN_TIMER_WRITE AND MAX_TIMER_WRITE >= AVG_TIMER_WRITE AND
+AVG_TIMER_MISC >= MIN_TIMER_MISC AND MAX_TIMER_MISC >= AVG_TIMER_MISC;
+
+let $part=
+MIN_TIMER_WAIT, AVG_TIMER_WAIT, MAX_TIMER_WAIT,
+MIN_TIMER_READ, AVG_TIMER_READ, MAX_TIMER_READ,
+MIN_TIMER_WRITE, AVG_TIMER_WRITE, MAX_TIMER_WRITE,
+MIN_TIMER_MISC, AVG_TIMER_MISC, MAX_TIMER_MISC;
+
+if(`SELECT SUM($my_rules) <> COUNT(*) FROM mysqltest.my_socket_summary_by_instance
+ WHERE pk = 'After'`)
+{
+ --echo # The statistics looks suspicious.
+ --echo # We expect
+ --echo # $my_rules
+ eval
+ SELECT EVENT_NAME, OBJECT_INSTANCE_BEGIN,
+ $part
+ FROM mysqltest.my_socket_summary_by_instance
+ WHERE pk = 'After'
+ ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN;
+ --echo # abort 3
+# exit;
+}
+
+
+# 4. Check the aggregate columns COUNT_STAR and SUM_TIMER_WAIT
+#
+# The specification says:
+# The columns COUNT_STAR, SUM/MIN/AVG/MAX TIMER_WAIT aggregates all operations.
+#
+# If we run this check sufficient frequent than COUNT_STAR and SUM_TIMER_WAIT
+# can be removed from other checks.
+#---------------------------------------------------------------------------------
+let $my_rules=
+COUNT_STAR = COUNT_READ + COUNT_WRITE + COUNT_MISC AND
+SUM_TIMER_WAIT = SUM_TIMER_READ + SUM_TIMER_WRITE + SUM_TIMER_MISC;
+
+let $part=
+COUNT_STAR, COUNT_READ + COUNT_WRITE + COUNT_MISC, COUNT_READ, COUNT_WRITE, COUNT_MISC,
+SUM_TIMER_WAIT, SUM_TIMER_READ + SUM_TIMER_WRITE + SUM_TIMER_MISC, SUM_TIMER_READ,
+SUM_TIMER_WRITE, SUM_TIMER_MISC;
+
+if(`SELECT SUM($my_rules) <> COUNT(*) FROM mysqltest.my_socket_summary_by_instance
+ WHERE pk = 'After'`)
+{
+ --echo # The statistics looks suspicious.
+ --echo # We expect
+ --echo # $my_rules
+ --echo #
+ eval
+ SELECT EVENT_NAME, OBJECT_INSTANCE_BEGIN,
+ $part
+ FROM mysqltest.my_socket_summary_by_instance
+ WHERE pk = 'After'
+ ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN;
+ --echo # abort 4
+# exit;
+}
+
+
+# 5. Check the aggregate column MIN_TIMER_WAIT
+#
+# If we run this check sufficient frequent than MIN_TIMER_WAIT
+# can be removed from other checks.
+#---------------------------------------------------------------------------------
+let $my_rules=
+MIN_TIMER_WAIT >= mysqltest.min_of_triple(MIN_TIMER_READ,MIN_TIMER_WRITE,MIN_TIMER_MISC);
+
+let $part=
+MIN_TIMER_WAIT,
+mysqltest.min_of_triple(MIN_TIMER_READ, MIN_TIMER_WRITE, MIN_TIMER_MISC) AS "Min_of_Triple",
+MIN_TIMER_READ, MIN_TIMER_WRITE, MIN_TIMER_MISC;
+
+if(`SELECT SUM($my_rules) <> COUNT(*) FROM mysqltest.my_socket_summary_by_instance
+ WHERE pk = 'After'`)
+{
+ --echo # The statistics looks suspicious.
+ --echo # We expect
+ --echo # $my_rules
+ --echo #
+ eval
+ SELECT EVENT_NAME, OBJECT_INSTANCE_BEGIN,
+ $part
+ FROM mysqltest.my_socket_summary_by_instance
+ WHERE pk = 'After'
+ ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN;
+ --echo # abort 5
+# exit;
+}
+
+
+# 6. Check the aggregate column MAX_TIMER_WAIT
+#
+# If we run this check sufficient frequent than MAX_TIMER_WAIT
+# can be removed from other checks.
+#---------------------------------------------------------------------------------
+let $my_rules=
+MAX_TIMER_WAIT >= mysqltest.max_of_triple(MAX_TIMER_READ,MAX_TIMER_WRITE,MAX_TIMER_MISC);
+
+let $part=
+MAX_TIMER_WAIT,
+mysqltest.max_of_triple(MAX_TIMER_READ, MAX_TIMER_WRITE, MAX_TIMER_MISC) AS "Max_of_Triple",
+MAX_TIMER_READ, MAX_TIMER_WRITE, MAX_TIMER_MISC;
+
+if(`SELECT SUM($my_rules) <> COUNT(*) FROM mysqltest.my_socket_summary_by_instance
+ WHERE pk = 'After'`)
+{
+ --echo # The statistics looks suspicious.
+ --echo # We expect
+ --echo # $my_rules
+ --echo #
+ eval
+ SELECT EVENT_NAME, OBJECT_INSTANCE_BEGIN,
+ $part
+ FROM mysqltest.my_socket_summary_by_instance
+ WHERE pk = 'After'
+ ORDER BY EVENT_NAME, OBJECT_INSTANCE_BEGIN;
+ --echo # abort 6
+# exit;
+}
+
+--horizontal_results
+