ntpd: fix offset adjustment after step; better step printing
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 28 Feb 2012 01:45:00 +0000 (02:45 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 28 Feb 2012 01:45:00 +0000 (02:45 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ntpd.c

index 1df6476c1cae4fb867951e6a9e299b689a387bec..a8738951fae4ef284c98eff5061206822a952154 100644 (file)
 #define MAXPOLL         12      /* maximum poll interval (12: 1.1h, 17: 36.4h). std ntpd uses 17 */
 /* Actively lower poll when we see such big offsets.
  * With STEP_THRESHOLD = 0.125, it means we try to sync more aggressively
- * if offset increases over 0.03 sec */
-#define POLLDOWN_OFFSET (STEP_THRESHOLD / 4)
+ * if offset increases over ~0.04 sec */
+#define POLLDOWN_OFFSET (STEP_THRESHOLD / 3)
 #define MINDISP         0.01    /* minimum dispersion (sec) */
 #define MAXDISP         16      /* maximum dispersion (sec) */
 #define MAXSTRAT        16      /* maximum stratum (infinity metric) */
  * we grow a counter: += MINPOLL. When it goes over POLLADJ_LIMIT,
  * we poll_exp++. If offset isn't small, counter -= poll_exp*2,
  * and when it goes below -POLLADJ_LIMIT, we poll_exp--
- * (bumped from 30 to 36 since otherwise I often see poll_exp going *2* steps down)
+ * (bumped from 30 to 40 since otherwise I often see poll_exp going *2* steps down)
  */
-#define POLLADJ_LIMIT   36
+#define POLLADJ_LIMIT   40
 /* If offset < POLLADJ_GATE * discipline_jitter, then we can increase
  * poll interval (we think we can't improve timekeeping
  * by staying at smaller poll).
@@ -622,7 +622,11 @@ reset_peer_stats(peer_t *p, double offset)
                if (small_ofs) {
                        p->filter_datapoint[i].d_recv_time += offset;
                        if (p->filter_datapoint[i].d_offset != 0) {
-                               p->filter_datapoint[i].d_offset += offset;
+                               p->filter_datapoint[i].d_offset -= offset;
+                               //bb_error_msg("p->filter_datapoint[%d].d_offset %f -> %f",
+                               //      i,
+                               //      p->filter_datapoint[i].d_offset + offset,
+                               //      p->filter_datapoint[i].d_offset);
                        }
                } else {
                        p->filter_datapoint[i].d_recv_time  = G.cur_time;
@@ -808,22 +812,24 @@ step_time(double offset)
 {
        llist_t *item;
        double dtime;
-       struct timeval tv;
-       char buf[80];
+       struct timeval tvc, tvn;
+       char buf[sizeof("yyyy-mm-dd hh:mm:ss") + /*paranoia:*/ 4];
        time_t tval;
 
-       gettimeofday(&tv, NULL); /* never fails */
-       dtime = offset + tv.tv_sec;
-       dtime += 1.0e-6 * tv.tv_usec;
-       d_to_tv(dtime, &tv);
-
-       if (settimeofday(&tv, NULL) == -1)
+       gettimeofday(&tvc, NULL); /* never fails */
+       dtime = tvc.tv_sec + (1.0e-6 * tvc.tv_usec) + offset;
+       d_to_tv(dtime, &tvn);
+       if (settimeofday(&tvn, NULL) == -1)
                bb_perror_msg_and_die("settimeofday");
 
-       tval = tv.tv_sec;
-       strftime(buf, sizeof(buf), "%a %b %e %H:%M:%S %Z %Y", localtime(&tval));
-
-       bb_error_msg("setting clock to %s (offset %fs)", buf, offset);
+       VERB2 {
+               tval = tvc.tv_sec;
+               strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&tval));
+               bb_error_msg("current time is %s.%06u", buf, (unsigned)tvc.tv_usec);
+       }
+       tval = tvn.tv_sec;
+       strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&tval));
+       bb_error_msg("setting time to %s.%06u (offset %+fs)", buf, (unsigned)tvn.tv_usec, offset);
 
        /* Correct various fields which contain time-relative values: */