From 4ade7b882c3ace4eebcefde7dcbdcce8acf9475c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Laitl?= Date: Thu, 6 Jan 2022 17:45:35 +0000 Subject: [PATCH 1/2] client, server systemd units: make Restart=always truly respected Surprisingly, Restart=always may not _always_ restart the unit if it restarts too fast. Set a combination of options which should make systemd truly restart innernet always. See https://unix.stackexchange.com/q/289629/352972. The `RestartSec=60` is the main and important one which would prevent systemd from ever failing to restart innernet in the default settings (because with it it would never exceed the default limit of 5 restarts in 10 seconds). `StartLimitIntervalSec=0` option is a complementary one for explicitly disabling the logic, and may be removed from this PR if deemed unnecessary. Should fix tonarino/portal#1441 (link to issue in private repository). --- client/innernet@.service | 6 ++++++ server/innernet-server@.service | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/client/innernet@.service b/client/innernet@.service index 5c88c30e..62a76494 100644 --- a/client/innernet@.service +++ b/client/innernet@.service @@ -3,11 +3,17 @@ Description=innernet client daemon for %I After=network-online.target nss-lookup.target Wants=network-online.target nss-lookup.target PartOf=innernet.target +# Disable systemd's unit start rate limiting logic, which could override Restart=always. +# See https://unix.stackexchange.com/q/289629/352972 +StartLimitIntervalSec=0 [Service] Type=simple ExecStart=/usr/bin/innernet up %i --daemon --interval 60 Restart=always +# When the daemon exits, wait this amount of secs before restarting. Prevents innernet from +# start-looping each 100ms for example when there is a problem reaching the server. +RestartSec=60 [Install] WantedBy=multi-user.target diff --git a/server/innernet-server@.service b/server/innernet-server@.service index d4b3a6d4..6556d5f3 100644 --- a/server/innernet-server@.service +++ b/server/innernet-server@.service @@ -2,12 +2,18 @@ Description=innernet server for %I After=network-online.target nss-lookup.target Wants=network-online.target nss-lookup.target +# Disable systemd's unit start rate limiting logic, which could override Restart=always. +# See https://unix.stackexchange.com/q/289629/352972 +StartLimitIntervalSec=0 [Service] Type=simple Environment="RUST_LOG=info" ExecStart=/usr/bin/innernet-server serve %i Restart=always +# When the daemon exits, wait this amount of secs before restarting. Prevents innernet from +# start-looping each 100ms for example when there is a problem reaching the server. +RestartSec=60 [Install] WantedBy=multi-user.target From d7fa2558a2d731b528d2ebd7ad27771c1ffabdca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Laitl?= Date: Tue, 11 Jan 2022 16:25:35 +0000 Subject: [PATCH 2/2] Apply review suggestions, make changes to units more conservative --- client/innernet@.service | 10 ++++------ server/innernet-server@.service | 8 ++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/client/innernet@.service b/client/innernet@.service index 62a76494..ea50d21b 100644 --- a/client/innernet@.service +++ b/client/innernet@.service @@ -3,17 +3,15 @@ Description=innernet client daemon for %I After=network-online.target nss-lookup.target Wants=network-online.target nss-lookup.target PartOf=innernet.target -# Disable systemd's unit start rate limiting logic, which could override Restart=always. -# See https://unix.stackexchange.com/q/289629/352972 -StartLimitIntervalSec=0 [Service] Type=simple ExecStart=/usr/bin/innernet up %i --daemon --interval 60 Restart=always -# When the daemon exits, wait this amount of secs before restarting. Prevents innernet from -# start-looping each 100ms for example when there is a problem reaching the server. -RestartSec=60 +# When the daemon exits, wait this amount of secs before restarting. Used to prevent StartLimitBurst +# (5 by default) restarts happening within StartLimitIntervalSec (10 by default) after which systemd +# would refrain from restarting innernet anymore. +RestartSec=10 [Install] WantedBy=multi-user.target diff --git a/server/innernet-server@.service b/server/innernet-server@.service index 6556d5f3..5c3a4575 100644 --- a/server/innernet-server@.service +++ b/server/innernet-server@.service @@ -2,18 +2,14 @@ Description=innernet server for %I After=network-online.target nss-lookup.target Wants=network-online.target nss-lookup.target -# Disable systemd's unit start rate limiting logic, which could override Restart=always. -# See https://unix.stackexchange.com/q/289629/352972 -StartLimitIntervalSec=0 [Service] Type=simple Environment="RUST_LOG=info" ExecStart=/usr/bin/innernet-server serve %i Restart=always -# When the daemon exits, wait this amount of secs before restarting. Prevents innernet from -# start-looping each 100ms for example when there is a problem reaching the server. -RestartSec=60 +# When the daemon exits, wait this amount of secs before restarting instead of default 100ms. +RestartSec=1 [Install] WantedBy=multi-user.target