[PATCH] ntpd: postpone hostname resolution if fails on startup

Kaarle Ritvanen kaarle.ritvanen at datakunkku.fi
Thu May 12 21:00:11 UTC 2016


Signed-off-by: Kaarle Ritvanen <kaarle.ritvanen at datakunkku.fi>
---

function                                             old     new   delta
resolve_peer_hostname                                  -      85     +85
static.set_next                                        -      23     +23
step_time                                            385     377      -8
add_peers                                            224     215      -9
recv_and_process_peer_pkt                           2206    2194     -12
.rodata                                           156130  156114     -16
ntpd_main                                           1150    1086     -64
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 0/5 up/down: 108/-109)           Total: -1 bytes

 networking/ntpd.c | 116 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 63 insertions(+), 53 deletions(-)

diff --git a/networking/ntpd.c b/networking/ntpd.c
index 4103189..7f7d69e 100644
--- a/networking/ntpd.c
+++ b/networking/ntpd.c
@@ -765,34 +765,48 @@ reset_peer_stats(peer_t *p, double offset)
 }
 
 static void
+resolve_peer_hostname(peer_t *p) {
+	len_and_sockaddr *lsa = host2sockaddr(p->p_hostname, 123);
+	if (lsa) {
+		if (p->p_lsa) {
+			free(p->p_lsa);
+			free(p->p_dotted);
+		}
+		p->p_lsa = lsa;
+		p->p_dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa);
+	}
+	set_next(p, lsa ? 0 : RETRY_INTERVAL);
+}
+
+static void
 add_peers(const char *s)
 {
 	llist_t *item;
 	peer_t *p;
 
 	p = xzalloc(sizeof(*p));
-	p->p_lsa = xhost2sockaddr(s, 123);
-	p->p_dotted = xmalloc_sockaddr2dotted_noport(&p->p_lsa->u.sa);
+	p->p_hostname = xstrdup(s);
+	resolve_peer_hostname(p);
 
 	/* Names like N.<country2chars>.pool.ntp.org are randomly resolved
 	 * to a pool of machines. Sometimes different N's resolve to the same IP.
 	 * It is not useful to have two peers with same IP. We skip duplicates.
 	 */
-	for (item = G.ntp_peers; item != NULL; item = item->link) {
-		peer_t *pp = (peer_t *) item->data;
-		if (strcmp(p->p_dotted, pp->p_dotted) == 0) {
-			bb_error_msg("duplicate peer %s (%s)", s, p->p_dotted);
-			free(p->p_lsa);
-			free(p->p_dotted);
-			free(p);
-			return;
+	if (p->p_lsa)
+		for (item = G.ntp_peers; item != NULL; item = item->link) {
+			peer_t *pp = (peer_t *) item->data;
+			if (pp->p_lsa && strcmp(p->p_dotted, pp->p_dotted) == 0) {
+				bb_error_msg("duplicate peer %s (%s)", s, p->p_dotted);
+				free(p->p_hostname);
+				free(p->p_lsa);
+				free(p->p_dotted);
+				free(p);
+				return;
+			}
 		}
-	}
 
-	p->p_hostname = xstrdup(s);
 	p->p_fd = -1;
 	p->p_xmt_msg.m_status = MODE_CLIENT | (NTP_VERSION << 3);
-	p->next_action_time = G.cur_time; /* = set_next(p, 0); */
 	reset_peer_stats(p, STEP_THRESHOLD);
 
 	llist_add_to(&G.ntp_peers, p);
@@ -2317,54 +2331,50 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
 		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) {
-				if (p->p_fd == -1) {
-					/* Time to send new req */
-					if (--cnt == 0) {
-						VERB4 bb_error_msg("disabling burst mode");
-						G.polladj_count = 0;
-						G.poll_exp = MINPOLL;
-					}
-					send_query_to_peer(p);
-				} else {
-					/* Timed out waiting for reply */
-					close(p->p_fd);
-					p->p_fd = -1;
-					/* If poll interval is small, increase it */
-					if (G.poll_exp < BIGPOLL)
-						adjust_poll(MINPOLL);
-					timeout = poll_interval(NOREPLY_INTERVAL);
-					bb_error_msg("timed out waiting for %s, reach 0x%02x, next query in %us",
-							p->p_dotted, p->reachable_bits, timeout);
-
-					/* What if don't see it because it changed its IP? */
-					if (p->reachable_bits == 0) {
-						len_and_sockaddr *lsa = host2sockaddr(p->p_hostname, 123);
-						if (lsa) {
-							char *dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa);
-							//if (strcmp(dotted, p->p_dotted) != 0)
-							//	bb_error_msg("peer IP changed");
-							free(p->p_lsa);
-							free(p->p_dotted);
-							p->p_lsa = lsa;
-							p->p_dotted = dotted;
+			if (p->p_lsa) {
+
+				if (p->next_action_time <= G.cur_time) {
+					if (p->p_fd == -1) {
+						/* Time to send new req */
+						if (--cnt == 0) {
+							VERB4 bb_error_msg("disabling burst mode");
+							G.polladj_count = 0;
+							G.poll_exp = MINPOLL;
 						}
+						send_query_to_peer(p);
+					} else {
+						/* Timed out waiting for reply */
+						close(p->p_fd);
+						p->p_fd = -1;
+						/* If poll interval is small, increase it */
+						if (G.poll_exp < BIGPOLL)
+							adjust_poll(MINPOLL);
+						timeout = poll_interval(NOREPLY_INTERVAL);
+						bb_error_msg("timed out waiting for %s, reach 0x%02x, next query in %us",
+								p->p_dotted, p->reachable_bits, timeout);
+
+						/* What if don't see it because it changed its IP? */
+						if (p->reachable_bits == 0)
+							resolve_peer_hostname(p);
+
+						set_next(p, timeout);
 					}
+				}
 
-					set_next(p, timeout);
+				if (p->p_fd >= 0) {
+					/* Wait for reply from this peer */
+					pfd[i].fd = p->p_fd;
+					pfd[i].events = POLLIN;
+					idx2peer[i] = p;
+					i++;
 				}
-			}
+
+			} else
+				resolve_peer_hostname(p);
 
 			if (p->next_action_time < nextaction)
 				nextaction = p->next_action_time;
 
-			if (p->p_fd >= 0) {
-				/* Wait for reply from this peer */
-				pfd[i].fd = p->p_fd;
-				pfd[i].events = POLLIN;
-				idx2peer[i] = p;
-				i++;
-			}
 		}
 
 		timeout = nextaction - G.cur_time;
-- 
2.5.5



More information about the busybox mailing list