Loading res_cache.cpp +14 −7 Original line number Diff line number Diff line Loading @@ -1696,13 +1696,13 @@ void resolv_populate_res_for_net(ResState* statp) { /* Resolver reachability statistics. */ static void _res_cache_add_stats_sample_locked(res_stats* stats, const res_sample* sample, static void res_cache_add_stats_sample_locked(res_stats* stats, const res_sample& sample, int max_samples) { // Note: This function expects max_samples > 0, otherwise a (harmless) modification of the // allocated but supposedly unused memory for samples[0] will happen LOG(INFO) << __func__ << ": adding sample to stats, next = " << unsigned(stats->sample_next) << ", count = " << unsigned(stats->sample_count); stats->samples[stats->sample_next] = *sample; stats->samples[stats->sample_next] = sample; if (stats->sample_count < max_samples) { ++stats->sample_count; } Loading Loading @@ -1815,15 +1815,22 @@ int resolv_cache_get_resolver_stats(unsigned netid, res_params* params, res_stat return -1; } void _resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id, int ns, const res_sample* sample, int max_samples) { if (max_samples <= 0) return; void resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id, const sockaddr* sa, const res_sample& sample, int max_samples) { if (max_samples <= 0 || sa == nullptr) return; std::lock_guard guard(cache_mutex); resolv_cache_info* info = find_cache_info_locked(netid); if (info && info->revision_id == revision_id) { _res_cache_add_stats_sample_locked(&info->nsstats[ns], sample, max_samples); const int serverNum = std::min(MAXNS, static_cast<int>(info->nameserverSockAddrs.size())); const IPSockAddr ipsa = IPSockAddr::toIPSockAddr(*sa); for (int ns = 0; ns < serverNum; ns++) { if (ipsa == info->nameserverSockAddrs.at(ns)) { res_cache_add_stats_sample_locked(&info->nsstats[ns], sample, max_samples); return; } } } } Loading res_send.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -530,7 +530,7 @@ int res_nsend(res_state statp, const uint8_t* buf, int buflen, uint8_t* ans, int if (shouldRecordStats) { res_sample sample; _res_stats_set_sample(&sample, now, *rcode, delay); _resolv_cache_add_resolver_stats_sample(statp->netid, revision_id, ns, &sample, resolv_cache_add_resolver_stats_sample(statp->netid, revision_id, nsap, sample, params.max_samples); resolv_stats_add(statp->netid, IPSockAddr::toIPSockAddr(*nsap), dnsQueryEvent); } Loading Loading @@ -564,7 +564,7 @@ int res_nsend(res_state statp, const uint8_t* buf, int buflen, uint8_t* ans, int if (attempt == 0) { res_sample sample; _res_stats_set_sample(&sample, now, *rcode, delay); _resolv_cache_add_resolver_stats_sample(statp->netid, revision_id, ns, &sample, resolv_cache_add_resolver_stats_sample(statp->netid, revision_id, nsap, sample, params.max_samples); resolv_stats_add(statp->netid, IPSockAddr::toIPSockAddr(*nsap), dnsQueryEvent); } Loading resolv_private.h +2 −2 Original line number Diff line number Diff line Loading @@ -116,8 +116,8 @@ int resolv_cache_get_resolver_stats(unsigned netid, res_params* params, res_stat /* Add a sample to the shared struct for the given netid and server, provided that the * revision_id of the stored servers has not changed. */ void _resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id, int ns, const res_sample* sample, int max_samples); void resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id, const sockaddr* sa, const res_sample& sample, int max_samples); // Calculate the round-trip-time from start time t0 and end time t1. int _res_stats_calculate_rtt(const timespec* t1, const timespec* t0); Loading Loading
res_cache.cpp +14 −7 Original line number Diff line number Diff line Loading @@ -1696,13 +1696,13 @@ void resolv_populate_res_for_net(ResState* statp) { /* Resolver reachability statistics. */ static void _res_cache_add_stats_sample_locked(res_stats* stats, const res_sample* sample, static void res_cache_add_stats_sample_locked(res_stats* stats, const res_sample& sample, int max_samples) { // Note: This function expects max_samples > 0, otherwise a (harmless) modification of the // allocated but supposedly unused memory for samples[0] will happen LOG(INFO) << __func__ << ": adding sample to stats, next = " << unsigned(stats->sample_next) << ", count = " << unsigned(stats->sample_count); stats->samples[stats->sample_next] = *sample; stats->samples[stats->sample_next] = sample; if (stats->sample_count < max_samples) { ++stats->sample_count; } Loading Loading @@ -1815,15 +1815,22 @@ int resolv_cache_get_resolver_stats(unsigned netid, res_params* params, res_stat return -1; } void _resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id, int ns, const res_sample* sample, int max_samples) { if (max_samples <= 0) return; void resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id, const sockaddr* sa, const res_sample& sample, int max_samples) { if (max_samples <= 0 || sa == nullptr) return; std::lock_guard guard(cache_mutex); resolv_cache_info* info = find_cache_info_locked(netid); if (info && info->revision_id == revision_id) { _res_cache_add_stats_sample_locked(&info->nsstats[ns], sample, max_samples); const int serverNum = std::min(MAXNS, static_cast<int>(info->nameserverSockAddrs.size())); const IPSockAddr ipsa = IPSockAddr::toIPSockAddr(*sa); for (int ns = 0; ns < serverNum; ns++) { if (ipsa == info->nameserverSockAddrs.at(ns)) { res_cache_add_stats_sample_locked(&info->nsstats[ns], sample, max_samples); return; } } } } Loading
res_send.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -530,7 +530,7 @@ int res_nsend(res_state statp, const uint8_t* buf, int buflen, uint8_t* ans, int if (shouldRecordStats) { res_sample sample; _res_stats_set_sample(&sample, now, *rcode, delay); _resolv_cache_add_resolver_stats_sample(statp->netid, revision_id, ns, &sample, resolv_cache_add_resolver_stats_sample(statp->netid, revision_id, nsap, sample, params.max_samples); resolv_stats_add(statp->netid, IPSockAddr::toIPSockAddr(*nsap), dnsQueryEvent); } Loading Loading @@ -564,7 +564,7 @@ int res_nsend(res_state statp, const uint8_t* buf, int buflen, uint8_t* ans, int if (attempt == 0) { res_sample sample; _res_stats_set_sample(&sample, now, *rcode, delay); _resolv_cache_add_resolver_stats_sample(statp->netid, revision_id, ns, &sample, resolv_cache_add_resolver_stats_sample(statp->netid, revision_id, nsap, sample, params.max_samples); resolv_stats_add(statp->netid, IPSockAddr::toIPSockAddr(*nsap), dnsQueryEvent); } Loading
resolv_private.h +2 −2 Original line number Diff line number Diff line Loading @@ -116,8 +116,8 @@ int resolv_cache_get_resolver_stats(unsigned netid, res_params* params, res_stat /* Add a sample to the shared struct for the given netid and server, provided that the * revision_id of the stored servers has not changed. */ void _resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id, int ns, const res_sample* sample, int max_samples); void resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id, const sockaddr* sa, const res_sample& sample, int max_samples); // Calculate the round-trip-time from start time t0 and end time t1. int _res_stats_calculate_rtt(const timespec* t1, const timespec* t0); Loading