ntpd: skip over setting next DNS resolution attempt if it is not needed
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 31 Oct 2017 15:53:23 +0000 (16:53 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 31 Oct 2017 15:53:23 +0000 (16:53 +0100)
function                                             old     new   delta
ntpd_main                                           1177    1197     +20
resolve_peer_hostname                                127     129      +2

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

index add282b1dccf40a4ad095b47e32c48beb491bf6e..0b60d003b619537d9028fa77ebc7fc984430be20 100644 (file)
@@ -805,6 +805,7 @@ resolve_peer_hostname(peer_t *p)
                VERB1 if (strcmp(p->p_hostname, p->p_dotted) != 0)
                        bb_error_msg("'%s' is %s", p->p_hostname, p->p_dotted);
                p->dns_errors = 0;
+               return lsa;
        }
        p->dns_errors = ((p->dns_errors << 1) | 1) & DNS_ERRORS_CAP;
        return lsa;
@@ -2441,6 +2442,7 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
                gettime1900d(); /* sets G.cur_time */
                if (nfds <= 0) {
                        double ct;
+                       int dns_error;
 
                        if (bb_got_signal)
                                break; /* poll was interrupted by a signal */
@@ -2456,16 +2458,19 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
                         * this way, we almost never overlap DNS resolution with
                         * "request-reply" packet round trip.
                         */
+                       dns_error = 0;
                        ct = G.cur_time;
                        for (item = G.ntp_peers; item != NULL; item = item->link) {
                                peer_t *p = (peer_t *) item->data;
                                if (p->next_action_time <= ct && !p->p_lsa) {
                                        /* This can take up to ~10 sec per each DNS query */
-                                       resolve_peer_hostname(p);
+                                       dns_error |= (!resolve_peer_hostname(p));
                                }
                        }
-                       gettime1900d(); /* sets G.cur_time (needed for set_next()) */
+                       if (!dns_error)
+                               goto check_unsync;
                        /* Set next time for those which are still not resolved */
+                       gettime1900d(); /* sets G.cur_time (needed for set_next()) */
                        for (item = G.ntp_peers; item != NULL; item = item->link) {
                                peer_t *p = (peer_t *) item->data;
                                if (p->next_action_time <= ct && !p->p_lsa) {