Continue name resolution fixing, add unit test

name_lookup() now returns all results given by getnameinfo(). When searching
for a server, finding one matching address in the lookup-results is enough for
a match.

Also, added a test for name_lookup(). The test is minimal on its own, as hardcoded
test cases are not generally valid.
This commit is contained in:
Esa Korhonen
2019-08-15 15:37:46 +03:00
parent 29ec15c8eb
commit e6bf020b9e
7 changed files with 142 additions and 43 deletions

View File

@ -124,21 +124,27 @@ MariaDBServer* MariaDBMonitor::get_server(const EndPoint& search_ep)
{
// Phase 2: Was not found with simple string compare. Try DNS resolving for endpoints with
// matching ports.
string target_addr = m_resolver.resolve_server(search_ep.host());
if (!target_addr.empty())
DNSResolver::StringSet target_addresses = m_resolver.resolve_server(search_ep.host());
if (!target_addresses.empty())
{
for (auto server : m_servers)
{
if (server->m_server_base->server->port == search_ep.port())
SERVER* srv = server->m_server_base->server;
if (srv->port == search_ep.port())
{
string server_addr = m_resolver.resolve_server(server->m_server_base->server->address);
if (server_addr == target_addr)
auto server_addresses = m_resolver.resolve_server(srv->address);
// The number of elements in the arrays is rarely over 1.
for (auto& address : server_addresses)
{
found = server;
break;
if (target_addresses.count(address) > 0)
{
found = server;
goto breakout;
}
}
}
}
breakout:;
}
}
return found;