Zbigniew Jędrzejewski-Szmek 62fe94
From 63463bf091949e0178b749016828ec400c106582 Mon Sep 17 00:00:00 2001
Michal Schmidt d962ba
From: Miroslav Lichvar <mlichvar@redhat.com>
Michal Schmidt d962ba
Date: Wed, 27 Aug 2014 16:47:24 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] timesyncd: wait before reconnecting to first server
Michal Schmidt d962ba
Michal Schmidt d962ba
When all servers are exhausted, wait for one poll interval before trying
Michal Schmidt d962ba
to connect again to the first server in the list. Also, keep increasing
Michal Schmidt d962ba
the polling interval to make sure a client not getting any valid replies
Michal Schmidt d962ba
will not send requests to any server more frequently than is allowed by
Michal Schmidt d962ba
the maximum polling interval.
Michal Schmidt d962ba
---
Michal Schmidt d962ba
 src/timesync/timesyncd-manager.c | 24 +++++++++++++++++++++++-
Michal Schmidt d962ba
 src/timesync/timesyncd-manager.h |  1 +
Michal Schmidt d962ba
 2 files changed, 24 insertions(+), 1 deletion(-)
Michal Schmidt d962ba
Michal Schmidt d962ba
diff --git a/src/timesync/timesyncd-manager.c b/src/timesync/timesyncd-manager.c
Zbigniew Jędrzejewski-Szmek 62fe94
index 696dd10e69..b7b39ef822 100644
Michal Schmidt d962ba
--- a/src/timesync/timesyncd-manager.c
Michal Schmidt d962ba
+++ b/src/timesync/timesyncd-manager.c
Michal Schmidt d962ba
@@ -875,6 +875,7 @@ int manager_connect(Manager *m) {
Michal Schmidt d962ba
                         manager_set_server_name(m, m->current_server_name->names_next);
Michal Schmidt d962ba
                 else {
Michal Schmidt d962ba
                         ServerName *f;
Michal Schmidt d962ba
+                        bool restart = true;
Michal Schmidt d962ba
 
Michal Schmidt d962ba
                         /* Our current server name list is exhausted,
Michal Schmidt d962ba
                          * let's find the next one to iterate. First
Michal Schmidt d962ba
@@ -891,6 +892,8 @@ int manager_connect(Manager *m) {
Michal Schmidt d962ba
                                 f = m->link_servers;
Michal Schmidt d962ba
                                 if (!f)
Michal Schmidt d962ba
                                         f = m->system_servers;
Michal Schmidt d962ba
+                                else
Michal Schmidt d962ba
+                                        restart = false;
Michal Schmidt d962ba
                         }
Michal Schmidt d962ba
 
Michal Schmidt d962ba
                         if (!f)
Michal Schmidt d962ba
@@ -902,6 +905,25 @@ int manager_connect(Manager *m) {
Michal Schmidt d962ba
                                 return 0;
Michal Schmidt d962ba
                         }
Michal Schmidt d962ba
 
Michal Schmidt d962ba
+                        if (restart && !m->exhausted_servers && m->poll_interval_usec) {
Michal Schmidt d962ba
+                                log_debug("Waiting after exhausting servers.");
Michal Schmidt d962ba
+                                r = sd_event_add_time(m->event, &m->event_retry, clock_boottime_or_monotonic(), now(clock_boottime_or_monotonic()) + m->poll_interval_usec, 0, manager_retry_connect, m);
Michal Schmidt d962ba
+                                if (r < 0) {
Michal Schmidt d962ba
+                                        log_error("Failed to create retry timer: %s", strerror(-r));
Michal Schmidt d962ba
+                                        return r;
Michal Schmidt d962ba
+                                }
Michal Schmidt d962ba
+
Michal Schmidt d962ba
+                                m->exhausted_servers = true;
Michal Schmidt d962ba
+
Michal Schmidt d962ba
+                                /* Increase the polling interval */
Michal Schmidt d962ba
+                                if (m->poll_interval_usec < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
Michal Schmidt d962ba
+                                        m->poll_interval_usec *= 2;
Michal Schmidt d962ba
+
Michal Schmidt d962ba
+                                return 0;
Michal Schmidt d962ba
+                        }
Michal Schmidt d962ba
+
Michal Schmidt d962ba
+                        m->exhausted_servers = false;
Michal Schmidt d962ba
+
Michal Schmidt d962ba
                         manager_set_server_name(m, f);
Michal Schmidt d962ba
                 }
Michal Schmidt d962ba
 
Michal Schmidt d962ba
@@ -1042,7 +1064,7 @@ static int manager_network_event_handler(sd_event_source *s, int fd, uint32_t re
Michal Schmidt d962ba
         online = network_is_online();
Michal Schmidt d962ba
 
Michal Schmidt d962ba
         /* check if the client is currently connected */
Michal Schmidt d962ba
-        connected = m->server_socket >= 0 || m->resolve_query;
Michal Schmidt d962ba
+        connected = m->server_socket >= 0 || m->resolve_query || m->exhausted_servers;
Michal Schmidt d962ba
 
Michal Schmidt d962ba
         if (connected && !online) {
Michal Schmidt d962ba
                 log_info("No network connectivity, watching for changes.");
Michal Schmidt d962ba
diff --git a/src/timesync/timesyncd-manager.h b/src/timesync/timesyncd-manager.h
Zbigniew Jędrzejewski-Szmek 62fe94
index 2345bf8f36..bb3e50915e 100644
Michal Schmidt d962ba
--- a/src/timesync/timesyncd-manager.h
Michal Schmidt d962ba
+++ b/src/timesync/timesyncd-manager.h
Michal Schmidt d962ba
@@ -41,6 +41,7 @@ struct Manager {
Michal Schmidt d962ba
         LIST_HEAD(ServerName, fallback_servers);
Michal Schmidt d962ba
 
Michal Schmidt d962ba
         RateLimit ratelimit;
Michal Schmidt d962ba
+        bool exhausted_servers;
Michal Schmidt d962ba
 
Michal Schmidt d962ba
         /* network */
Michal Schmidt d962ba
         sd_event_source *network_event_source;