From: Denys Vlasenko Date: Sat, 7 Dec 2013 16:29:03 +0000 (+0100) Subject: ntpd: do not invalidate datapoints after step X-Git-Tag: 1_22_0~15 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=777be10ebebb4afdaf057a5abe094c86eb6d8a2c;p=oweals%2Fbusybox.git ntpd: do not invalidate datapoints after step Used to set p->filter_datapoint[i].d_dispersion = MAXDISP and clear reachable bits, but this proved to be too agressive: after step (tested with suspinding laptop for ~30 secs), this caused all previous data to be considered invalid, making us needing to collect full ~8 datapoins per peer after step in order to start trusting them. In turn, this was making poll interval decrease even after step was done. (Poll interval decreases already before step in this scenario, because we see large offsets and end up with no good peer to select). function old new delta reset_peer_stats 157 139 -18 Signed-off-by: Denys Vlasenko --- diff --git a/networking/ntpd.c b/networking/ntpd.c index f3a4177da..fd2f24a89 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c @@ -678,6 +678,18 @@ reset_peer_stats(peer_t *p, double offset) int i; bool small_ofs = fabs(offset) < 16 * STEP_THRESHOLD; + /* Used to set p->filter_datapoint[i].d_dispersion = MAXDISP + * and clear reachable bits, but this proved to be too agressive: + * after step (tested with suspinding laptop for ~30 secs), + * this caused all previous data to be considered invalid, + * making us needing to collect full ~8 datapoins per peer + * after step in order to start trusting them. + * In turn, this was making poll interval decrease even after + * step was done. (Poll interval decreases already before step + * in this scenario, because we see large offsets and end up with + * no good peer to select). + */ + for (i = 0; i < NUM_DATAPOINTS; i++) { if (small_ofs) { p->filter_datapoint[i].d_recv_time += offset; @@ -691,13 +703,13 @@ reset_peer_stats(peer_t *p, double offset) } else { p->filter_datapoint[i].d_recv_time = G.cur_time; p->filter_datapoint[i].d_offset = 0; - p->filter_datapoint[i].d_dispersion = MAXDISP; + /*p->filter_datapoint[i].d_dispersion = MAXDISP;*/ } } if (small_ofs) { p->lastpkt_recv_time += offset; } else { - p->reachable_bits = 0; + /*p->reachable_bits = 0;*/ p->lastpkt_recv_time = G.cur_time; } filter_datapoints(p); /* recalc p->filter_xxx */