]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
timesync: Make delaying attempts to contact servers configurable
authorSusant Sahani <ssahani@vmware.com>
Thu, 10 Dec 2020 18:54:19 +0000 (19:54 +0100)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 14 Dec 2020 23:52:51 +0000 (08:52 +0900)
```
❯ ssh sus@xx.xx.xx.xx
Last login: Sat Nov 14 17:32:08 2020 from 10.104.45.138
 17:36:19 up 0 min,  0 users,  load average: 0.00, 0.00, 0.00
> systemd-analyze blame
Bootup is not yet finished (org.freedesktop.systemd1.Manager.FinishTimestampMonotonic=0).
Please try again later.
Hint: Use 'systemctl list-jobs' to see active jobs
> systemd-analyze blame
43.954s systemd-time-wait-sync.service
 1.969s systemd-networkd-wait-online.service
 1.559s cloud-init-local.service
 1.039s cloud-init.service
  414ms cloud-final.service
  387ms dracut-initqueue.service
  382ms initrd-switch-root.service
  380ms cloud-config.service
  198ms systemd-journal-flush.service
  136ms systemd-udev-trigger.service
  115ms initrd-parse-etc.service
   97ms systemd-timesyncd.service
   84ms systemd-journald.service

```

After made it configurable and set to 5s

```
❯ ssh sus@xx.xx.xx.xx
Last login: Sat Nov 14 18:41:42 2020 from 10.104.45.138
 18:42:36 up 0 min,  0 users,  load average: 0.16, 0.03, 0.01
> systemd-analyze blame
10.450s systemd-time-wait-sync.service
 8.303s systemd-networkd-wait-online.service
 1.621s cloud-init-local.service
 1.068s cloud-init.service
```

man/timesyncd.conf.xml
src/timesync/timesyncd-conf.c
src/timesync/timesyncd-gperf.gperf
src/timesync/timesyncd-manager.c
src/timesync/timesyncd-manager.h

index 1cbea9eaa55d10dfc2075b291dc048f2f17446d3..da2b320a43b087c9a29fe0276e5f0a44ee63c69b 100644 (file)
         <varname>PollIntervalMaxSec=</varname> defaults to 2048 seconds.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>ConnectionRetrySec=</varname></term>
+        <listitem><para>Specifies the delaying attempts to contact servers after network is online. Takes a time value (in seconds).
+        Defaults to 30 seconds and must not be smaller than 1 seconds.</para></listitem>
+      </varlistentry>
+
     </variablelist>
   </refsect1>
 
index 2c3114613bbe1ee3376eabce9fa7b9f5ecd6ec96..8f34441e156eff5a68cbb2ccc8d1a111f0a2a3b3 100644 (file)
@@ -124,5 +124,10 @@ int manager_parse_config_file(Manager *m) {
                 m->poll_interval_max_usec = MAX(NTP_POLL_INTERVAL_MAX_USEC, m->poll_interval_min_usec * 32);
         }
 
+        if (m->connection_retry_usec < 1 * USEC_PER_SEC) {
+                log_warning("Invalid ConnectionRetrySec=. Using default value.");
+                m->connection_retry_usec = DEFAULT_CONNECTION_RETRY_USEC;
+        }
+
         return r;
 }
index b5020276afbfc724f7b9f0d41e6c8ad0ea8464b9..76e4f632776ff64b13e20bd76318ea1f40e696c4 100644 (file)
@@ -17,9 +17,10 @@ struct ConfigPerfItem;
 %struct-type
 %includes
 %%
-Time.NTP,                 config_parse_servers, SERVER_SYSTEM,   0
-Time.Servers,             config_parse_servers, SERVER_SYSTEM,   0
-Time.FallbackNTP,         config_parse_servers, SERVER_FALLBACK, 0
-Time.RootDistanceMaxSec,  config_parse_sec,     0,               offsetof(Manager, max_root_distance_usec)
-Time.PollIntervalMinSec,  config_parse_sec,     0,               offsetof(Manager, poll_interval_min_usec)
-Time.PollIntervalMaxSec,  config_parse_sec,     0,               offsetof(Manager, poll_interval_max_usec)
+Time.NTP,                            config_parse_servers, SERVER_SYSTEM,   0
+Time.Servers,                        config_parse_servers, SERVER_SYSTEM,   0
+Time.FallbackNTP,                    config_parse_servers, SERVER_FALLBACK, 0
+Time.RootDistanceMaxSec,             config_parse_sec,     0,               offsetof(Manager, max_root_distance_usec)
+Time.PollIntervalMinSec,             config_parse_sec,     0,               offsetof(Manager, poll_interval_min_usec)
+Time.PollIntervalMaxSec,             config_parse_sec,     0,               offsetof(Manager, poll_interval_max_usec)
+Time.ConnectionRetrySec,             config_parse_sec,     0,               offsetof(Manager, connection_retry_usec)
index 93ba4ef87d49fa068c2f924daa59c9f107a03766..07fee57391736787519555f57df3b7c414a5176f 100644 (file)
@@ -50,7 +50,6 @@
 /* Maximum number of missed replies before selecting another source. */
 #define NTP_MAX_MISSED_REPLIES          2
 
-#define RETRY_USEC (30*USEC_PER_SEC)
 #define RATELIMIT_INTERVAL_USEC (10*USEC_PER_SEC)
 #define RATELIMIT_BURST 10
 
@@ -787,7 +786,8 @@ int manager_connect(Manager *m) {
         if (!ratelimit_below(&m->ratelimit)) {
                 log_debug("Delaying attempts to contact servers.");
 
-                r = sd_event_add_time_relative(m->event, &m->event_retry, clock_boottime_or_monotonic(), RETRY_USEC, 0, manager_retry_connect, m);
+                r = sd_event_add_time_relative(m->event, &m->event_retry, clock_boottime_or_monotonic(), m->connection_retry_usec,
+                                               0, manager_retry_connect, m);
                 if (r < 0)
                         return log_error_errno(r, "Failed to create retry timer: %m");
 
@@ -1085,6 +1085,8 @@ int manager_new(Manager **ret) {
         m->poll_interval_min_usec = NTP_POLL_INTERVAL_MIN_USEC;
         m->poll_interval_max_usec = NTP_POLL_INTERVAL_MAX_USEC;
 
+        m->connection_retry_usec = DEFAULT_CONNECTION_RETRY_USEC;
+
         m->server_socket = m->clock_watch_fd = -1;
 
         m->ratelimit = (RateLimit) { RATELIMIT_INTERVAL_USEC, RATELIMIT_BURST };
index 940a88ed7ba03e90b85b94ff790f82222ee8eae8..37cf4061901a54529a55439ce44212d912bebed7 100644 (file)
@@ -27,6 +27,8 @@ typedef struct Manager Manager;
 #define NTP_RETRY_INTERVAL_MIN_USEC     (15 * USEC_PER_SEC)
 #define NTP_RETRY_INTERVAL_MAX_USEC     (6 * 60 * USEC_PER_SEC) /* 6 minutes */
 
+#define DEFAULT_CONNECTION_RETRY_USEC (30*USEC_PER_SEC)
+
 struct Manager {
         sd_bus *bus;
         sd_event *event;
@@ -60,6 +62,7 @@ struct Manager {
         struct timespec trans_time_mon;
         struct timespec trans_time;
         usec_t retry_interval;
+        usec_t connection_retry_usec;
         bool pending;
 
         /* poll timer */