services: use wants dependency where possible
Let A be a service that depends on another service B. When A can gracefully handle failures and restarts of B, use ``` wants = [ "B.service" ]; after = [ "B.service" ]; ``` instead of ``` requires = [ "B.service" ]; after = [ "B.service" ]; ``` in the definition of A. This way, A keeps running when B is stopped or restarted after a failure. With `requires`, A is instead stopped when B is stopped or restarted due to a failure. This brings two benefits: 1. Improved uptime Examples: - RTL keeps running when one lightning node has failed - btcpayserver keeps running and accepting on-chain payments when the lightning node has crashed 2. Avoids a systemd bug where depending units (`A.service` in the above example) are not restarted when their dependency fails (issue github/systemd#18856, no full link to avoid spamming the issue). In real world nix-bitcoin deployments, this issue was only likely to appear when clightning failed during activation, causing depending units (like `RTL`) to stop and not be restarted. All services depending on `clightning` have now been changed to use `wants`, thereby avoiding the bug. Services `electrs` and `lightning-loop` fail when their respective dependencies stop, so these services have not been changed. I also haven't changed services `joinmarket` and `joinmarket-yieldgenerator`. Further manual testing is needed to determine if they can be switched to `wants`.
This commit is contained in:
parent
c7e5de3b2b
commit
4aaef5fdf4
7 changed files with 19 additions and 17 deletions
|
|
@ -190,9 +190,9 @@ in {
|
|||
|
||||
systemd.services.rtl = rec {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
requires = optional cfg.nodes.clightning.enable "clightning.service" ++
|
||||
optional cfg.nodes.lnd.enable "lnd.service";
|
||||
after = requires ++ [ "nix-bitcoin-secrets.target" ];
|
||||
wants = optional cfg.nodes.clightning.enable "clightning.service" ++
|
||||
optional cfg.nodes.lnd.enable "lnd.service";
|
||||
after = wants ++ [ "nix-bitcoin-secrets.target" ];
|
||||
environment.RTL_CONFIG_PATH = cfg.dataDir;
|
||||
environment.DB_DIRECTORY_PATH = cfg.dataDir;
|
||||
serviceConfig = nbLib.defaultHardening // {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue