From 6bdacade784e5ebaf326be3e595c106b6c092992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Wed, 19 Dec 2018 02:57:41 +0100 Subject: [PATCH] Added mysql-auto_increment_delay_multiplex #1828 Temporary disable multiplexing when last_insert_id is returned in OK packet. Multiplexing is disabled for mysql-auto_increment_delay_multiplex queries. mysql-auto_increment_delay_multiplex ranges from 0 to 1000000 . Default value is 5 --- include/MySQL_Thread.h | 1 + include/mysql_connection.h | 2 ++ include/proxysql_structs.h | 2 ++ lib/MySQL_Session.cpp | 5 +++++ lib/MySQL_Thread.cpp | 29 +++++++++++++++++++++++++++++ lib/mysql_connection.cpp | 2 ++ 6 files changed, 41 insertions(+) diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index 3ad5ba195..8d3241428 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -414,6 +414,7 @@ class MySQL_Threads_Handler int query_processor_iterations; int query_processor_regex; int reset_connection_algorithm; + int auto_increment_delay_multiplex; int long_query_time; int hostgroup_manager_verbose; int binlog_reader_connect_retry_msec; diff --git a/include/mysql_connection.h b/include/mysql_connection.h index f8397fb53..7b3d79bad 100644 --- a/include/mysql_connection.h +++ b/include/mysql_connection.h @@ -65,6 +65,7 @@ class MySQL_Connection { unsigned long long creation_time; unsigned long long last_time_used; unsigned long long timeout; + int auto_increment_delay_token; int fd; MySQL_STMTs_local_v14 *local_stmts; // local view of prepared statements MYSQL *mysql; @@ -180,5 +181,6 @@ class MySQL_Connection { void reset(); bool get_gtid(char *buff, uint64_t *trx_id); + void reduce_auto_increment_delay_token() { if (auto_increment_delay_token) auto_increment_delay_token--; }; }; #endif /* __CLASS_MYSQL_CONNECTION_H */ diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index ee0e7b527..8d39236ff 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -624,6 +624,7 @@ __thread int mysql_thread___connect_timeout_server_max; __thread int mysql_thread___query_processor_iterations; __thread int mysql_thread___query_processor_regex; __thread int mysql_thread___reset_connection_algorithm; +__thread int mysql_thread___auto_increment_delay_multiplex; __thread uint16_t mysql_thread___server_capabilities; __thread uint8_t mysql_thread___default_charset; __thread int mysql_thread___poll_timeout; @@ -740,6 +741,7 @@ extern __thread int mysql_thread___connect_timeout_server_max; extern __thread int mysql_thread___query_processor_iterations; extern __thread int mysql_thread___query_processor_regex; extern __thread int mysql_thread___reset_connection_algorithm; +extern __thread int mysql_thread___auto_increment_delay_multiplex; extern __thread uint16_t mysql_thread___server_capabilities; extern __thread uint8_t mysql_thread___default_charset; extern __thread int mysql_thread___poll_timeout; diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 8a70358d4..514b26a3c 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -2876,6 +2876,9 @@ handler_again: if (myconn->mysql->affected_rows) { if (myconn->mysql->affected_rows != ULLONG_MAX) { last_HG_affected_rows = current_hostgroup; + if (mysql_thread___auto_increment_delay_multiplex) { + myconn->auto_increment_delay_token = mysql_thread___auto_increment_delay_multiplex + 1; + } } } } @@ -2953,6 +2956,7 @@ handler_again: } RequestEnd(myds); + myds->myconn->reduce_auto_increment_delay_token(); 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; @@ -3222,6 +3226,7 @@ handler_again: } RequestEnd(myds); if (myds->myconn) { + myds->myconn->reduce_auto_increment_delay_token(); if (mysql_thread___multiplexing && (myds->myconn->reusable==true) && myds->myconn->IsActiveTransaction()==false && myds->myconn->MultiplexDisabled()==false) { myds->DSS=STATE_NOT_INITIALIZED; if (mysql_thread___autocommit_false_not_reusable && myds->myconn->IsAutoCommit()==false) { diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 3e0fe08af..357ebd18f 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -285,6 +285,7 @@ static char * mysql_thread_variables_names[]= { (char *)"query_processor_iterations", (char *)"query_processor_regex", (char *)"reset_connection_algorithm", + (char *)"auto_increment_delay_multiplex", (char *)"long_query_time", (char *)"query_cache_size_MB", (char *)"ping_interval_server_msec", @@ -402,6 +403,7 @@ MySQL_Threads_Handler::MySQL_Threads_Handler() { variables.query_processor_iterations=0; variables.query_processor_regex=1; variables.reset_connection_algorithm=2; + variables.auto_increment_delay_multiplex=5; variables.long_query_time=1000; variables.query_cache_size_MB=256; variables.init_connect=NULL; @@ -716,6 +718,19 @@ int MySQL_Threads_Handler::get_variable_int(char *name) { if (!strcasecmp(name,"binlog_reader_connect_retry_msec")) return (int)variables.binlog_reader_connect_retry_msec; if (!strcasecmp(name,"wait_timeout")) return (int)variables.wait_timeout; if (!strcasecmp(name,"reset_connection_algorithm")) return (int)variables.reset_connection_algorithm; + if (!strcasecmp(name,"throttle_max_bytes_per_second_to_client")) return (int)variables.throttle_max_bytes_per_second_to_client; + if (!strcasecmp(name,"throttle_ratio_server_to_client")) return (int)variables.throttle_ratio_server_to_client; + if (!strcasecmp(name,"max_connections")) return (int)variables.max_connections; + if (!strcasecmp(name,"max_stmts_per_connection")) return (int)variables.max_stmts_per_connection; + if (!strcasecmp(name,"max_stmts_cache")) return (int)variables.max_stmts_cache; + if (!strcasecmp(name,"mirror_max_concurrency")) return (int)variables.mirror_max_concurrency; + if (!strcasecmp(name,"mirror_max_queue_length")) return (int)variables.mirror_max_queue_length; + if (!strcasecmp(name,"default_query_delay")) return (int)variables.default_query_delay; + if (!strcasecmp(name,"default_query_timeout")) return (int)variables.default_query_timeout; + if (!strcasecmp(name,"query_processor_iterations")) return (int)variables.query_processor_iterations; + if (!strcasecmp(name,"query_processor_regex")) return (int)variables.query_processor_regex; + if (!strcasecmp(name,"auto_increment_delay_multiplex")) return (int)variables.auto_increment_delay_multiplex; + if (!strcasecmp(name,"default_max_latency_ms")) return (int)variables.default_max_latency_ms; if (!strcasecmp(name,"long_query_time")) return (int)variables.long_query_time; if (!strcasecmp(name,"free_connections_pct")) return (int)variables.free_connections_pct; if (!strcasecmp(name,"have_compress")) return (int)variables.have_compress; @@ -1063,6 +1078,10 @@ char * MySQL_Threads_Handler::get_variable(char *name) { // this is the public f sprintf(intbuf,"%d",variables.reset_connection_algorithm); return strdup(intbuf); } + if (!strcasecmp(name,"auto_increment_delay_multiplex")) { + sprintf(intbuf,"%d",variables.auto_increment_delay_multiplex); + return strdup(intbuf); + } if (!strcasecmp(name,"default_max_latency_ms")) { sprintf(intbuf,"%d",variables.default_max_latency_ms); return strdup(intbuf); @@ -1664,6 +1683,15 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t return false; } } + if (!strcasecmp(name,"auto_increment_delay_multiplex")) { + int intv=atoi(value); + if (intv >= 0 && intv <= 1000000) { + variables.auto_increment_delay_multiplex=intv; + return true; + } else { + return false; + } + } if (!strcasecmp(name,"default_max_latency_ms")) { int intv=atoi(value); if (intv >= 0 && intv <= 20*24*3600*1000) { @@ -3523,6 +3551,7 @@ void MySQL_Thread::refresh_variables() { mysql_thread___query_processor_iterations=GloMTH->get_variable_int((char *)"query_processor_iterations"); mysql_thread___query_processor_regex=GloMTH->get_variable_int((char *)"query_processor_regex"); mysql_thread___reset_connection_algorithm=GloMTH->get_variable_int((char *)"reset_connection_algorithm"); + mysql_thread___auto_increment_delay_multiplex=GloMTH->get_variable_int((char *)"auto_increment_delay_multiplex"); mysql_thread___default_max_latency_ms=GloMTH->get_variable_int((char *)"default_max_latency_ms"); mysql_thread___long_query_time=GloMTH->get_variable_int((char *)"long_query_time"); mysql_thread___query_cache_size_MB=GloMTH->get_variable_int((char *)"query_cache_size_MB"); diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index b51374b97..f1600eb99 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -219,6 +219,7 @@ MySQL_Connection::MySQL_Connection() { MyRS_reuse=NULL; unknown_transaction_status = false; creation_time=0; + auto_increment_delay_token = 0; processing_multi_statement=false; proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Creating new MySQL_Connection %p\n", this); local_stmts=new MySQL_STMTs_local_v14(false); // false by default, it is a backend @@ -1626,6 +1627,7 @@ bool MySQL_Connection::MultiplexDisabled() { if (status_flags & (STATUS_MYSQL_CONNECTION_TRANSACTION|STATUS_MYSQL_CONNECTION_USER_VARIABLE|STATUS_MYSQL_CONNECTION_PREPARED_STATEMENT|STATUS_MYSQL_CONNECTION_LOCK_TABLES|STATUS_MYSQL_CONNECTION_TEMPORARY_TABLE|STATUS_MYSQL_CONNECTION_GET_LOCK|STATUS_MYSQL_CONNECTION_NO_MULTIPLEX|STATUS_MYSQL_CONNECTION_SQL_LOG_BIN0|STATUS_MYSQL_CONNECTION_FOUND_ROWS) ) { ret=true; } + if (auto_increment_delay_token) return true; return ret; }