Skip to content

Commit

Permalink
Group user network errors by error code.
Browse files Browse the repository at this point in the history
Summary: Currently the code, reports network errors across all clients by error code but reports the total network error experienced by each client. It will be beneficial to group network errors per user as well by the error code.

Test Plan: Run newly added unit test

Reviewers: ebergen, pengt

Reviewed By: pengt
  • Loading branch information
krad authored and jtolmer committed Jan 5, 2016
1 parent d6c1603 commit 0e62abd
Show file tree
Hide file tree
Showing 10 changed files with 385 additions and 84 deletions.
55 changes: 55 additions & 0 deletions mysql-test/include/connection_net_errors_stats_test.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
--echo connection_net_errors_stats_test (user= $user, ER_NET_READ_ERROR= $ER_NET_READ_ERROR, ER_NET_READ_INTERRUPTED= $ER_NET_READ_INTERRUPTED)

connect (conn_stat,127.0.0.1,root);

--let $mode=baseline
--source include/get_user_net_error_stats.inc

flush status;

# Test ER_NET_READ_ERROR
if ($ER_NET_READ_ERROR == 1)
{
connect (conn1,127.0.0.1,$user);
select "disconnect the connection";
dirty_close conn1;

--source include/wait_until_disconnected.inc
}

# Test ER_NET_READ_INTERRUPTED
if ($ER_NET_READ_INTERRUPTED == 1)
{
connect (conn2,127.0.0.1,$user);
set session wait_timeout = 1;
--real_sleep 2
--error 2006, 2013
# Why do we check for two error codes ?
# The client fails with very related error codes in different builds. The
# intention of this test is to test that the server stats reflect correctly.
# This is a known client side behavior and other tests like kill.test
# and wait_until_connected already does the same.
select "connection should have been closed by server";
disconnect conn2;
}

# We don't have a mechanism to trigger the following errors
# ER_NET_WRITE_INTERRUPTED
# ER_NET_ERROR_ON_WRITE
# ER_NET_PACKET_TOO_LARGE
# ER_NET_UNCOMPRESS_ERROR
# ER_NET_PACKETS_OUT_OF_ORDER

--connection conn_stat

# Verify the counters
show status like "Connection_errors_net_%";

--let $mode=compute
--source include/get_user_net_error_stats.inc

# Run flush status
flush status;
show status like "Connection_errors_net_%";

disconnect conn_stat;
54 changes: 54 additions & 0 deletions mysql-test/include/get_user_net_error_stats.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
let $select_errors_net_total = select errors_net_total from information_schema.user_statistics where user_name="$user";
let $select_errors_net_ER_NET_ERROR_ON_WRITE = select
errors_net_ER_NET_ERROR_ON_WRITE from information_schema.user_statistics where
user_name="$user";
let $select_errors_net_ER_NET_PACKETS_OUT_OF_ORDER = select errors_net_ER_NET_PACKETS_OUT_OF_ORDER from information_schema.user_statistics where user_name="$user";
let $select_errors_net_ER_NET_PACKET_TOO_LARGE = select errors_net_ER_NET_PACKET_TOO_LARGE from information_schema.user_statistics where user_name="$user";
let $select_errors_net_ER_NET_READ_ERROR = select errors_net_ER_NET_READ_ERROR from information_schema.user_statistics where user_name="$user";
let $select_errors_net_ER_NET_READ_INTERRUPTED = select errors_net_ER_NET_READ_INTERRUPTED from information_schema.user_statistics where user_name="$user";
let $select_errors_net_ER_NET_UNCOMPRESS_ERROR = select errors_net_ER_NET_UNCOMPRESS_ERROR from information_schema.user_statistics where user_name="$user";
let $select_errors_net_ER_NET_WRITE_INTERRUPTED = select errors_net_ER_NET_WRITE_INTERRUPTED from information_schema.user_statistics where user_name="$user";

