chiark / gitweb /
Revert "timesyncd: remove retry_timer logic which is covered by the server timeout"
authorKay Sievers <kay@vrfy.org>
Tue, 2 Sep 2014 13:28:56 +0000 (15:28 +0200)
committerKay Sievers <kay@vrfy.org>
Tue, 2 Sep 2014 13:29:15 +0000 (15:29 +0200)
This reverts commit 665c6a9eab46b0b253af6566ca9fc70c866b3fcd.

On Tue, Sep 2, 2014 at 3:17 PM, Miroslav Lichvar <mlichvar@redhat.com> wrote:
>
> With the other patch allowing missed replies included it's now getting
> stuck as there is no timer to send the 2nd and 3rd request.

src/timesync/timesyncd-manager.c
src/timesync/timesyncd-manager.h

index 3261bc1fb12edc221e11a0ed25d5eaa832fd43f3..a5678ccaed5ede60adadeeb5cb3132d916c1a809 100644 (file)
@@ -209,6 +209,19 @@ static int manager_send_request(Manager *m) {
                 return manager_connect(m);
         }
 
+        /* re-arm timer with increasing timeout, in case the packets never arrive back */
+        if (m->retry_interval > 0) {
+                if (m->retry_interval < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
+                        m->retry_interval *= 2;
+        } else
+                m->retry_interval = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
+
+        r = manager_arm_timer(m, m->retry_interval);
+        if (r < 0) {
+                log_error("Failed to rearm timer: %s", strerror(-r));
+                return r;
+        }
+
         m->missed_replies++;
         if (m->missed_replies > NTP_MAX_MISSED_REPLIES) {
                 r = sd_event_add_time(
@@ -596,6 +609,7 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re
 
         /* valid packet */
         m->pending = false;
+        m->retry_interval = 0;
 
         /* announce leap seconds */
         if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_PLUSSEC)
index 8296d41295f63ee97f633ee2ca41386cc133ecdb..c7efdc5dfb65209c5175ab5a78e0279c4e5e49aa 100644 (file)
@@ -60,6 +60,7 @@ struct Manager {
         /* last sent packet */
         struct timespec trans_time_mon;
         struct timespec trans_time;
+        usec_t retry_interval;
         bool pending;
 
         /* poll timer */