mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			237 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
# 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
 | 
						|
 |