From e3603de5d82f841a5fe9ef0075302ef99ffdf842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 2 Apr 2018 17:03:22 +0200 Subject: [PATCH] Remember if the current connection has an unknown transaction status Further improvement on previous commit --- lib/MySQL_Session.cpp | 8 +++----- lib/mysql_connection.cpp | 18 +++++++----------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 14d8b3467..fae5bb79d 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -942,7 +942,7 @@ int MySQL_Session::handler_again___status_PINGING_SERVER() { int rc=myconn->async_ping(myds->revents); if (rc==0) { myconn->async_state_machine=ASYNC_IDLE; - myconn->unknown_transaction_status = false; + myconn->compute_unknown_transaction_status(); if (mysql_thread___multiplexing && (myconn->reusable==true) && myds->myconn->IsActiveTransaction()==false && myds->myconn->MultiplexDisabled()==false) { myds->return_MySQL_Connection_To_Pool(); } else { @@ -2731,7 +2731,6 @@ handler_again: enum session_status st=status; size_t sts=previous_status.size(); if (sts) { - myconn->unknown_transaction_status = false; myconn->async_state_machine=ASYNC_IDLE; myds->DSS=STATE_MARIADB_GENERIC; st=previous_status.top(); @@ -2771,7 +2770,6 @@ handler_again: if (mysql_thread___multiplexing && (myds->myconn->reusable==true) && myds->myconn->IsActiveTransaction()==false && myds->myconn->MultiplexDisabled()==false) { if (mysql_thread___connection_delay_multiplex_ms && mirror==false) { myds->wait_until=thread->curtime+mysql_thread___connection_delay_multiplex_ms*1000; - myconn->unknown_transaction_status = false; myconn->async_state_machine=ASYNC_IDLE; myconn->multiplex_delayed=true; myds->DSS=STATE_MARIADB_GENERIC; @@ -2799,7 +2797,7 @@ handler_again: } } else { myconn->multiplex_delayed=false; - myconn->unknown_transaction_status = false; + myconn->compute_unknown_transaction_status(); myconn->async_state_machine=ASYNC_IDLE; myds->DSS=STATE_MARIADB_GENERIC; if (transaction_persistent==true) { @@ -2817,7 +2815,6 @@ handler_again: } else { if (rc==-1) { int myerr=mysql_errno(myconn->mysql); - myconn->compute_unknown_transaction_status(); char *errmsg = NULL; if (myerr == 0) { if (CurrentQuery.mysql_stmt) { @@ -4402,6 +4399,7 @@ void MySQL_Session::RequestEnd(MySQL_Data_Stream *myds) { // if there is a mysql connection, clean its status if (myds->myconn) { myds->myconn->async_free_result(); + myds->myconn->compute_unknown_transaction_status(); } myds->free_mysql_real_query(); } diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index d88b517cc..7d7c09b57 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -1169,7 +1169,7 @@ int MySQL_Connection::async_connect(short event) { return 0; } if (async_state_machine==ASYNC_CONNECT_SUCCESSFUL) { - unknown_transaction_status = false; + compute_unknown_transaction_status(); async_state_machine=ASYNC_IDLE; myds->wait_until=0; creation_time = monotonic_time(); @@ -1178,7 +1178,7 @@ int MySQL_Connection::async_connect(short event) { handler(event); switch (async_state_machine) { case ASYNC_CONNECT_SUCCESSFUL: - unknown_transaction_status = false; + compute_unknown_transaction_status(); async_state_machine=ASYNC_IDLE; myds->wait_until=0; return 0; @@ -1257,33 +1257,30 @@ int MySQL_Connection::async_query(short event, char *stmt, unsigned long length, } if (async_state_machine==ASYNC_QUERY_END) { + compute_unknown_transaction_status(); if (mysql_errno(mysql)) { - compute_unknown_transaction_status(); return -1; } else { - unknown_transaction_status = false; return 0; } } if (async_state_machine==ASYNC_STMT_EXECUTE_END) { query.stmt_meta=NULL; async_state_machine=ASYNC_QUERY_END; + compute_unknown_transaction_status(); if (mysql_stmt_errno(query.stmt)) { - compute_unknown_transaction_status(); return -1; } else { - unknown_transaction_status = false; return 0; } } if (async_state_machine==ASYNC_STMT_PREPARE_SUCCESSFUL || async_state_machine==ASYNC_STMT_PREPARE_FAILED) { query.stmt_meta=NULL; + compute_unknown_transaction_status(); if (async_state_machine==ASYNC_STMT_PREPARE_FAILED) { - compute_unknown_transaction_status(); return -1; } else { *_stmt=query.stmt; - unknown_transaction_status = false; return 0; } } @@ -1537,7 +1534,7 @@ void MySQL_Connection::async_free_result() { mysql_result=NULL; } } - unknown_transaction_status = false; + compute_unknown_transaction_status(); async_state_machine=ASYNC_IDLE; if (MyRS) { delete MyRS; @@ -1735,11 +1732,10 @@ int MySQL_Connection::async_send_simple_command(short event, char *stmt, unsigne proxy_error("Retrieved a resultset while running a simple command. This is an error!! Simple command: %s\n", stmt); } if (async_state_machine==ASYNC_QUERY_END) { + compute_unknown_transaction_status(); if (mysql_errno(mysql)) { - compute_unknown_transaction_status(); return -1; } else { - unknown_transaction_status = false; async_state_machine=ASYNC_IDLE; return 0; }