ntp: update resolving timeout ID

This will allow unresolved sources to be removed before resolving.
This commit is contained in:
Miroslav Lichvar 2020-02-19 13:51:47 +01:00
parent d7e3ad17ff
commit 2507b66640

View file

@ -115,7 +115,7 @@ static ARR_Instance pools;
/* ================================================== */ /* ================================================== */
/* Forward prototypes */ /* Forward prototypes */
static void resolve_sources(void *arg); static void resolve_sources(void);
static void rehash_records(void); static void rehash_records(void);
static void clean_source_record(SourceRecord *record); static void clean_source_record(SourceRecord *record);
static void remove_pool_sources(int pool, int tentative, int unresolved); static void remove_pool_sources(int pool, int tentative, int unresolved);
@ -419,6 +419,15 @@ process_resolved_name(struct UnresolvedSource *us, IPAddr *ip_addrs, int n_addrs
/* ================================================== */ /* ================================================== */
static void
resolve_sources_timeout(void *arg)
{
resolving_id = 0;
resolve_sources();
}
/* ================================================== */
static void static void
name_resolve_handler(DNS_Status status, int n_addrs, IPAddr *ip_addrs, void *anything) name_resolve_handler(DNS_Status status, int n_addrs, IPAddr *ip_addrs, void *anything)
{ {
@ -427,6 +436,7 @@ name_resolve_handler(DNS_Status status, int n_addrs, IPAddr *ip_addrs, void *any
us = (struct UnresolvedSource *)anything; us = (struct UnresolvedSource *)anything;
assert(us == resolving_source); assert(us == resolving_source);
assert(resolving_id == 0);
DEBUG_LOG("%s resolved to %d addrs", us->name, n_addrs); DEBUG_LOG("%s resolved to %d addrs", us->name, n_addrs);
@ -468,12 +478,10 @@ name_resolve_handler(DNS_Status status, int n_addrs, IPAddr *ip_addrs, void *any
/* This was the last source in the list. If some sources couldn't /* This was the last source in the list. If some sources couldn't
be resolved, try again in exponentially increasing interval. */ be resolved, try again in exponentially increasing interval. */
if (unresolved_sources) { if (unresolved_sources) {
if (resolving_interval < MIN_RESOLVE_INTERVAL) resolving_interval = CLAMP(MIN_RESOLVE_INTERVAL, resolving_interval + 1,
resolving_interval = MIN_RESOLVE_INTERVAL; MAX_RESOLVE_INTERVAL);
else if (resolving_interval < MAX_RESOLVE_INTERVAL) resolving_id = SCH_AddTimeoutByDelay(RESOLVE_INTERVAL_UNIT * (1 << resolving_interval),
resolving_interval++; resolve_sources_timeout, NULL);
resolving_id = SCH_AddTimeoutByDelay(RESOLVE_INTERVAL_UNIT *
(1 << resolving_interval), resolve_sources, NULL);
} else { } else {
resolving_interval = 0; resolving_interval = 0;
} }
@ -487,7 +495,7 @@ name_resolve_handler(DNS_Status status, int n_addrs, IPAddr *ip_addrs, void *any
/* ================================================== */ /* ================================================== */
static void static void
resolve_sources(void *arg) resolve_sources(void)
{ {
struct UnresolvedSource *us; struct UnresolvedSource *us;
@ -598,11 +606,12 @@ NSR_ResolveSources(void)
if (unresolved_sources) { if (unresolved_sources) {
/* Make sure no resolving is currently running */ /* Make sure no resolving is currently running */
if (!resolving_source) { if (!resolving_source) {
if (resolving_interval) { if (resolving_id != 0) {
SCH_RemoveTimeout(resolving_id); SCH_RemoveTimeout(resolving_id);
resolving_id = 0;
resolving_interval--; resolving_interval--;
} }
resolve_sources(NULL); resolve_sources();
} }
} else { } else {
/* No unresolved sources, we are done */ /* No unresolved sources, we are done */