}
int DNSResolver::resolve_srv_hosts(CephContext *cct, const string& service_name,
- const SRV_Protocol trans_protocol, map<string, entity_addr_t> *srv_hosts) {
+ const SRV_Protocol trans_protocol,
+ map<string, DNSResolver::Record> *srv_hosts) {
return this->resolve_srv_hosts(cct, service_name, trans_protocol, "", srv_hosts);
}
int DNSResolver::resolve_srv_hosts(CephContext *cct, const string& service_name,
const SRV_Protocol trans_protocol, const string& domain,
- map<string, entity_addr_t> *srv_hosts) {
+ map<string, DNSResolver::Record> *srv_hosts) {
#ifdef HAVE_RES_NQUERY
res_state res;
string srv_domain = full_srv_name.substr(full_srv_name.find(protocol)
+ protocol.length());
- int port = ns_get16(ns_rr_rdata(rr) + (NS_INT16SZ * 2)); /* port = rdata + priority + weight */
+ auto rdata = ns_rr_rdata(rr);
+ uint16_t priority = ns_get16(rdata); rdata += NS_INT16SZ;
+ rdata += NS_INT16SZ; // weight
+ uint16_t port = ns_get16(rdata); rdata += NS_INT16SZ;
memset(full_target, 0, sizeof(full_target));
ns_name_uncompress(ns_msg_base(handle), ns_msg_end(handle),
- ns_rr_rdata(rr) + (NS_INT16SZ * 3), /* comp_dn = rdata + priority + weight + port */
- full_target, sizeof(full_target));
+ rdata, full_target, sizeof(full_target));
entity_addr_t addr;
#ifdef HAVE_RES_NQUERY
string target = full_target;
assert(target.find(srv_domain) != target.npos);
target = target.substr(0, target.find(srv_domain));
- (*srv_hosts)[target] = addr;
+ (*srv_hosts)[target] = {priority, addr};
}
}
-
return 0;
}
}
-
#include <resolv.h>
#include "common/Mutex.h"
-
-struct entity_addr_t;
+#include "msg/msg_types.h" // for entity_addr_t
namespace ceph {
};
+ struct Record {
+ uint16_t priority;
+ entity_addr_t addr;
+ };
+
int resolve_cname(CephContext *cct, const std::string& hostname,
std::string *cname, bool *found);
* @returns 0 on success, negative error code on failure
*/
int resolve_srv_hosts(CephContext *cct, const std::string& service_name,
- const SRV_Protocol trans_protocol, std::map<std::string, entity_addr_t> *srv_hosts);
+ const SRV_Protocol trans_protocol, std::map<std::string, Record> *srv_hosts);
/**
* Returns the list of hostnames and addresses that provide a given
*/
int resolve_srv_hosts(CephContext *cct, const std::string& service_name,
const SRV_Protocol trans_protocol, const std::string& domain,
- std::map<std::string, entity_addr_t> *srv_hosts);
+ std::map<std::string, Record> *srv_hosts);
private:
DNSResolver() : lock("DNSResolver") { resolv_h = new ResolvHWrapper(); }
void MonClient::_add_conns(uint64_t global_id)
{
- const unsigned num_mons = monmap.size();
- vector<unsigned> ranks(num_mons);
- for (unsigned i = 0; i < num_mons; i++) {
- ranks[i] = i;
+ uint16_t min_priority = std::numeric_limits<uint16_t>::max();
+ for (const auto& m : monmap.mon_info) {
+ if (m.second.priority < min_priority) {
+ min_priority = m.second.priority;
+ }
+ }
+ vector<unsigned> ranks;
+ for (const auto& m : monmap.mon_info) {
+ if (m.second.priority == min_priority) {
+ ranks.push_back(monmap.get_rank(m.first));
+ }
}
std::random_device rd;
std::mt19937 rng(rd());
std::shuffle(ranks.begin(), ranks.end(), rng);
-
unsigned n = cct->_conf->mon_client_hunt_parallel;
- if (n == 0 || n > monmap.size()) {
- n = num_mons;
+ if (n == 0 || n > ranks.size()) {
+ n = ranks.size();
}
for (unsigned i = 0; i < n; i++) {
_add_conn(ranks[i], global_id);
#endif
}
- map<string, entity_addr_t> addrs;
+ map<string, DNSResolver::Record> records;
DNSResolver::get_instance(resolvH)->resolve_srv_hosts(g_ceph_context, "cephmon",
- DNSResolver::SRV_Protocol::TCP, &addrs);
+ DNSResolver::SRV_Protocol::TCP, &records);
- ASSERT_EQ(addrs.size(), (unsigned int)3);
- map<string,entity_addr_t>::iterator it = addrs.find("mon.a");
- ASSERT_NE(it, addrs.end());
+ ASSERT_EQ(records.size(), (unsigned int)3);
+ auto it = records.find("mon.a");
+ ASSERT_NE(it, records.end());
std::ostringstream os;
- os << it->second;
+ os << it->second.addr;
ASSERT_EQ(os.str(), "192.168.1.11:6789/0");
os.str("");
- it = addrs.find("mon.b");
- ASSERT_NE(it, addrs.end());
- os << it->second;
+ it = records.find("mon.b");
+ ASSERT_NE(it, records.end());
+ os << it->second.addr;
ASSERT_EQ(os.str(), "192.168.1.12:6789/0");
os.str("");
- it = addrs.find("mon.c");
- ASSERT_NE(it, addrs.end());
- os << it->second;
+ it = records.find("mon.c");
+ ASSERT_NE(it, records.end());
+ os << it->second.addr;
ASSERT_EQ(os.str(), "192.168.1.13:6789/0");
}
#endif
}
- map<string, entity_addr_t> addrs;
+ map<string, DNSResolver::Record> records;
DNSResolver::get_instance(resolvH)->resolve_srv_hosts(g_ceph_context, "cephmon",
- DNSResolver::SRV_Protocol::TCP, "ceph.com", &addrs);
+ DNSResolver::SRV_Protocol::TCP, "ceph.com", &records);
- ASSERT_EQ(addrs.size(), (unsigned int)3);
- map<string,entity_addr_t>::iterator it = addrs.find("mon.a");
- ASSERT_NE(it, addrs.end());
+ ASSERT_EQ(records.size(), (unsigned int)3);
+ auto it = records.find("mon.a");
+ ASSERT_NE(it, records.end());
std::ostringstream os;
- os << it->second;
+ os << it->second.addr;
ASSERT_EQ(os.str(), "192.168.1.11:6789/0");
os.str("");
- it = addrs.find("mon.b");
- ASSERT_NE(it, addrs.end());
- os << it->second;
+ it = records.find("mon.b");
+ ASSERT_NE(it, records.end());
+ os << it->second.addr;
ASSERT_EQ(os.str(), "192.168.1.12:6789/0");
os.str("");
- it = addrs.find("mon.c");
- ASSERT_NE(it, addrs.end());
- os << it->second;
+ it = records.find("mon.c");
+ ASSERT_NE(it, records.end());
+ os << it->second.addr;
ASSERT_EQ(os.str(), "192.168.1.13:6789/0");
}
#endif
}
- map<string, entity_addr_t> addrs;
+ map<string, DNSResolver::Record> records;
int ret = DNSResolver::get_instance(resolvH)->resolve_srv_hosts(
- g_ceph_context, "noservice", DNSResolver::SRV_Protocol::TCP, "", &addrs);
+ g_ceph_context, "noservice", DNSResolver::SRV_Protocol::TCP, "", &records);
- ASSERT_EQ(ret, 0);
- ASSERT_EQ(addrs.size(), (unsigned int)0);
+ ASSERT_EQ(0, ret);
+ ASSERT_TRUE(records.empty());
}