summaryrefslogtreecommitdiff
path: root/src/timesync/timesyncd-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/timesync/timesyncd-manager.c')
-rw-r--r--src/timesync/timesyncd-manager.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/timesync/timesyncd-manager.c b/src/timesync/timesyncd-manager.c
index 696dd10e69..b7b39ef822 100644
--- a/src/timesync/timesyncd-manager.c
+++ b/src/timesync/timesyncd-manager.c
@@ -875,6 +875,7 @@ int manager_connect(Manager *m) {
manager_set_server_name(m, m->current_server_name->names_next);
else {
ServerName *f;
+ bool restart = true;
/* Our current server name list is exhausted,
* let's find the next one to iterate. First
@@ -891,6 +892,8 @@ int manager_connect(Manager *m) {
f = m->link_servers;
if (!f)
f = m->system_servers;
+ else
+ restart = false;
}
if (!f)
@@ -902,6 +905,25 @@ int manager_connect(Manager *m) {
return 0;
}
+ if (restart && !m->exhausted_servers && m->poll_interval_usec) {
+ log_debug("Waiting after exhausting servers.");
+ 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);
+ if (r < 0) {
+ log_error("Failed to create retry timer: %s", strerror(-r));
+ return r;
+ }
+
+ m->exhausted_servers = true;
+
+ /* Increase the polling interval */
+ if (m->poll_interval_usec < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
+ m->poll_interval_usec *= 2;
+
+ return 0;
+ }
+
+ m->exhausted_servers = false;
+
manager_set_server_name(m, f);
}
@@ -1042,7 +1064,7 @@ static int manager_network_event_handler(sd_event_source *s, int fd, uint32_t re
online = network_is_online();
/* check if the client is currently connected */
- connected = m->server_socket >= 0 || m->resolve_query;
+ connected = m->server_socket >= 0 || m->resolve_query || m->exhausted_servers;
if (connected && !online) {
log_info("No network connectivity, watching for changes.");