ntpd: perform DNS resolution out of send/receive loop - closes 10466
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 28 Oct 2017 15:54:24 +0000 (17:54 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 28 Oct 2017 15:56:43 +0000 (17:56 +0200)
Bad case: send request to server1good.com; then try to resolve server2bad.com -
this fails, and failure takes ~5 secs; then receive server1's
response 5 seconds later. We'll never sync up in this case...

function                                             old     new   delta
ntpd_main                                           1079    1106     +27

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ntpd.c

index 4f881eaf9534b62a2c498847e764047f4e479f17..8f792d16df4c3d86d8b5924ab1fcb1ac109fe88a 100644 (file)
@@ -866,10 +866,8 @@ do_sendto(int fd,
 static void
 send_query_to_peer(peer_t *p)
 {
-       if (!p->p_lsa) {
-               if (!resolve_peer_hostname(p))
-                       return;
-       }
+       if (!p->p_lsa)
+               return;
 
        /* Why do we need to bind()?
         * See what happens when we don't bind:
@@ -2360,6 +2358,14 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
                int nfds, timeout;
                double nextaction;
 
+               /* Resolve peer names to IPs, if not resolved yet */
+               for (item = G.ntp_peers; item != NULL; item = item->link) {
+                       peer_t *p = (peer_t *) item->data;
+
+                       if (p->next_action_time <= G.cur_time && !p->p_lsa)
+                               resolve_peer_hostname(p);
+               }
+
                /* Nothing between here and poll() blocks for any significant time */
 
                nextaction = G.cur_time + 3600;