Moteur : un refus de LOAD_GUARD n'est plus relancé en boucle par systemd

Le refus d'un chargement résident trop gros pour la RAM faisait sortir
« loki serve » en erreur (code 1) ; l'unité loki-engine (Restart=on-failure,
RestartSec=3) le relançait toutes les trois secondes, sans fin, pour un échec
qui ne dépend que du preset et de la machine.

- Le refus sort avec un code dédié, 78 (EX_CONFIG) ; mustExit respecte le
  code porté par l'erreur, toutes les autres gardent 1.
- L'unité écrite par « loki install » porte RestartPreventExitStatus=78 ;
  les autres échecs restent relancés.
- Unité d'une version précédente (« loki update » ne réécrit pas les unités,
  il tourne sans droits root) : reconnue à coup sûr (parent systemd,
  INVOCATION_ID, unité et compléments lus sans la directive), le refus y sort
  sans erreur pour ne pas boucler, avec la marche à suivre au journal.
  Même chose sous launchd, qui relance toute sortie non nulle.
- Le moteur d'essai de l'optimiseur garde toujours le vrai code. Le
  conteneur ne relance jamais le moteur de lui-même : rien à y changer, la
  raison reste au journal et l'interface la montre (modelLoadError).
- Tests : directive reconnue (et seulement elle), code de sortie du refus,
  enveloppé ou non, unité générée (Linux).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-04 14:29:13 +02:00
1 parent d50c8a56c6
commit a4db6d4da1
9 files changed
+194 -3

No files matched your search

+9
View File
@@ -48,6 +48,15 @@ func unitArgs() map[string]string {
return map[string]string{serviceName(): "serve", uiUnitName: "web"}
}
// supervisorRestartsRefusal : sous launchd (le LaunchDaemon du moteur, que
// launchd désigne par XPC_SERVICE_NAME), KeepAlive/SuccessfulExit=false relance
// TOUTE sortie non nulle — aucune exception par code n'existe. Un refus de
// LOAD_GUARD y sort donc sans erreur (voir loadGuardRefusal). L'app de bureau
// lance le moteur elle-même et ne le relance pas : code normal.
func supervisorRestartsRefusal() (bool, string) {
return os.Getenv("XPC_SERVICE_NAME") == "com.loki."+serviceName(), ""
}
func installServices(targetUser, lokiHome string) error {
exe := installedExePath()
for name, arg := range unitArgs() {