84 lines
3.5 KiB
Diff
84 lines
3.5 KiB
Diff
|
From 75d472e1a9a5bfbfc572443eece28322caef0792 Mon Sep 17 00:00:00 2001
|
||
|
From: Michal Schmidt <mschmidt@redhat.com>
|
||
|
Date: Wed, 10 Sep 2014 19:44:24 +0200
|
||
|
Subject: [PATCH] timesyncd: wait before reconnecting to first server
|
||
|
|
||
|
Upstream commit:
|
||
|
commit 63463bf091949e0178b749016828ec400c106582
|
||
|
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
||
|
Date: Wed Aug 27 16:47:24 2014 +0200
|
||
|
|
||
|
timesyncd: wait before reconnecting to first server
|
||
|
|
||
|
When all servers are exhausted, wait for one poll interval before trying
|
||
|
to connect again to the first server in the list. Also, keep increasing
|
||
|
the polling interval to make sure a client not getting any valid replies
|
||
|
will not send requests to any server more frequently than is allowed by
|
||
|
the maximum polling interval.
|
||
|
|
||
|
Conflicts:
|
||
|
src/timesync/timesyncd-manager.c
|
||
|
---
|
||
|
src/timesync/timesyncd.c | 22 +++++++++++++++++++++-
|
||
|
src/timesync/timesyncd.h | 1 +
|
||
|
2 files changed, 22 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c
|
||
|
index 5187df58c2..589c5ec521 100644
|
||
|
--- a/src/timesync/timesyncd.c
|
||
|
+++ b/src/timesync/timesyncd.c
|
||
|
@@ -935,12 +935,32 @@ static int manager_connect(Manager *m) {
|
||
|
if (m->current_server_name && m->current_server_name->names_next)
|
||
|
m->current_server_name = m->current_server_name->names_next;
|
||
|
else {
|
||
|
+
|
||
|
if (!m->servers) {
|
||
|
m->current_server_name = NULL;
|
||
|
log_debug("No server found.");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+ if (!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, 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;
|
||
|
+
|
||
|
m->current_server_name = m->servers;
|
||
|
}
|
||
|
|
||
|
@@ -1150,7 +1170,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 != -1);
|
||
|
+ connected = (m->server_socket != -1) || m->exhausted_servers;
|
||
|
|
||
|
if (connected && !online) {
|
||
|
log_info("No network connectivity, watching for changes.");
|
||
|
diff --git a/src/timesync/timesyncd.h b/src/timesync/timesyncd.h
|
||
|
index 4afe4b9f5b..04d83f0cc9 100644
|
||
|
--- a/src/timesync/timesyncd.h
|
||
|
+++ b/src/timesync/timesyncd.h
|
||
|
@@ -49,6 +49,7 @@ struct Manager {
|
||
|
LIST_HEAD(ServerName, servers);
|
||
|
|
||
|
RateLimit ratelimit;
|
||
|
+ bool exhausted_servers;
|
||
|
|
||
|
/* network */
|
||
|
sd_event_source *network_event_source;
|