# # Tests for the performance_schema host_cache. # # Simulate failures from per user quotas: # - reported in COUNT_MAX_USER_CONNECTION_ERRORS # - reported in COUNT_MAX_USER_CONNECTION_PER_HOUR_ERRORS # Simulate failures from server quotas: # - reported in COUNT_MAX_CONNECTION_ERRORS --source include/not_embedded.inc --source include/have_debug.inc --source include/have_perfschema.inc --source include/have_hostname_cache.inc # Enforce a clean state --source ../include/wait_for_pfs_thread_count.inc --source ../include/hostcache_set_state.inc select @@global.max_connections into @saved_max_connections; select @@global.max_user_connections into @saved_max_user_connections; create user 'quota'@'santa.claus.ipv4.example.com'; grant select on test.* to 'quota'@'santa.claus.ipv4.example.com'; grant usage on *.* to 'quota'@'santa.claus.ipv4.example.com' with max_connections_per_hour 3; connect (con1,"127.0.0.1",root,,test,$MASTER_MYPORT,); select "Con1 is alive"; select current_user(); disconnect con1; --connection default SET @saved_dbug = @@GLOBAL.debug_dbug; set global debug_dbug= "+d,vio_peer_addr_fake_ipv4,getnameinfo_fake_ipv4,getaddrinfo_fake_good_ipv4"; connect (con2a,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con2a is alive"; select current_user(); disconnect con2a; --connection default --source ../include/hostcache_dump.inc connect (con2b,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con2b is alive"; select current_user(); disconnect con2b; --connection default --source ../include/hostcache_dump.inc connect (con2c,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con2c is alive"; select current_user(); disconnect con2c; --connection default --source ../include/hostcache_dump.inc --disable_query_log --error ER_USER_LIMIT_REACHED connect (con2d,"127.0.0.1",quota,,test,$MASTER_MYPORT,); --enable_query_log --connection default --source ../include/hostcache_dump.inc --disable_query_log --error ER_USER_LIMIT_REACHED connect (con2e,"127.0.0.1",quota,,test,$MASTER_MYPORT,); --enable_query_log --connection default --source ../include/hostcache_dump.inc # Wait for all disconnects --source ../include/wait_for_pfs_thread_count.inc grant usage on *.* to 'quota'@'santa.claus.ipv4.example.com' with max_connections_per_hour 0; grant usage on *.* to 'quota'@'santa.claus.ipv4.example.com' with max_user_connections 3; flush user_resources; connect (con3a,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con7 is alive"; select current_user(); --connection default --source ../include/hostcache_dump.inc connect (con3b,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con3b is alive"; select current_user(); --connection default --source ../include/hostcache_dump.inc connect (con3c,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con3c is alive"; select current_user(); --connection default --source ../include/hostcache_dump.inc --disable_query_log --error ER_USER_LIMIT_REACHED connect (con3d,"127.0.0.1",quota,,test,$MASTER_MYPORT,); --enable_query_log --connection default --source ../include/hostcache_dump.inc --disable_query_log --error ER_USER_LIMIT_REACHED connect (con3e,"127.0.0.1",quota,,test,$MASTER_MYPORT,); --enable_query_log --connection default --source ../include/hostcache_dump.inc disconnect con3a; disconnect con3b; disconnect con3c; # Wait for all disconnects --source ../include/wait_for_pfs_thread_count.inc grant usage on *.* to 'quota'@'santa.claus.ipv4.example.com' with max_user_connections 0; flush user_resources; set global max_user_connections = 3; connect (con4a,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con4a is alive"; select current_user(); --connection default --source ../include/hostcache_dump.inc connect (con4b,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con4b is alive"; select current_user(); --connection default --source ../include/hostcache_dump.inc connect (con4c,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con4c is alive"; select current_user(); --connection default --source ../include/hostcache_dump.inc --disable_query_log --error ER_TOO_MANY_USER_CONNECTIONS connect (con4d,"127.0.0.1",quota,,test,$MASTER_MYPORT,); --enable_query_log --connection default --source ../include/hostcache_dump.inc --disable_query_log --error ER_TOO_MANY_USER_CONNECTIONS connect (con4e,"127.0.0.1",quota,,test,$MASTER_MYPORT,); --enable_query_log --connection default --source ../include/hostcache_dump.inc disconnect con4a; disconnect con4b; disconnect con4c; # Wait for all disconnects --source ../include/wait_for_pfs_thread_count.inc set global max_user_connections = 0; set global max_connections = 10; flush user_resources; connect (tmp_con1,"127.0.0.1",quota,,test,$MASTER_MYPORT,); connect (tmp_con2,"127.0.0.1",quota,,test,$MASTER_MYPORT,); connect (tmp_con3,"127.0.0.1",quota,,test,$MASTER_MYPORT,); connect (tmp_con4,"127.0.0.1",quota,,test,$MASTER_MYPORT,); connect (tmp_con5,"127.0.0.1",quota,,test,$MASTER_MYPORT,); connect (tmp_con6,"127.0.0.1",quota,,test,$MASTER_MYPORT,); connect (tmp_con7,"127.0.0.1",quota,,test,$MASTER_MYPORT,); connect (con5a,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con4a is alive"; select current_user(); --connection default --source ../include/hostcache_dump.inc connect (con5b,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con5b is alive"; select current_user(); --connection default --source ../include/hostcache_dump.inc # About error ER_CON_COUNT_ERROR: # - this error is associated with SQLSTATE 08004, # and returned from 2 places in the server code. # - which path returns the error is not predictable, # as it depends on the server load and thread scheduling # - one path returns a SQLSTATE of 08004 # - another path returns no SQLSTATE at all, # and then the client sets a default value of HY000 for SQLSTATE # # Testing for error ER_CON_COUNT_ERROR alone causes this to # be printed in the result file: # - ERROR 08004: Too many connections # which in turn causes spurious test failures. # # To work around this, this scripts expect to see either # the error number ER_CON_COUNT_ERROR (it always does) # or the error number 9999 (it never does, this error does not exist). # The exact error number and SQLSTATE is not printed in the result file, # makig this test robust for both cases: # - ERROR 08004: Too many connections # - ERROR HY000: Too many connections --disable_query_log --error ER_CON_COUNT_ERROR, 9999 connect (con5c,"127.0.0.1",quota,,test,$MASTER_MYPORT,); --enable_query_log --connection default --source ../include/hostcache_dump.inc --disable_query_log --error ER_CON_COUNT_ERROR, 9999 connect (con5d,"127.0.0.1",quota,,test,$MASTER_MYPORT,); --enable_query_log --connection default --source ../include/hostcache_dump.inc disconnect con5a; disconnect con5b; --disconnect tmp_con1 --disconnect tmp_con2 --disconnect tmp_con3 --disconnect tmp_con4 --disconnect tmp_con5 --disconnect tmp_con6 --disconnect tmp_con7 # Wait for all disconnects --source ../include/wait_for_pfs_thread_count.inc set global max_connections = @saved_max_connections; set global max_user_connections = @saved_max_user_connections; # revoke all privileges on test.* from 'quota'@'santa.claus.ipv4.example.com'; drop user 'quota'@'santa.claus.ipv4.example.com'; SET @@GLOBAL.debug_dbug = @saved_dbug;