if ($mode == 'baseline')
{
--let $base_errors_net_total = query_get_value($select_errors_net_total, errors_net_total, 1)
--let $base_errors_net_ER_NET_ERROR_ON_WRITE = query_get_value($select_errors_net_ER_NET_ERROR_ON_WRITE, errors_net_ER_NET_ERROR_ON_WRITE, 1)
--let $base_errors_net_ER_NET_PACKETS_OUT_OF_ORDER = query_get_value($select_errors_net_ER_NET_PACKETS_OUT_OF_ORDER, errors_net_ER_NET_PACKETS_OUT_OF_ORDER, 1)
--let $base_errors_net_ER_NET_PACKET_TOO_LARGE = query_get_value($select_errors_net_ER_NET_PACKET_TOO_LARGE, errors_net_ER_NET_PACKET_TOO_LARGE, 1)
--let $base_errors_net_ER_NET_READ_ERROR = query_get_value($select_errors_net_ER_NET_READ_ERROR, errors_net_ER_NET_READ_ERROR, 1)
--let $base_errors_net_ER_NET_READ_INTERRUPTED = query_get_value($select_errors_net_ER_NET_READ_INTERRUPTED, errors_net_ER_NET_READ_INTERRUPTED, 1)
--let $base_errors_net_ER_NET_UNCOMPRESS_ERROR = query_get_value($select_errors_net_ER_NET_UNCOMPRESS_ERROR, errors_net_ER_NET_UNCOMPRESS_ERROR, 1)
--let $base_errors_net_ER_NET_WRITE_INTERRUPTED = query_get_value($select_errors_net_ER_NET_WRITE_INTERRUPTED, errors_net_ER_NET_WRITE_INTERRUPTED, 1)
}

