########### ../t/admin_xkill.test ######### ## # ## This test aims to run list_clients and kill_client admin commands # ## Test runs covers below scenarios: # ## - listing client with single session and multiple sessions # ## - killing own session and x_root user session with privileged user # ## - killing own session and x_root user session with unprivileged user ## - killing session with value of different data types than UINT # ## - killing x_root session with user has only process privilege # ## - listing and killing session with password expired user # ## - killing valid sql_session id with xprotocol connection # ## - listing and killing default mysqlx_max_connections ie 100 # ## - listing,killing clients with ssl xprotocol privileged conn # ## - listing and killing clients with ssl xprotocol x_root connection # ## - kill_client,list_clients stats # ## - check sum of these 2 vars with all mysqlx sessions should be as# # that of with mysql client # ###################################################################### --source include/xplugin_preamble.inc --source include/xplugin_create_user.inc call mtr.add_suppression("Plugin mysqlx reported: 'Unhandled network error: Bad file descriptor'"); create user sslcon@localhost identified by 'sslcon'; grant all on *.* to sslcon@localhost; --write_file $MYSQL_TMP_DIR/admin_xkill.tmp -->import assert_status_variable.macro -->import kill_and_restart.macro create user abc@localhost identified by 'abc'; create user xplugin@localhost identified by 'xplugin'; grant all on *.* to xplugin@localhost; create user process@localhost identified by 'process'; grant process on *.* to process@localhost; create user expire@localhost identified by 'expire'; grant all on *.* to expire@localhost; alter user expire@localhost password expire; select sleep(1); -->echo Test data -->stmtadmin list_clients -->recvresult -->echo expect Mysqlx_stmt_list_clients=1 and Mysqlx_stmt_kill_client=0 quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 1; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; -->echo create and activate new session -->newsession aux x_root -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=1 and Mysqlx_stmt_kill_client=0 even with another new x_root session quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 1; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; -->echo switch back to default session -->setsession -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=2 and Mysqlx_stmt_kill_client=0 with default x_root session where list_clients already executed quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 2; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; callmacro kill_client 2; callmacro Wait_for_status_variable Mysqlx_sessions 1; -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=3 and Mysqlx_stmt_kill_client=1 with default x_root session where list_clients executed 3 times and kill_client once quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 3; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; -->echo create and activate new session abc -->echo expect only abc user session id -->newsession abc abc abc -->stmtadmin list_clients -->recvresult client_id user host -->echo killing x_root user session with unprivileged user 'abc' which should be unsuccessful callmacro kill_client_expect_error 1 ER_KILL_DENIED_ERROR; -->echo expect Mysqlx_stmt_list_clients=1 and Mysqlx_stmt_kill_client=1 with session abc where list_clients and kill_client executed once quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 1; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; select user(),current_user(); show grants; -->echo open another session of abc user and kill first session of abc user,which should be successful -->newsession abc1 abc abc -->stmtadmin list_clients -->recvresult client_id user host callmacro kill_client 3; callmacro Wait_for_status_variable Mysqlx_sessions 2; -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=2 and Mysqlx_stmt_kill_client=1 with new session abc where list_clients executed twice and kill_client executed once quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 2; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; select user(),current_user(); show grants; -->echo killing abc user session with its own session 'abc' which should be successful -->echo expect right error instead of End of File Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_UINT v_unsigned_int: 4 } } } #-->echo expect Mysqlx.Sql.StmtExecuteOk #-->recvresult # and switch back to default -->recvuntildisc callmacro Wait_for_status_variable Mysqlx_sessions 1; -->echo switch back to default session -->setsession -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=4 and Mysqlx_stmt_kill_client=1 with default x_root session where list_clients executed 4 times and kill_client once quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 4; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; select user(),current_user(); show grants; -->echo open process only privileged user seession and kill x_root user session,expect error "You are not owner of thread" -->newsession process process process -->stmtadmin list_clients -->recvresult client_id user host callmacro kill_client_expect_error 1 ER_KILL_DENIED_ERROR; callmacro Wait_for_status_variable Mysqlx_sessions 2; -->echo checking list of clients after x_root user session killed by xplugin user -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=2 and Mysqlx_stmt_kill_client=1 with process user where list_clients executed 2 times and kill_client once show status like 'Mysqlx_stmt%client%'; select user(),current_user(); show grants; -->echo open privileged user seession and kill x_root user session,expect success -->newsession xplugin xplugin xplugin -->stmtadmin list_clients -->recvresult client_id user host callmacro kill_client 1; callmacro Wait_for_status_variable Mysqlx_sessions 2; -->echo checking list of clients after x_root user session killed by xplugin user -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=2 and Mysqlx_stmt_kill_client=1 with xplugin user where list_clients executed 2 times and kill_client once show status like 'Mysqlx_stmt%client%'; select user(),current_user(); show grants; -->echo Cleanup drop schema if exists xtest; EOF ## killing client with invalid scalar data types --write_file $MYSQL_TMP_DIR/admin_xkill_invaliddtype.tmp -->import assert_status_variable.macro -->import kill_and_restart.macro -->stmtadmin list_clients -->recvresult client_id user host -->echo expect error while killing client with data type other than usinged int -->echo try killing xprotocol session with valid sql_session id once xprotocol connetion opened with kill_client,expect error callmacro kill_client_expect_error 11 ER_NO_SUCH_THREAD; Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_STRING v_string:{ value: "1" } } } } -->expecterror ER_X_CMD_ARGUMENT_TYPE -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_BOOL v_bool:1 } } } -->expecterror ER_X_CMD_ARGUMENT_TYPE -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_BOOL v_bool:0 } } } -->expecterror ER_X_CMD_ARGUMENT_TYPE -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_BOOL v_bool:false } } } -->expecterror ER_X_CMD_ARGUMENT_TYPE -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_BOOL v_bool:true } } } -->expecterror ER_X_CMD_ARGUMENT_TYPE -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_FLOAT v_float:1 } } } -->expecterror ER_X_CMD_ARGUMENT_TYPE -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_DOUBLE v_double:1 } } } -->expecterror ER_X_CMD_ARGUMENT_TYPE -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_NULL } } } -->expecterror ER_X_CMD_ARGUMENT_TYPE -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_OCTETS v_octets {value:"1"} } } } -->expecterror ER_X_CMD_ARGUMENT_TYPE -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_SINT v_signed_int:-1 } } } -->expecterror ER_X_CMD_ARGUMENT_TYPE -->recvresult -->echo expect Mysqlx_stmt_list_clients=1 and Mysqlx_stmt_kill_client=11 with x_root user even though kill_client returns errors quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 11; callmacro Assert_status_variable Mysqlx_stmt_list_clients 1; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; EOF --write_file $MYSQL_TMP_DIR/admin_xkill_pwd_expire.tmp -->import assert_status_variable.macro -->import kill_and_restart.macro -->echo expect error if list_clients and kill_client executed from password expired user session -->expecterror ER_MUST_CHANGE_PASSWORD show processlist; Mysqlx.Sql.StmtExecute { stmt: "list_clients" namespace: "xplugin" } -->expecterror ER_MUST_CHANGE_PASSWORD -->recvresult callmacro kill_client_expect_error 8 ER_MUST_CHANGE_PASSWORD; EOF --write_file $MYSQL_TMP_DIR/admin_mixedcase.tmp -->import assert_status_variable.macro -->import kill_and_restart.macro -->echo checking list_clients and kill_client with mixed case, expect success as these commands are case insensitive Mysqlx.Sql.StmtExecute { stmt: "LIST_clients" namespace: "xplugin" } ## expect Mysqlx.Sql.StmtExecuteOk -->recvresult client_id user host Mysqlx.Sql.StmtExecute { stmt: "kill_CLIENT" namespace: "xplugin" args { type: SCALAR scalar { type: V_UINT v_unsigned_int: 998 } } } -->expecterror ER_NO_SUCH_THREAD -->recvresult -->echo expect Mysqlx_stmt_list_clients=1 and Mysqlx_stmt_kill_client=1 with x_root user when these commads executed with mixed case quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 1; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; EOF ###below script is blind, it can be modified more efficiently by reducing no of lines --write_file $MYSQL_TMP_DIR/admin_list_kill_100conns.tmp -->import assert_status_variable.macro -->import kill_and_restart.macro -->echo checking list_clients and kill_client with default 100 connections, expect success for both list and kill set @@global.mysqlx_max_connections=60; create user xconnection1@localhost identified by 'xconnection1'; create user xconnection2@localhost identified by 'xconnection2'; create user xconnection3@localhost identified by 'xconnection3'; create user xconnection4@localhost identified by 'xconnection4'; create user xconnection5@localhost identified by 'xconnection5'; create user xconnection6@localhost identified by 'xconnection6'; create user xconnection7@localhost identified by 'xconnection7'; create user xconnection8@localhost identified by 'xconnection8'; create user xconnection9@localhost identified by 'xconnection9'; create user xconnection10@localhost identified by 'xconnection10'; create user xconnection11@localhost identified by 'xconnection11'; create user xconnection12@localhost identified by 'xconnection12'; create user xconnection13@localhost identified by 'xconnection13'; create user xconnection14@localhost identified by 'xconnection14'; create user xconnection15@localhost identified by 'xconnection15'; create user xconnection16@localhost identified by 'xconnection16'; create user xconnection17@localhost identified by 'xconnection17'; create user xconnection18@localhost identified by 'xconnection18'; create user xconnection19@localhost identified by 'xconnection19'; create user xconnection20@localhost identified by 'xconnection20'; create user xconnection21@localhost identified by 'xconnection21'; create user xconnection22@localhost identified by 'xconnection22'; create user xconnection23@localhost identified by 'xconnection23'; create user xconnection24@localhost identified by 'xconnection24'; create user xconnection25@localhost identified by 'xconnection25'; create user xconnection26@localhost identified by 'xconnection26'; create user xconnection27@localhost identified by 'xconnection27'; create user xconnection28@localhost identified by 'xconnection28'; create user xconnection29@localhost identified by 'xconnection29'; create user xconnection30@localhost identified by 'xconnection30'; create user xconnection31@localhost identified by 'xconnection31'; create user xconnection32@localhost identified by 'xconnection32'; create user xconnection33@localhost identified by 'xconnection33'; create user xconnection34@localhost identified by 'xconnection34'; create user xconnection35@localhost identified by 'xconnection35'; create user xconnection36@localhost identified by 'xconnection36'; create user xconnection37@localhost identified by 'xconnection37'; create user xconnection38@localhost identified by 'xconnection38'; create user xconnection39@localhost identified by 'xconnection39'; create user xconnection40@localhost identified by 'xconnection40'; create user xconnection41@localhost identified by 'xconnection41'; create user xconnection42@localhost identified by 'xconnection42'; create user xconnection43@localhost identified by 'xconnection43'; create user xconnection44@localhost identified by 'xconnection44'; create user xconnection45@localhost identified by 'xconnection45'; create user xconnection46@localhost identified by 'xconnection46'; create user xconnection47@localhost identified by 'xconnection47'; create user xconnection48@localhost identified by 'xconnection48'; create user xconnection49@localhost identified by 'xconnection49'; create user xconnection50@localhost identified by 'xconnection50'; -->echo Test data -->stmtadmin list_clients -->recvresult -->echo expect Mysqlx_stmt_list_clients=1 and Mysqlx_stmt_kill_client=0 show status like 'Mysqlx_stmt%client%'; -->echo create and activate new session xconnection1 -->newsession xconnection1 xconnection1 xconnection1 -->newsession xconnection2 xconnection2 xconnection2 -->newsession xconnection3 xconnection3 xconnection3 -->newsession xconnection4 xconnection4 xconnection4 -->newsession xconnection5 xconnection5 xconnection5 -->newsession xconnection6 xconnection6 xconnection6 -->newsession xconnection7 xconnection7 xconnection7 -->newsession xconnection8 xconnection8 xconnection8 -->newsession xconnection9 xconnection9 xconnection9 -->newsession xconnection10 xconnection10 xconnection10 -->newsession xconnection11 xconnection11 xconnection11 -->newsession xconnection12 xconnection12 xconnection12 -->newsession xconnection13 xconnection13 xconnection13 -->newsession xconnection14 xconnection14 xconnection14 -->newsession xconnection15 xconnection15 xconnection15 -->newsession xconnection16 xconnection16 xconnection16 -->newsession xconnection17 xconnection17 xconnection17 -->newsession xconnection18 xconnection18 xconnection18 -->newsession xconnection19 xconnection19 xconnection19 -->newsession xconnection20 xconnection20 xconnection20 -->newsession xconnection21 xconnection21 xconnection21 -->newsession xconnection22 xconnection22 xconnection22 -->newsession xconnection23 xconnection23 xconnection23 -->newsession xconnection24 xconnection24 xconnection24 -->newsession xconnection25 xconnection25 xconnection25 -->newsession xconnection26 xconnection26 xconnection26 -->newsession xconnection27 xconnection27 xconnection27 -->newsession xconnection28 xconnection28 xconnection28 -->newsession xconnection29 xconnection29 xconnection29 -->newsession xconnection30 xconnection30 xconnection30 -->newsession xconnection31 xconnection31 xconnection31 -->newsession xconnection32 xconnection32 xconnection32 -->newsession xconnection33 xconnection33 xconnection33 -->newsession xconnection34 xconnection34 xconnection34 -->newsession xconnection35 xconnection35 xconnection35 -->newsession xconnection36 xconnection36 xconnection36 -->newsession xconnection37 xconnection37 xconnection37 -->newsession xconnection38 xconnection38 xconnection38 -->newsession xconnection39 xconnection39 xconnection39 -->newsession xconnection40 xconnection40 xconnection40 -->newsession xconnection41 xconnection41 xconnection41 -->newsession xconnection42 xconnection42 xconnection42 -->newsession xconnection43 xconnection43 xconnection43 -->newsession xconnection44 xconnection44 xconnection44 -->newsession xconnection45 xconnection45 xconnection45 -->newsession xconnection46 xconnection46 xconnection46 -->newsession xconnection47 xconnection47 xconnection47 -->newsession xconnection48 xconnection48 xconnection48 -->newsession xconnection49 xconnection49 xconnection49 -->newsession xconnection50 xconnection50 xconnection50 -->stmtadmin list_clients -->recvresult client_id user host ## switch back to default session -->setsession -->echo list all connected clients -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=2 and Mysqlx_stmt_kill_client=0 quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 2; callmacro Assert_status_variable Mysqlx_sessions 51; noquiet; -->echo killing all newly connected clients except x_root,one by one callmacro kill_client 11; callmacro kill_client 12; callmacro kill_client 13; callmacro kill_client 14; callmacro kill_client 15; callmacro kill_client 16; callmacro kill_client 17; callmacro kill_client 18; callmacro kill_client 19; callmacro kill_client 20; callmacro kill_client 21; callmacro kill_client 22; callmacro kill_client 23; callmacro kill_client 24; callmacro kill_client 25; callmacro kill_client 26; callmacro kill_client 27; callmacro kill_client 28; callmacro kill_client 29; callmacro kill_client 30; callmacro kill_client 31; callmacro kill_client 32; callmacro kill_client 33; callmacro kill_client 34; callmacro kill_client 35; callmacro kill_client 36; callmacro kill_client 37; callmacro kill_client 38; callmacro kill_client 39; callmacro kill_client 40; callmacro kill_client 41; callmacro kill_client 42; callmacro kill_client 43; callmacro kill_client 44; callmacro kill_client 45; callmacro kill_client 46; callmacro kill_client 47; callmacro kill_client 48; callmacro kill_client 49; callmacro kill_client 50; callmacro kill_client 51; callmacro kill_client 52; callmacro kill_client 53; callmacro kill_client 54; callmacro kill_client 55; callmacro kill_client 56; callmacro kill_client 57; callmacro kill_client 58; callmacro kill_client 59; callmacro kill_client 60; callmacro Wait_for_status_variable Mysqlx_sessions 1; -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=3 and Mysqlx_stmt_kill_client=50 quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 50; callmacro Assert_status_variable Mysqlx_stmt_list_clients 3; callmacro Assert_status_variable Mysqlx_sessions 1; callmacro Assert_status_variable Mysqlx_sessions_accepted 60; callmacro Assert_status_variable Mysqlx_sessions_closed 59; callmacro Assert_status_variable Mysqlx_sessions_fatal_error 0; callmacro Assert_status_variable Mysqlx_sessions_killed 54; callmacro Assert_status_variable Mysqlx_sessions_rejected 0; noquiet; drop user xconnection1@localhost; drop user xconnection2@localhost; drop user xconnection3@localhost; drop user xconnection4@localhost; drop user xconnection5@localhost; drop user xconnection6@localhost; drop user xconnection7@localhost; drop user xconnection8@localhost; drop user xconnection9@localhost; drop user xconnection10@localhost; drop user xconnection11@localhost; drop user xconnection12@localhost; drop user xconnection13@localhost; drop user xconnection14@localhost; drop user xconnection15@localhost; drop user xconnection16@localhost; drop user xconnection17@localhost; drop user xconnection18@localhost; drop user xconnection19@localhost; drop user xconnection20@localhost; drop user xconnection21@localhost; drop user xconnection22@localhost; drop user xconnection23@localhost; drop user xconnection24@localhost; drop user xconnection25@localhost; drop user xconnection26@localhost; drop user xconnection27@localhost; drop user xconnection28@localhost; drop user xconnection29@localhost; drop user xconnection30@localhost; drop user xconnection31@localhost; drop user xconnection32@localhost; drop user xconnection33@localhost; drop user xconnection34@localhost; drop user xconnection35@localhost; drop user xconnection36@localhost; drop user xconnection37@localhost; drop user xconnection38@localhost; drop user xconnection39@localhost; drop user xconnection40@localhost; drop user xconnection41@localhost; drop user xconnection42@localhost; drop user xconnection43@localhost; drop user xconnection44@localhost; drop user xconnection45@localhost; drop user xconnection46@localhost; drop user xconnection47@localhost; drop user xconnection48@localhost; drop user xconnection49@localhost; drop user xconnection50@localhost; EOF --write_file $MYSQL_TMP_DIR/admin_list_kill_sqlnamespace.tmp -->echo execute list_clients,kill_client with sql namespace,expect error -->echo change result file once error messages are fixed Mysqlx.Sql.StmtExecute { stmt: "list_clients" namespace: "sql" } -->echo expect Mysqlx.Sql.StmtExecuteOk -->expecterror ER_PARSE_ERROR -->recvresult client_id user host Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "sql" args { type: SCALAR scalar { type: V_UINT v_unsigned_int: 11 } } } -->echo expect Mysqlx.Sql.StmtExecuteOk -->expecterror ER_X_CMD_NUM_ARGUMENTS -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "" args { type: SCALAR scalar { type: V_UINT v_unsigned_int: 11 } } } -->echo expect Mysqlx.Sql.StmtExecuteOk -->expecterror ER_X_INVALID_NAMESPACE -->recvresult Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "invalid" args { type: SCALAR scalar { type: V_UINT v_unsigned_int: 11 } } } -->echo expect Mysqlx.Sql.StmtExecuteOk -->expecterror ER_X_INVALID_NAMESPACE -->recvresult -->echo expect Mysqlx_stmt_list_clients=0 and Mysqlx_stmt_kill_client=0 as these are not executed on right namespace quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 0; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; EOF --write_file $MYSQL_TMP_DIR/admin_xkill_ssl.tmp -->import assert_status_variable.macro -->import kill_and_restart.macro -->echo open xconnection with ssl and kill,expect success create user con1@localhost identified by 'con1'; create user con2@localhost identified by 'con2'; set @@global.mysqlx_max_connections=3; -->echo Test data -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=1 and Mysqlx_stmt_kill_client=0 quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 1; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; -->echo create and activate new session con1 -->newsession con1 con1 con1 -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=1 and Mysqlx_stmt_kill_client=0 quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 1; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; -->echo open 3rd xprotocol connection where 2 sessions already opened -->newsession con2 con2 con2 -->echo expect Mysqlx_stmt_list_clients=0 and Mysqlx_stmt_kill_client=0 quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 0; callmacro Assert_status_variable Mysqlx_sessions 3; noquiet; ## switch back to default session -->setsession -->stmtadmin list_clients -->recvresult client_id user host callmacro kill_client 63; callmacro kill_client 64; callmacro Wait_for_status_variable Mysqlx_sessions 1; -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=3 and Mysqlx_stmt_kill_client=2 drop user con1@localhost; drop user con2@localhost; quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 2; callmacro Assert_status_variable Mysqlx_stmt_list_clients 3; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; EOF --write_file $MYSQL_TMP_DIR/admin_xkill_ssl_root.tmp -->import assert_status_variable.macro -->import kill_and_restart.macro -->echo open xconnection with ssl x_root user kill,expect success create user con1@localhost identified by 'con1'; create user con2@localhost identified by 'con2'; set @@global.mysqlx_max_connections=3; -->echo Test data -->stmtadmin list_clients -->recvresult client_id user host -->echo create and activate new session con1 -->newsession con1 con1 con1 -->stmtadmin list_clients -->recvresult client_id user host -->echo open 3rd xprotocol connection where 2 sessions already opened -->newsession con2 con2 con2 ## switch back to default session -->setsession -->stmtadmin list_clients -->recvresult client_id user host callmacro kill_client 66; callmacro kill_client 67; callmacro Wait_for_status_variable Mysqlx_sessions 1; -->stmtadmin list_clients -->recvresult client_id user host drop user con1@localhost; drop user con2@localhost; EOF --write_file $MYSQL_TMP_DIR/admin_xkill_compatibility_56_OFF.tmp -->import assert_status_variable.macro -->import kill_and_restart.macro create user abc@localhost identified by 'abc'; create user xplugin@localhost identified by 'xplugin'; grant all on *.* to xplugin@localhost; create user process@localhost identified by 'process'; grant process on *.* to process@localhost; create user expire@localhost identified by 'expire'; grant all on *.* to expire@localhost; alter user expire@localhost password expire; -->echo Test data -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=1 and Mysqlx_stmt_kill_client=0 quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 1; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; -->echo create and activate new session -->newsession aux x_root -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=1 and Mysqlx_stmt_kill_client=0 even with another new x_root session quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 1; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; -->echo switch back to default session -->setsession -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=2 and Mysqlx_stmt_kill_client=0 with default x_root session where list_clients already executed quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 0; callmacro Assert_status_variable Mysqlx_stmt_list_clients 2; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; callmacro kill_client 2; callmacro Wait_for_status_variable Mysqlx_sessions 1; -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=3 and Mysqlx_stmt_kill_client=1 with default x_root session where list_clients executed 3 times and kill_client once quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 3; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; -->echo create and activate new session abc -->echo expect only abc user session id -->newsession abc abc abc -->stmtadmin list_clients -->recvresult client_id user host -->echo killing x_root user session with unprivileged user 'abc' which should be unsuccessful callmacro kill_client_expect_error 1 ER_KILL_DENIED_ERROR; -->echo expect ERROR: SELECT command denied to user 'abc'@'localhost' for table 'session_status' (code 1142) for show status command quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 1; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; -->echo open another session of abc user and kill first session of abc user,which should be successful -->newsession abc1 abc abc -->stmtadmin list_clients -->recvresult client_id user host callmacro kill_client 3; callmacro Wait_for_status_variable Mysqlx_sessions 2; -->stmtadmin list_clients -->recvresult client_id user host -->echo expect ERROR: SELECT command denied to user 'abc'@'localhost' for table 'session_status' (code 1142) for show status command quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 2; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; -->echo killing abc user session with its own session 'abc' which should be successful -->echo expect right error instead of End of File Mysqlx.Sql.StmtExecute { stmt: "kill_client" namespace: "xplugin" args { type: SCALAR scalar { type: V_UINT v_unsigned_int: 4 } } } #-->echo expect Mysqlx.Sql.StmtExecuteOk #-->recvresult -->echo switch back to default session -->recvuntildisc callmacro Wait_for_status_variable Mysqlx_sessions 1; -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=4 and Mysqlx_stmt_kill_client=1 with default x_root session where list_clients executed 4 times and kill_client once quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 4; callmacro Assert_status_variable Mysqlx_sessions 1; noquiet; -->echo open process only privileged user seession and kill x_root user session,expect error "You are not owner of thread" -->newsession process process process -->stmtadmin list_clients -->recvresult client_id user host callmacro kill_client_expect_error 1 ER_KILL_DENIED_ERROR; callmacro Wait_for_status_variable Mysqlx_sessions 2; -->echo checking list of clients after x_root user session killed by xplugin user -->stmtadmin list_clients -->recvresult client_id user host -->echo expect ERROR: SELECT command denied to user 'process'@'localhost' for table 'session_status' (code 1142) for show command quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 2; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; -->echo open privileged user seession and kill x_root user session,expect success -->newsession xplugin xplugin xplugin -->stmtadmin list_clients -->recvresult client_id user host callmacro kill_client 1; callmacro Wait_for_status_variable Mysqlx_sessions 2; -->echo checking list of clients after x_root user session killed by xplugin user -->stmtadmin list_clients -->recvresult client_id user host -->echo expect Mysqlx_stmt_list_clients=2 and Mysqlx_stmt_kill_client=1 with xplugin user where list_clients executed 2 times and kill_client once quiet; callmacro Assert_status_variable Mysqlx_stmt_kill_client 1; callmacro Assert_status_variable Mysqlx_stmt_list_clients 2; callmacro Assert_status_variable Mysqlx_sessions 2; noquiet; -->echo Cleanup drop schema if exists xtest; EOF --replace_regex /([a-z0-9]+ localhost )[0-9]+/\1$SESSION/ /You are not owner of thread [0-9]+/You are not owner of thread/ --exec $MYSQLXTEST -ux_root --password='' --file=$MYSQL_TMP_DIR/admin_xkill.tmp 2>&1 --replace_regex /([a-z0-9]+ localhost )[0-9]+/\1$SESSION/ --exec $MYSQLXTEST -ux_root --password='' --file=$MYSQL_TMP_DIR/admin_xkill_invaliddtype.tmp 2>&1 ##try executing list_clients and kill_client with password expired user, expect error --replace_regex /([a-z0-9]+ localhost )[0-9]+/\1$SESSION/ /Query/Execute/ --exec $MYSQLXTEST --connect-expired-password -uexpire --password='expire' --file=$MYSQL_TMP_DIR/admin_xkill_pwd_expire.tmp 2>&1 ##execute list_clients and kill_client with mixed case,expect command should be recognized --replace_regex /([a-z0-9]+ localhost )[0-9]+/\1$SESSION/ --exec $MYSQLXTEST -ux_root --password='' --file=$MYSQL_TMP_DIR/admin_mixedcase.tmp 2>&1 ##open 100 xprotocol connections and list and kill them ony by one,expect success --replace_regex /([a-z0-9]+ localhost )[0-9]+/\1$SESSION/ --exec $MYSQLXTEST -ux_root --password='' --file=$MYSQL_TMP_DIR/admin_list_kill_100conns.tmp 2>&1 ##execute list_clients,kill_client with invalid name space other than xplugin,exect unsuccess --replace_regex /([a-z0-9]+ localhost )[0-9]+/\1$SESSION/ --exec $MYSQLXTEST -ux_root --password='' --file=$MYSQL_TMP_DIR/admin_list_kill_sqlnamespace.tmp 2>&1 ##verify list_clients and kill_client works with ssl privileged user --replace_regex /([a-z0-9]+ localhost )[0-9]+/\1$SESSION/ --exec $MYSQLXTEST -usslcon --password='sslcon' --ssl-key=$MYSQL_TEST_DIR/std_data/server-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/server-cert.pem --file=$MYSQL_TMP_DIR/admin_xkill_ssl.tmp 2>&1 ##verify list_clients and kill_client works with x_root user having ssl --replace_regex /([a-z0-9]+ localhost )[0-9]+/\1$SESSION/ --exec $MYSQLXTEST -ux_root --password='' --ssl-key=$MYSQL_TEST_DIR/std_data/server-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/server-cert.pem --file=$MYSQL_TMP_DIR/admin_xkill_ssl_root.tmp 2>&1 ##expect sum of all stats of kill_client,list_clients with native mysql clients as these are global to mysql client and local to mysqlx session show status like 'Mysqlx_stmt%client%'; #show status like 'Mysqlx_sessions%'; ##verify Mysqlx_stmt_kill_client and Mysqlx_stmt_list_clients let $restart_parameters = restart: ; --source include/restart_mysqld.inc drop user abc@localhost; drop user xplugin@localhost; drop user process@localhost; drop user expire@localhost; ###expects zero stats for kill_client,list_clients once server started first time set @@global.mysqlx_max_connections=100; show status like 'Mysqlx_stmt%client%'; select sleep(0.5); --replace_regex /([a-z0-9]+ localhost )[0-9]+/\1$SESSION/ /You are not owner of thread [0-9]+/You are not owner of thread/ --exec $MYSQLXTEST -ux_root --password='' --file=$MYSQL_TMP_DIR/admin_xkill_compatibility_56_OFF.tmp 2>&1 ##expect sum of all stats of kill_client,list_clients with native mysql clients as these are global to mysql client and local to mysqlx session ##seems to be it is not working that way show status like 'Mysqlx_stmt%client%'; ## Cleanup drop user abc@localhost; drop user xplugin@localhost; drop user process@localhost; drop user expire@localhost; drop user sslcon@localhost; --remove_file $MYSQL_TMP_DIR/admin_xkill.tmp --remove_file $MYSQL_TMP_DIR/admin_xkill_ssl.tmp --remove_file $MYSQL_TMP_DIR/admin_xkill_ssl_root.tmp --remove_file $MYSQL_TMP_DIR/admin_xkill_invaliddtype.tmp --remove_file $MYSQL_TMP_DIR/admin_xkill_pwd_expire.tmp --remove_file $MYSQL_TMP_DIR/admin_mixedcase.tmp --remove_file $MYSQL_TMP_DIR/admin_list_kill_100conns.tmp --remove_file $MYSQL_TMP_DIR/admin_list_kill_sqlnamespace.tmp --remove_file $MYSQL_TMP_DIR/admin_xkill_compatibility_56_OFF.tmp --source include/xplugin_drop_user.inc