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
pull/1847/head^2
René Cannaò 7 years ago
parent e2874e4d2a
commit 6bdacade78

@ -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;

@ -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 */

@ -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;

@ -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) {

@ -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");

@ -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;
}

Loading…
Cancel
Save