From 99bb540e1d33e3590b15bd768cb77fe1a55b5269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 23 Apr 2016 19:20:01 +0000 Subject: [PATCH] First attempt to have ping timeout (issue #535) Added state ASYNC_PING_TIMEOUT that happens when sess->thread->curtime >= wait_until --- include/proxysql_structs.h | 1 + lib/mysql_connection.cpp | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index 36ea00c53..92e331beb 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -28,6 +28,7 @@ enum MDB_ASYNC_ST { // MariaDB Async State Machine ASYNC_PING_END, ASYNC_PING_SUCCESSFUL, ASYNC_PING_FAILED, + ASYNC_PING_TIMEOUT, ASYNC_SET_AUTOCOMMIT_START, ASYNC_SET_AUTOCOMMIT_CONT, ASYNC_SET_AUTOCOMMIT_END, diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 4ce649efd..2f4233632 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -507,9 +507,15 @@ handler_again: break; case ASYNC_PING_CONT: assert(myds->sess->status==PINGING_SERVER); - ping_cont(event); + if (event) { + ping_cont(event); + } if (async_exit_status) { - next_event(ASYNC_PING_CONT); + if (myds->sess->thread->curtime >= myds->wait_until) { + next_event(ASYNC_PING_CONT); + } else { + NEXT_IMMEDIATE(ASYNC_PING_TIMEOUT); + } } else { NEXT_IMMEDIATE(ASYNC_PING_END); } @@ -525,6 +531,8 @@ handler_again: break; case ASYNC_PING_FAILED: break; + case ASYNC_PING_TIMEOUT: + break; case ASYNC_QUERY_START: real_query_start(); __sync_fetch_and_add(&parent->queries_sent,1); @@ -828,6 +836,7 @@ int MySQL_Connection::async_ping(short event) { return 0; break; case ASYNC_PING_FAILED: + case ASYNC_PING_TIMEOUT: return -1; break; case ASYNC_IDLE: @@ -844,6 +853,7 @@ int MySQL_Connection::async_ping(short event) { return 0; break; case ASYNC_PING_FAILED: + case ASYNC_PING_TIMEOUT: return -1; break; default: