Simplified and improved logic for connection cleanup and creation when a matching connection isn't found

pull/3203/head
Javier Jaramago Fernández 5 years ago
parent a42bdbdd8b
commit 60b6fd0222

@ -3132,34 +3132,29 @@ MySQL_Connection * MySrvConnList::get_random_MyConn(MySQL_Session *sess, bool ff
unsigned int pct_max_connections = (3 * mysrvc->max_connections) / 4;
unsigned int connections_to_free = 0;
if (pct_max_connections <= (conns_free + conns_used)) {
connections_to_free = (conns_free + conns_used) - pct_max_connections;
connections_to_free = connections_to_free == 0 ? 1 : connections_to_free;
}
if (conns_free >= 1) {
// connection cleanup is triggered when connectinos exceed 3/4 of the total
// allowed max connections, this cleanup ensures that at least *one connection*
// will be freed.
if (pct_max_connections <= (conns_free + conns_used)) {
connections_to_free = (conns_free + conns_used) - pct_max_connections;
if (connections_to_free == 0) connections_to_free = 1;
}
while (conns_free && connections_to_free) {
MySQL_Connection* conn = mysrvc->ConnectionsFree->remove(0);
delete conn;
while (conns_free && connections_to_free) {
MySQL_Connection* conn = mysrvc->ConnectionsFree->remove(0);
delete conn;
conns_free = mysrvc->ConnectionsFree->conns_length();
connections_to_free -= 1;
conns_free = mysrvc->ConnectionsFree->conns_length();
connections_to_free -= 1;
}
}
conns_used = mysrvc->ConnectionsUsed->conns_length();
if (mysrvc->max_connections > (conns_used + conns_free)) {
// we must create a new connection
conn = new MySQL_Connection();
conn->parent=mysrvc;
__sync_fetch_and_add(&MyHGM->status.server_connections_created, 1);
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 7, "Returning MySQL Connection %p, server %s:%d\n", conn, conn->parent->address, conn->parent->port);
} else {
// no suitable connection was found, and the number of
// used connections already reached 'max_connections'
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 7, "No suitable connection found, 'max_connections' reached for server %s:%d\n", conn->parent->address, conn->parent->port);
__sync_fetch_and_add(&MyHGM->status.server_connections_delayed, 1);
return NULL;
}
// we must create a new connection
conn = new MySQL_Connection();
conn->parent=mysrvc;
__sync_fetch_and_add(&MyHGM->status.server_connections_created, 1);
proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 7, "Returning MySQL Connection %p, server %s:%d\n", conn, conn->parent->address, conn->parent->port);
}
break;
case 1: //tracked options are OK , but CHANGE USER is required

Loading…
Cancel
Save