diff --git a/include/maxscale/protocol/mysql.h b/include/maxscale/protocol/mysql.h index 438655eef..2dd77a44a 100644 --- a/include/maxscale/protocol/mysql.h +++ b/include/maxscale/protocol/mysql.h @@ -383,7 +383,7 @@ extern uint8_t null_client_sha1[MYSQL_SCRAMBLE_LEN]; MYSQL_session* mysql_session_alloc(); MySQLProtocol* mysql_protocol_init(DCB* dcb, int fd); -void mysql_protocol_done (DCB* dcb); +bool mysql_protocol_done (DCB* dcb); const char *gw_mysql_protocol_state2string(int state); int mysql_send_com_quit(DCB* dcb, int packet_number, GWBUF* buf); GWBUF* mysql_create_com_quit(GWBUF* bufparam, int packet_number); diff --git a/server/modules/protocol/MySQL/MySQLClient/mysql_client.c b/server/modules/protocol/MySQL/MySQLClient/mysql_client.c index 304c8d47b..e1fd3e802 100644 --- a/server/modules/protocol/MySQL/MySQLClient/mysql_client.c +++ b/server/modules/protocol/MySQL/MySQLClient/mysql_client.c @@ -1295,11 +1295,22 @@ static int gw_client_close(DCB *dcb) { CHK_DCB(dcb); ss_dassert(dcb->protocol); - mysql_protocol_done(dcb); - MXS_SESSION* target = dcb->session; - ss_debug(MXS_SESSION* removed = ) mxs_worker_deregister_session(target->ses_id); - ss_dassert(removed == target); - session_close(target); + + if (mysql_protocol_done(dcb)) + { + MXS_SESSION* target = dcb->session; + + if (target->state != SESSION_STATE_TO_BE_FREED && + target->state != SESSION_STATE_DUMMY) + { + ss_dassert(target->state == SESSION_STATE_ROUTER_READY || + target->state == SESSION_STATE_STOPPING); + ss_debug(MXS_SESSION* removed =) mxs_worker_deregister_session(target->ses_id); + ss_dassert(removed == target); + session_close(target); + } + } + return 1; } diff --git a/server/modules/protocol/MySQL/mysql_common.c b/server/modules/protocol/MySQL/mysql_common.c index 5e592f6d3..d593ed6a5 100644 --- a/server/modules/protocol/MySQL/mysql_common.c +++ b/server/modules/protocol/MySQL/mysql_common.c @@ -120,36 +120,35 @@ return_p: } /** - * mysql_protocol_done + * Free protocol object * - * free protocol allocations. - * - * @param dcb owner DCB + * @param dcb Owner DCB * + * @return True if protocol was closed */ -void mysql_protocol_done(DCB* dcb) +bool mysql_protocol_done(DCB* dcb) { - MySQLProtocol* p; - server_command_t* scmd; - server_command_t* scmd2; - - p = (MySQLProtocol *)dcb->protocol; + bool rval = false; + MySQLProtocol* p = (MySQLProtocol *)dcb->protocol; if (p->protocol_state == MYSQL_PROTOCOL_ACTIVE) { - scmd = p->protocol_cmd_history; + server_command_t* scmd = p->protocol_cmd_history; - while (scmd != NULL) + while (scmd) { - scmd2 = scmd->scom_next; - MXS_FREE(scmd); - scmd = scmd2; + server_command_t* temp = scmd; + scmd = scmd->scom_next; + MXS_FREE(temp); } gwbuf_free(p->stored_query); p->protocol_state = MYSQL_PROTOCOL_DONE; + rval = true; } + + return rval; } /**