unison: better retry/restart reporting failures

The service was never marked with a failed state with the previous
approach, which could lead broken synchronisation pair states to go
undetected.

The module now uses a timer instead of unlimited restarts, which does
not have this issue.
This commit is contained in:
pacien 2023-12-23 19:13:09 +01:00 committed by GitHub
parent 7184dfe663
commit de9134144b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -65,9 +65,10 @@ let
serialiseArgs = args: concatStringsSep " " (mapAttrsToList serialiseArg args);
unitName = name: "unison-pair-${name}";
makeDefs = gen:
mapAttrs'
(name: pairCfg: nameValuePair "unison-pair-${name}" (gen name pairCfg))
mapAttrs' (name: pairCfg: nameValuePair (unitName name) (gen name pairCfg))
cfg.pairs;
in {
@ -106,19 +107,10 @@ in {
];
systemd.user.services = makeDefs (name: pairCfg: {
Unit = {
Description = "Unison pair sync (${name})";
# Retry forever, useful in case of network disruption.
StartLimitIntervalSec = 0;
};
Unit.Description = "Unison pair sync (${name})";
Service = {
Restart = "always";
RestartSec = 60;
CPUSchedulingPolicy = "idle";
IOSchedulingClass = "idle";
Environment = [ "UNISON='${toString pairCfg.stateDirectory}'" ];
ExecStart = ''
${cfg.package}/bin/unison \
@ -126,8 +118,16 @@ in {
${strings.concatMapStringsSep " " escapeShellArg pairCfg.roots}
'';
};
});
Install = { WantedBy = [ "default.target" ]; };
systemd.user.timers = makeDefs (name: pairCfg: {
Unit.Description = "Unison pair sync auto-restart (${name})";
Install.WantedBy = [ "timers.target" ];
Timer = {
Unit = "${unitName name}.service";
OnActiveSec = 1;
OnUnitInactiveSec = 60;
};
});
};
}