[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