diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 9014767fd..cef0858cc 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -131,6 +131,7 @@ class MySrvC { // MySQL Server Container public: MyHGC *myhgc; char *address; + char* resolved_ip; uint16_t port; uint16_t gtid_port; uint16_t flags; diff --git a/include/MySQL_Monitor.hpp b/include/MySQL_Monitor.hpp index 20b016601..113ecfcf1 100644 --- a/include/MySQL_Monitor.hpp +++ b/include/MySQL_Monitor.hpp @@ -309,7 +309,7 @@ public: bool add(const std::string& hostname, const std::string& ip); void remove(const std::string& hostname); void clear(); - std::string lookup(const std::string& hostname, bool return_hostname_if_lookup_fails) const; + std::string lookup(const std::string& hostname) const; void bulk_update(const std::list> bulk_record); private: @@ -329,8 +329,8 @@ struct DNS_Resolve_Data { class MySQL_Monitor { public: - static std::string dns_lookup(const std::string& hostname); - static std::string dns_lookup(const char* hostname); + static std::string dns_lookup(const std::string& hostname, bool return_hostname_if_lookup_fails = true); + static std::string dns_lookup(const char* hostname, bool return_hostname_if_lookup_fails = true); private: std::vector *tables_defs_monitor; diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 36e9cd72a..b8c43a2a2 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -839,7 +839,7 @@ void MySrvConnList::drop_all_connections() { } -MySrvC::MySrvC(char *add, uint16_t p, uint16_t gp, unsigned int _weight, enum MySerStatus _status, unsigned int _compression /*, uint8_t _charset */, unsigned int _max_connections, unsigned int _max_replication_lag, unsigned int _use_ssl, unsigned int _max_latency_ms, char *_comment) { +MySrvC::MySrvC(char *add, uint16_t p, uint16_t gp, unsigned int _weight, enum MySerStatus _status, unsigned int _compression /*, uint8_t _charset */, unsigned int _max_connections, unsigned int _max_replication_lag, unsigned int _use_ssl, unsigned int _max_latency_ms, char *_comment) : resolved_ip(NULL) { address=strdup(add); port=p; gtid_port=gp; @@ -951,6 +951,7 @@ void MySrvC::shun_and_killall() { MySrvC::~MySrvC() { if (address) free(address); if (comment) free(comment); + if (resolved_ip) free(resolved_ip); delete ConnectionsUsed; delete ConnectionsFree; } diff --git a/lib/MySQL_Monitor.cpp b/lib/MySQL_Monitor.cpp index 17de415b9..41279dbb3 100644 --- a/lib/MySQL_Monitor.cpp +++ b/lib/MySQL_Monitor.cpp @@ -5425,28 +5425,31 @@ void MySQL_Monitor::evaluate_aws_aurora_results(unsigned int wHG, unsigned int r #endif // TEST_AURORA } -std::string MySQL_Monitor::dns_lookup(const std::string& hostname) { +std::string MySQL_Monitor::dns_lookup(const std::string& hostname, bool return_hostname_if_lookup_fails) { // if IP was provided, no need to do lookup if (validate_ip(hostname)) return hostname; static thread_local std::shared_ptr dns_cache_thread; - const std::string& hostname_trim = trim(hostname); std::string ip; if (!dns_cache_thread && GloMyMon) dns_cache_thread = GloMyMon->dns_cache; if (dns_cache_thread) { - ip = dns_cache_thread->lookup(hostname_trim, false) ; + ip = dns_cache_thread->lookup(trim(hostname)) ; + + if (ip.empty() && return_hostname_if_lookup_fails) { + ip = hostname; + } } - return !ip.empty() ? ip : hostname_trim; + return ip; } -std::string MySQL_Monitor::dns_lookup(const char* hostname) { - return MySQL_Monitor::dns_lookup(std::string(hostname)); +std::string MySQL_Monitor::dns_lookup(const char* hostname, bool return_hostname_if_lookup_fails) { + return MySQL_Monitor::dns_lookup(std::string(hostname), return_hostname_if_lookup_fails); } bool DNS_Cache::add(const std::string& hostname, const std::string& ip) { @@ -5456,7 +5459,7 @@ bool DNS_Cache::add(const std::string& hostname, const std::string& ip) { int rc = pthread_rwlock_wrlock(&rwlock_); assert(rc == 0); try { - records.emplace(hostname, ip); + records[hostname] = ip; } catch (...) {} rc = pthread_rwlock_unlock(&rwlock_); @@ -5468,7 +5471,7 @@ bool DNS_Cache::add(const std::string& hostname, const std::string& ip) { return true; } -std::string DNS_Cache::lookup(const std::string& hostname, bool return_hostname_if_lookup_fails) const { +std::string DNS_Cache::lookup(const std::string& hostname) const { if (!enabled) return ""; std::string ip; @@ -5489,10 +5492,6 @@ std::string DNS_Cache::lookup(const std::string& hostname, bool return_hostname_ __sync_fetch_and_add(&GloMyMon->dns_cache_lookup_success, 1); } - if (ip.empty() && return_hostname_if_lookup_fails) { - ip = hostname; - } - return ip; } diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 344c87862..6e4e97733 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -808,7 +808,29 @@ void MySQL_Connection::connect_start() { } } if (parent->port) { - async_exit_status=mysql_real_connect_start(&ret_mysql, mysql, MySQL_Monitor::dns_lookup(parent->address).c_str(), userinfo->username, auth_password, userinfo->schemaname, parent->port, NULL, client_flags); + + char* host_ip = NULL; + const std::string& res_ip = MySQL_Monitor::dns_lookup(parent->address, false); + + if (!res_ip.empty()) { + + if (parent->resolved_ip) { + if (strcmp(parent->resolved_ip, res_ip.c_str()) != 0) { + free(parent->resolved_ip); + parent->resolved_ip = strdup(res_ip.c_str()); + } + } + else { + parent->resolved_ip = strdup(res_ip.c_str()); + } + + host_ip = parent->resolved_ip; + } + else { + host_ip = parent->address; + } + + async_exit_status=mysql_real_connect_start(&ret_mysql, mysql, host_ip, userinfo->username, auth_password, userinfo->schemaname, parent->port, NULL, client_flags); } else { async_exit_status=mysql_real_connect_start(&ret_mysql, mysql, "localhost", userinfo->username, auth_password, userinfo->schemaname, parent->port, parent->address, client_flags); }