Now taking effective timeout taking as minimum of global timeout and session timeout

pull/4901/head
Yashwant Sahu 1 year ago
parent abe16e6692
commit d7ec497afd

@ -82,7 +82,7 @@ class Base_Session {
int pending_connect;
enum proxysql_session_type session_type;
int warning_in_hg;
int wait_timeout; //in milliseconds
unsigned long long wait_timeout; //in milliseconds
// bool
bool autocommit;

@ -6416,21 +6416,53 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C
client_myds->myconn->set_charset(c->nr, NAMES);
}
} else if (var == "wait_timeout") {
// MySQL min allowed value, 1 second in milliseconds
const unsigned long long MYSQL_WAIT_TIMEOUT_MIN_MS = 1 * 1000;
// MySQL max allowed value, 365 days in milliseconds
const unsigned long long MYSQL_WAIT_TIMEOUT_MAX_MS = 31536000ULL * 1000;
std::string value = *values++;
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Client requested SET wait_timeout = %s\n", value.c_str());
int client_timeout = atoi(value.c_str()) * 1000; // converting into milliseconds, mysql set timeout is in second
if (client_timeout <= 0 || client_timeout > mysql_thread___wait_timeout) {
unsigned long long client_timeout = 0;
try {
client_timeout = std::stoull(value) * 1000;
} catch (const std::exception& e) {
char errmsg[128];
snprintf(errmsg, sizeof(errmsg), "wait_timeout is less/equal than 0 or wait_timeout is %d exceeds maximum allowed %d", client_timeout, mysql_thread___wait_timeout);
snprintf(errmsg, sizeof(errmsg),
"Incorrect argument type wait_timeout value: %s", value.c_str());
client_myds->DSS = STATE_QUERY_SENT_NET;
client_myds->myprot.generate_pkt_ERR(true, nullptr, nullptr, 1, 1231, (char *)"42000", errmsg, true);
client_myds->DSS = STATE_SLEEP;
status = WAITING_CLIENT_DATA;
return true;
}
auto is_within_range = [](unsigned long long val, unsigned long long min, unsigned long long max) {
return val >= min && val <= max;
};
// Enforcing min/max MySQL wait_timeout range
if (!is_within_range(client_timeout, MYSQL_WAIT_TIMEOUT_MIN_MS, MYSQL_WAIT_TIMEOUT_MAX_MS)) {
char errmsg[256];
snprintf(errmsg, sizeof(errmsg),
"wait_timeout must be between %llu ms (1s) and %llu ms (365d), received: %llu ms",
MYSQL_WAIT_TIMEOUT_MIN_MS, MYSQL_WAIT_TIMEOUT_MAX_MS, client_timeout);
client_myds->DSS = STATE_QUERY_SENT_NET;
client_myds->myprot.generate_pkt_ERR(true, NULL, NULL, 1, 1231, (char *)"42000", errmsg, true);
client_myds->myprot.generate_pkt_ERR(true, nullptr, nullptr, 1, 1231, (char *)"42000", errmsg, true);
client_myds->DSS = STATE_SLEEP;
status = WAITING_CLIENT_DATA;
return true;
}
// Warn if client's value exceeds current global timeout
if (client_timeout > mysql_thread___wait_timeout) {
proxy_error("[Warning] Client-specified wait_timeout (%llu ms) exceeds global mysql-wait_timeout (%llu ms). Global timeout will still be enforced.",
client_timeout, mysql_thread___wait_timeout);
}
wait_timeout = client_timeout;
proxy_debug(PROXY_DEBUG_MYSQL_COM, 8, "Changing connection wait_timeout to %llu ms\n", client_timeout);
} else if (var == "tx_isolation") {
std::string value1 = *values;
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET tx_isolation value %s\n", value1.c_str());

@ -3790,7 +3790,12 @@ void MySQL_Thread::ProcessAllSessions_MaintenanceLoop(MySQL_Session *sess, unsig
* @param curtime The current time, in milliseconds.
* @param sess The MySQL session to handle.
*/
if ( (sess_time/1000 > (unsigned long long)mysql_thread___max_transaction_idle_time) || (sess_time/1000 > (unsigned long long)sess->wait_timeout) ) {
unsigned long long effective_wait_timeout = std::min(
static_cast<unsigned long long>(mysql_thread___wait_timeout),
static_cast<unsigned long long>(sess->wait_timeout)
);
if ((sess_time/1000 > static_cast<unsigned long long>(mysql_thread___max_transaction_idle_time)) ||
(sess_time/1000 > effective_wait_timeout)) {
//numTrx = sess->NumActiveTransactions();
numTrx = sess->active_transactions;
if (numTrx) {

Loading…
Cancel
Save