if ($mode == 'compute')
{
--let $errors_net_total = query_get_value($select_errors_net_total, errors_net_total, 1)
--let $errors_net_ER_NET_ERROR_ON_WRITE = query_get_value($select_errors_net_ER_NET_ERROR_ON_WRITE, errors_net_ER_NET_ERROR_ON_WRITE, 1)
--let $errors_net_ER_NET_PACKETS_OUT_OF_ORDER = query_get_value($select_errors_net_ER_NET_PACKETS_OUT_OF_ORDER, errors_net_ER_NET_PACKETS_OUT_OF_ORDER, 1)
--let $errors_net_ER_NET_PACKET_TOO_LARGE = query_get_value($select_errors_net_ER_NET_PACKET_TOO_LARGE, errors_net_ER_NET_PACKET_TOO_LARGE, 1)
--let $errors_net_ER_NET_READ_ERROR = query_get_value($select_errors_net_ER_NET_READ_ERROR, errors_net_ER_NET_READ_ERROR, 1)
--let $errors_net_ER_NET_READ_INTERRUPTED = query_get_value($select_errors_net_ER_NET_READ_INTERRUPTED, errors_net_ER_NET_READ_INTERRUPTED, 1)
--let $errors_net_ER_NET_UNCOMPRESS_ERROR = query_get_value($select_errors_net_ER_NET_UNCOMPRESS_ERROR, errors_net_ER_NET_UNCOMPRESS_ERROR, 1)
--let $errors_net_ER_NET_WRITE_INTERRUPTED = query_get_value($select_errors_net_ER_NET_WRITE_INTERRUPTED, errors_net_ER_NET_WRITE_INTERRUPTED, 1)

--disable_query_log
eval select $errors_net_total - $base_errors_net_total into @errors_net_total;
eval select $errors_net_ER_NET_ERROR_ON_WRITE - $base_errors_net_ER_NET_ERROR_ON_WRITE into @errors_net_ER_NET_ERROR_ON_WRITE;
eval select $errors_net_ER_NET_PACKETS_OUT_OF_ORDER - $base_errors_net_ER_NET_PACKETS_OUT_OF_ORDER into @errors_net_ER_NET_PACKETS_OUT_OF_ORDER;
eval select $errors_net_ER_NET_PACKET_TOO_LARGE - $base_errors_net_ER_NET_PACKET_TOO_LARGE into @errors_net_ER_NET_PACKET_TOO_LARGE;
eval select $errors_net_ER_NET_READ_ERROR - $base_errors_net_ER_NET_READ_ERROR into @errors_net_ER_NET_READ_ERROR;
eval select $errors_net_ER_NET_READ_INTERRUPTED - $base_errors_net_ER_NET_READ_INTERRUPTED into @errors_net_ER_NET_READ_INTERRUPTED;
eval select $errors_net_ER_NET_UNCOMPRESS_ERROR - $base_errors_net_ER_NET_UNCOMPRESS_ERROR into @errors_net_ER_NET_UNCOMPRESS_ERROR;
eval select $errors_net_ER_NET_WRITE_INTERRUPTED - $base_errors_net_ER_NET_WRITE_INTERRUPTED into @errors_net_ER_NET_WRITE_INTERRUPTED;

--enable_query_log
select @errors_net_total;
select @errors_net_ER_NET_ERROR_ON_WRITE;
select @errors_net_ER_NET_PACKETS_OUT_OF_ORDER;
select @errors_net_ER_NET_PACKET_TOO_LARGE;
select @errors_net_ER_NET_READ_ERROR;
select @errors_net_ER_NET_READ_INTERRUPTED;
select @errors_net_ER_NET_UNCOMPRESS_ERROR;
select @errors_net_ER_NET_WRITE_INTERRUPTED;
}
130 changes: 128 additions & 2 deletions mysql-test/r/connection_net_errors_stats.result
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
create user mysqltest_1@localhost;
select "Init stats for user mysqltest_1";
Init stats for user mysqltest_1
Init stats for user mysqltest_1
connection_net_errors_stats_test (user= root, ER_NET_READ_ERROR= 1, ER_NET_READ_INTERRUPTED= 1)
flush status;
select "disconnect the connection";
disconnect the connection
Expand All @@ -14,9 +19,30 @@ Connection_errors_net_ER_NET_READ_ERROR 1
Connection_errors_net_ER_NET_READ_INTERRUPTED 1
Connection_errors_net_ER_NET_UNCOMPRESS_ERROR 0
Connection_errors_net_ER_NET_WRITE_INTERRUPTED 0
select @errors_networking;
@errors_networking
select @errors_net_total;
@errors_net_total
2
select @errors_net_ER_NET_ERROR_ON_WRITE;
@errors_net_ER_NET_ERROR_ON_WRITE
0
select @errors_net_ER_NET_PACKETS_OUT_OF_ORDER;
@errors_net_ER_NET_PACKETS_OUT_OF_ORDER
0
select @errors_net_ER_NET_PACKET_TOO_LARGE;
@errors_net_ER_NET_PACKET_TOO_LARGE
0
select @errors_net_ER_NET_READ_ERROR;
@errors_net_ER_NET_READ_ERROR
1
select @errors_net_ER_NET_READ_INTERRUPTED;
@errors_net_ER_NET_READ_INTERRUPTED
1
select @errors_net_ER_NET_UNCOMPRESS_ERROR;
@errors_net_ER_NET_UNCOMPRESS_ERROR
0
select @errors_net_ER_NET_WRITE_INTERRUPTED;
@errors_net_ER_NET_WRITE_INTERRUPTED
0
flush status;
show status like "Connection_errors_net_%";
Variable_name Value
Expand All @@ -27,3 +53,103 @@ Connection_errors_net_ER_NET_READ_ERROR 0
Connection_errors_net_ER_NET_READ_INTERRUPTED 0
Connection_errors_net_ER_NET_UNCOMPRESS_ERROR 0
Connection_errors_net_ER_NET_WRITE_INTERRUPTED 0
connection_net_errors_stats_test (user= mysqltest_1, ER_NET_READ_ERROR= 1, ER_NET_READ_INTERRUPTED= 1)
flush status;
select "disconnect the connection";
disconnect the connection
disconnect the connection
set session wait_timeout = 1;
select "connection should have been closed by server";
Got one of the listed errors
show status like "Connection_errors_net_%";
Variable_name Value
Connection_errors_net_ER_NET_ERROR_ON_WRITE 0
Connection_errors_net_ER_NET_PACKETS_OUT_OF_ORDER 0
Connection_errors_net_ER_NET_PACKET_TOO_LARGE 0
Connection_errors_net_ER_NET_READ_ERROR 1
Connection_errors_net_ER_NET_READ_INTERRUPTED 1
Connection_errors_net_ER_NET_UNCOMPRESS_ERROR 0
Connection_errors_net_ER_NET_WRITE_INTERRUPTED 0
select @errors_net_total;
@errors_net_total
2
select @errors_net_ER_NET_ERROR_ON_WRITE;
@errors_net_ER_NET_ERROR_ON_WRITE
0
select @errors_net_ER_NET_PACKETS_OUT_OF_ORDER;
@errors_net_ER_NET_PACKETS_OUT_OF_ORDER
0
select @errors_net_ER_NET_PACKET_TOO_LARGE;
@errors_net_ER_NET_PACKET_TOO_LARGE
0
select @errors_net_ER_NET_READ_ERROR;
@errors_net_ER_NET_READ_ERROR
1
select @errors_net_ER_NET_READ_INTERRUPTED;
@errors_net_ER_NET_READ_INTERRUPTED
1
select @errors_net_ER_NET_UNCOMPRESS_ERROR;
@errors_net_ER_NET_UNCOMPRESS_ERROR
0
select @errors_net_ER_NET_WRITE_INTERRUPTED;
@errors_net_ER_NET_WRITE_INTERRUPTED
0
flush status;
show status like "Connection_errors_net_%";
Variable_name Value
Connection_errors_net_ER_NET_ERROR_ON_WRITE 0
Connection_errors_net_ER_NET_PACKETS_OUT_OF_ORDER 0
Connection_errors_net_ER_NET_PACKET_TOO_LARGE 0
Connection_errors_net_ER_NET_READ_ERROR 0
Connection_errors_net_ER_NET_READ_INTERRUPTED 0
Connection_errors_net_ER_NET_UNCOMPRESS_ERROR 0
Connection_errors_net_ER_NET_WRITE_INTERRUPTED 0
connection_net_errors_stats_test (user= mysqltest_1, ER_NET_READ_ERROR= 1, ER_NET_READ_INTERRUPTED= 0)
flush status;
select "disconnect the connection";
disconnect the connection
disconnect the connection
show status like "Connection_errors_net_%";
Variable_name Value
Connection_errors_net_ER_NET_ERROR_ON_WRITE 0
Connection_errors_net_ER_NET_PACKETS_OUT_OF_ORDER 0
Connection_errors_net_ER_NET_PACKET_TOO_LARGE 0
Connection_errors_net_ER_NET_READ_ERROR 1
Connection_errors_net_ER_NET_READ_INTERRUPTED 0
Connection_errors_net_ER_NET_UNCOMPRESS_ERROR 0
Connection_errors_net_ER_NET_WRITE_INTERRUPTED 0
select @errors_net_total;
@errors_net_total
1
select @errors_net_ER_NET_ERROR_ON_WRITE;
@errors_net_ER_NET_ERROR_ON_WRITE
0
select @errors_net_ER_NET_PACKETS_OUT_OF_ORDER;
@errors_net_ER_NET_PACKETS_OUT_OF_ORDER
0
select @errors_net_ER_NET_PACKET_TOO_LARGE;
@errors_net_ER_NET_PACKET_TOO_LARGE
0
select @errors_net_ER_NET_READ_ERROR;
@errors_net_ER_NET_READ_ERROR
1
select @errors_net_ER_NET_READ_INTERRUPTED;
@errors_net_ER_NET_READ_INTERRUPTED
0
select @errors_net_ER_NET_UNCOMPRESS_ERROR;
@errors_net_ER_NET_UNCOMPRESS_ERROR
0
select @errors_net_ER_NET_WRITE_INTERRUPTED;
@errors_net_ER_NET_WRITE_INTERRUPTED
0
flush status;
show status like "Connection_errors_net_%";
Variable_name Value
Connection_errors_net_ER_NET_ERROR_ON_WRITE 0
Connection_errors_net_ER_NET_PACKETS_OUT_OF_ORDER 0
Connection_errors_net_ER_NET_PACKET_TOO_LARGE 0
Connection_errors_net_ER_NET_READ_ERROR 0
Connection_errors_net_ER_NET_READ_INTERRUPTED 0
Connection_errors_net_ER_NET_UNCOMPRESS_ERROR 0
Connection_errors_net_ER_NET_WRITE_INTERRUPTED 0
drop user mysqltest_1@localhost;
9 changes: 8 additions & 1 deletion mysql-test/r/information_schema.result
Original file line number Diff line number Diff line change
Expand Up @@ -2209,7 +2209,14 @@ DISK_READ_REQUESTS_SECONDARY bigint(21) NO 0
DISK_READ_SVC_USECS_SECONDARY bigint(21) NO 0
DISK_READ_WAIT_USECS_SECONDARY bigint(21) NO 0
ERRORS_ACCESS_DENIED bigint(21) NO 0
ERRORS_NETWORKING bigint(21) NO 0
ERRORS_NET_TOTAL bigint(21) NO 0
ERRORS_NET_ER_NET_ERROR_ON_WRITE bigint(21) NO 0
ERRORS_NET_ER_NET_PACKETS_OUT_OF_ORDER bigint(21) NO 0
ERRORS_NET_ER_NET_PACKET_TOO_LARGE bigint(21) NO 0
ERRORS_net_ER_NET_READ_ERROR bigint(21) NO 0
ERRORS_net_ER_NET_READ_INTERRUPTED bigint(21) NO 0
ERRORS_net_ER_NET_UNCOMPRESS_ERROR bigint(21) NO 0
ERRORS_net_ER_NET_WRITE_INTERRUPTED bigint(21) NO 0
ERRORS_TOTAL bigint(21) NO 0
MICROSECONDS_WALL bigint(21) NO 0
MICROSECONDS_DDL bigint(21) NO 0
Expand Down
18 changes: 16 additions & 2 deletions mysql-test/r/user_stats_commands.result
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,14 @@ DISK_READ_REQUESTS_SECONDARY bigint(21) NO 0
DISK_READ_SVC_USECS_SECONDARY bigint(21) NO 0
DISK_READ_WAIT_USECS_SECONDARY bigint(21) NO 0
ERRORS_ACCESS_DENIED bigint(21) NO 0
ERRORS_NETWORKING bigint(21) NO 0
ERRORS_NET_TOTAL bigint(21) NO 0
ERRORS_NET_ER_NET_ERROR_ON_WRITE bigint(21) NO 0
ERRORS_NET_ER_NET_PACKETS_OUT_OF_ORDER bigint(21) NO 0
ERRORS_NET_ER_NET_PACKET_TOO_LARGE bigint(21) NO 0
ERRORS_net_ER_NET_READ_ERROR bigint(21) NO 0
ERRORS_net_ER_NET_READ_INTERRUPTED bigint(21) NO 0
ERRORS_net_ER_NET_UNCOMPRESS_ERROR bigint(21) NO 0
ERRORS_net_ER_NET_WRITE_INTERRUPTED bigint(21) NO 0
ERRORS_TOTAL bigint(21) NO 0
MICROSECONDS_WALL bigint(21) NO 0
MICROSECONDS_DDL bigint(21) NO 0
Expand Down Expand Up @@ -225,7 +232,14 @@ USER_STATISTICS CREATE TEMPORARY TABLE `USER_STATISTICS` (
`DISK_READ_SVC_USECS_SECONDARY` bigint(21) NOT NULL DEFAULT '0',
`DISK_READ_WAIT_USECS_SECONDARY` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_ACCESS_DENIED` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_NETWORKING` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_NET_TOTAL` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_NET_ER_NET_ERROR_ON_WRITE` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_NET_ER_NET_PACKETS_OUT_OF_ORDER` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_NET_ER_NET_PACKET_TOO_LARGE` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_net_ER_NET_READ_ERROR` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_net_ER_NET_READ_INTERRUPTED` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_net_ER_NET_UNCOMPRESS_ERROR` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_net_ER_NET_WRITE_INTERRUPTED` bigint(21) NOT NULL DEFAULT '0',
`ERRORS_TOTAL` bigint(21) NOT NULL DEFAULT '0',
`MICROSECONDS_WALL` bigint(21) NOT NULL DEFAULT '0',
`MICROSECONDS_DDL` bigint(21) NOT NULL DEFAULT '0',
Expand Down
Loading

0 comments on commit 0e62abd

Please sign in to comment.