From 0ec14ecab10c73fa719403ee2230ae4f859dd0c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 30 Jul 2015 15:46:16 +0000 Subject: [PATCH] Implemented query timeout based on query rules --- lib/MySQL_Session.cpp | 10 ++++++++-- lib/Query_Processor.cpp | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index e0473f517..2b25cadbb 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -349,7 +349,12 @@ int MySQL_Session::handler() { proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Received query to be processed with MariaDB Client library\n"); mybe->server_myds->mysql_real_query.size=pkt.size-5; mybe->server_myds->mysql_real_query.ptr=(char *)malloc(pkt.size-5); - mybe->server_myds->wait_until=thread->curtime+mysql_thread___ping_timeout_server*10000; + mybe->server_myds->wait_until=0; + if (qpo) { + if (qpo->timeout > 0) { + mybe->server_myds->wait_until=thread->curtime+qpo->timeout*1000; + } + } mybe->server_myds->killed_at=0; //fprintf(stderr,"times: %llu, %llu\n", mybe->server_myds->wait_until, thread->curtime); memcpy(mybe->server_myds->mysql_real_query.ptr,(char *)pkt.ptr+5,pkt.size-5); @@ -496,11 +501,12 @@ handler_again: case PROCESSING_QUERY: //fprintf(stderr,"PROCESSING_QUERY\n"); - if (mybe->server_myds->wait_until && thread->curtime >= mybe->server_myds->wait_until) { + if (mybe->server_myds->myconn && mybe->server_myds->wait_until && thread->curtime >= mybe->server_myds->wait_until) { // query timed out MySQL_Data_Stream *myds=mybe->server_myds; // FIXME: make sure the connection is established first if (myds->killed_at==0) { + myds->wait_until=0; myds->killed_at=thread->curtime; //fprintf(stderr,"Expired: %llu, %llu\n", mybe->server_myds->wait_until, thread->curtime); MySQL_Connection_userinfo *ui=client_myds->myconn->userinfo; diff --git a/lib/Query_Processor.cpp b/lib/Query_Processor.cpp index cb6dcd81e..82ced258c 100644 --- a/lib/Query_Processor.cpp +++ b/lib/Query_Processor.cpp @@ -543,7 +543,7 @@ QP_out_t * Query_Processor::process_mysql_query(MySQL_Session *sess, void *ptr, if (qr->timeout >= 0) { // Note: negative timeout means this rule doesn't change proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "query rule %d has set timeout: %d. Query will%s be interrupted if exceeding %dms\n", qr->rule_id, qr->timeout, (qr->timeout == 0 ? " NOT" : "" ) , qr->timeout); - ret->reconnect=qr->reconnect; + ret->timeout=qr->timeout; } if (qr->cache_ttl >= 0) { // Note: negative TTL means this rule doesn't change