瀏覽代碼

ntpd: perform DNS resolution out of send/receive loop - closes 10466

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>
Denys Vlasenko 6 年之前
父節點
當前提交
a1e9bc6876
共有 1 個文件被更改,包括 10 次插入4 次删除
  1. 10 4
      networking/ntpd.c

+ 10 - 4
networking/ntpd.c

@@ -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;