diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 2fcae2c7ce9..8979d104eca 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -898,6 +898,23 @@ static void async_mysql_free_result_wrapper(MYSQL_RES *result) { return; } +static int async_mysql_reset_connection_wrapper(MYSQL *mysql) { + net_async_status status; + AsyncTimer t(__func__); + while ((status = mysql_reset_connection_nonblocking(mysql)) == + NET_ASYNC_NOT_READY) { + t.check(); + NET_ASYNC *net_async = NET_ASYNC_DATA(&(mysql->net)); + int result = socket_event_listen(net_async->async_blocking_state, + mysql_get_socket_descriptor(mysql)); + if (result == -1) return 1; + } + if (status == NET_ASYNC_ERROR) { + return 1; + } + return 0; +} + /* Below are the wrapper functions which are defined on top of standard C APIs to make a decision on whether to call blocking or non blocking API based on @@ -976,6 +993,13 @@ static void mysql_free_result_wrapper(MYSQL_RES *result) { return mysql_free_result(result); } +static int mysql_reset_connection_wrapper(MYSQL *mysql) { + if (enable_async_client) + return async_mysql_reset_connection_wrapper(mysql); + else + return mysql_reset_connection(mysql); +} + /* async client test code (end) */ void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val, size_t len); @@ -7038,7 +7062,7 @@ static void do_reset_connection() { MYSQL *mysql = &cur_con->mysql; DBUG_TRACE; - if (mysql_reset_connection(mysql)) + if (mysql_reset_connection_wrapper(mysql)) die("reset connection failed: %s", mysql_error(mysql)); if (cur_con->stmt) { mysql_stmt_close(cur_con->stmt); diff --git a/include/mysql.h b/include/mysql.h index 6bdce201bd2..5b8bb8a4e3d 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -584,6 +584,7 @@ void STDCALL myodbc_remove_escape(MYSQL *mysql, char *name); unsigned int STDCALL mysql_thread_safe(void); bool STDCALL mysql_read_query_result(MYSQL *mysql); int STDCALL mysql_reset_connection(MYSQL *mysql); +enum net_async_status STDCALL mysql_reset_connection_nonblocking(MYSQL *mysql); unsigned long STDCALL cli_safe_read(MYSQL *mysql, bool *is_data_packet); enum net_async_status STDCALL cli_safe_read_nonblocking(MYSQL *mysql, diff --git a/include/mysql.h.pp b/include/mysql.h.pp index 1faab775e09..f133b64b850 100644 --- a/include/mysql.h.pp +++ b/include/mysql.h.pp @@ -724,6 +724,7 @@ void myodbc_remove_escape(MYSQL *mysql, char *name); unsigned int mysql_thread_safe(void); bool mysql_read_query_result(MYSQL *mysql); int mysql_reset_connection(MYSQL *mysql); +enum net_async_status mysql_reset_connection_nonblocking(MYSQL *mysql); unsigned long cli_safe_read(MYSQL *mysql, bool *is_data_packet); enum net_async_status cli_safe_read_nonblocking(MYSQL *mysql, bool *is_data_packet, diff --git a/libmysql/libmysql.cc b/libmysql/libmysql.cc index 3d023377b65..5569354e6f3 100644 --- a/libmysql/libmysql.cc +++ b/libmysql/libmysql.cc @@ -4659,17 +4659,38 @@ bool STDCALL mysql_read_query_result(MYSQL *mysql) { return (*mysql->methods->read_query_result)(mysql); } +void reset_mysql(MYSQL *mysql) { + mysql_detach_stmt_list(&mysql->stmts, "mysql_reset_connection"); + /* reset some of the members in mysql */ + mysql->insert_id = 0; + mysql->affected_rows = ~(uint64_t)0; + free_old_query(mysql); + mysql->status = MYSQL_STATUS_READY; +} + int STDCALL mysql_reset_connection(MYSQL *mysql) { DBUG_TRACE; if (simple_command(mysql, COM_RESET_CONNECTION, nullptr, 0, 0)) return 1; else { - mysql_detach_stmt_list(&mysql->stmts, "mysql_reset_connection"); - /* reset some of the members in mysql */ - mysql->insert_id = 0; - mysql->affected_rows = ~(uint64_t)0; - free_old_query(mysql); - mysql->status = MYSQL_STATUS_READY; + reset_mysql(mysql); return 0; } } + +net_async_status STDCALL mysql_reset_connection_nonblocking(MYSQL *mysql) { + DBUG_ENTER("mysql_reset_connection_nonblocking"); + bool err; + net_async_status status = simple_command_nonblocking( + mysql, COM_RESET_CONNECTION, (uchar *)0, 0, 0, &err); + + if (status == NET_ASYNC_COMPLETE) { + if (err) { + return NET_ASYNC_ERROR; + } else { + reset_mysql(mysql); + } + } + + DBUG_RETURN(status); +}