Subject: Re: bug#47253: network-manager shepherd services does not wait to be online

From: Mark H Weaver <[email-masked]>
Date: Fri, 19 Mar 2021 08:07:44 -0400

Hi,

raid5atemyhomework via Bug reports for GNU Guix <[email-masked]>
writes:

> I have a small number of daemons that need access to the network at
> startup.  I have configured their Shepherd services to require
> `networking`.
>
> However, to my puzzlement, I consistently find that they are unable to
> access the network at startup.  One daemon dies (and gets respawned so
> often that it sometimes gets disabled by Shepherd), the other daemon
> just keeps running without having set up the server that I need it to
> expose.
>
> Thus, in many cases whenever I reboot I have to manually `herd enable`
> and `herd restart` the first daemon and `herd restart` the second.
> This is fairly bad since I want to be able to leave this server alone
> and have it survive power interruptions etc.
[...]
> I would like to propose this change:
>
> ```diff
> --- a/gnu/services/networking.scm
> +++ b/gnu/services/networking.scm
> @@ -1106,17 +1106,22 @@ and @command{wicd-curses} user interfaces."
>                (documentation "Run the NetworkManager.")
>                (provision '(networking))
>                (requirement '(user-processes dbus-system wpa-supplicant loopback))
> -              (start #~(make-forkexec-constructor
> -                        (list (string-append #$network-manager
> -                                             "/sbin/NetworkManager")
> -                              (string-append "--config=" #$conf)
> -                              "--no-daemon")
> -                        #:environment-variables
> -                        (list (string-append "NM_VPN_PLUGIN_DIR=" #$vpn
> -                                             "/lib/NetworkManager/VPN")
> -                              ;; Override non-existent default users
> -                              "NM_OPENVPN_USER="
> -                              "NM_OPENVPN_GROUP=")))
> +              (start #~(let ((constructor   (make-forkexec-constructor
> +                                              (list (string-append #$network-manager
> +                                                                   "/sbin/NetworkManager")
> +                                                    (string-append "--config=" #$conf)
> +                                                    "--no-daemon")
> +                                              #:environment-variables
> +                                              (list (string-append "NM_VPN_PLUGIN_DIR=" #$vpn
> +                                                                   "/lib/NetworkManager/VPN")
> +                                                    ;; Override non-existent default users
> +                                                    "NM_OPENVPN_USER="
> +                                                    "NM_OPENVPN_GROUP="))))
> +                         (lambda args
> +                           (let ((pid (apply constructor args)))
> +                             (invoke/quiet (string-append #$network-manager "/bin/nm-online")
> +                                           "-s" "-q" "--timeout=30")
> +                             pid))))
>                (stop #~(make-kill-destructor))))))))
>
>  (define network-manager-service-type
> ```
>
>
> Of course, the big problem is that Shepherd is single-threadded and
> `nm-online` will block all other bootup.

That's not good.  For the sake of users who are not always connected to
the internet, I'd strongly prefer for the Guix boot process of a desktop
system to *not* be blocked for 30 seconds when there's no active
internet connection.

How about leaving "networking" as it is now, and instead adding a new
service called "network-online" or similar, that requires "networking"
and then waits until a network connection is established?

What do you think?

      Mark