Subject: [bug#73494] [PATCH v4 1/3] services: activation: Continue on exceptions.

From: Ludovic Courtès <[email-masked]>
Date: Fri, 02 May 2025 18:17:23 +0200

Hello,

Maxim Cournoyer <[email-masked]> writes:

> From: Hilton Chain <[email-masked]>
>
> Use ‘invoke’ for backtraces and avoid changing environment.
>
> * gnu/services.scm (activation-script): Execute activation scripts in
> ‘invoke’.
> Warn about failed activation scripts.
>
> Change-Id: I89be31433fbb46d0c4a9dc6115ab167910840b6f
> Signed-off-by: Maxim Cournoyer <[email-masked]>

[...]

>                        ;; Run the services' activation snippets.
> -                      ;; TODO: Use 'load-compiled'.
> -                      (for-each primitive-load '#$actions)))))
> +                      (for-each (lambda (action)
> +                                  ;; Don't block activation process when one
> +                                  ;; action fails.
> +                                  (catch #t
> +                                    (lambda ()
> +                                      (invoke action))
> +                                    (lambda _
> +                                      (warning
> +                                       (G_ "failed to activate '~a'.~%")
> +                                       action))))
> +                                '#$actions)))))

As I suggested upthread (or elsewhere? I’m lost!), I think it would be
enough to keep loading these files in the main process (as opposed to
spawning one short-lived process for each activation) and simply catch
exceptions:

  (for-each (lambda (file)
              (guard (c …)
                (save-module-excursion
                  …)))
            '#$actions)

I think it would do what we want while avoiding the overhead.  I don’t
think it qualifies as “premature optimization” because it’s already in
place and the semantics are well-defined.

Thoughts?

Ludo’.