unofficial mirror of bug-guix@gnu.org 
 help / color / mirror / code / Atom feed
From: "Ludovic Courtès" <ludo@gnu.org>
To: 56674@debbugs.gnu.org
Subject: bug#56674: [Shepherd] Use of ‘waitpid’,  ‘system*’,  etc. in service code can cause deadlocks
Date: Mon, 14 Nov 2022 00:16:38 +0100	[thread overview]
Message-ID: <87o7tabg2x.fsf@gnu.org> (raw)
In-Reply-To: <8735evpipv.fsf@inria.fr> ("Ludovic Courtès"'s message of "Wed, 20 Jul 2022 23:39:08 +0200")

[-- Attachment #1: Type: text/plain, Size: 2121 bytes --]

Hi,

Ludovic Courtès <ludo@gnu.org> skribis:

>   1. In the best case, shepherd (as of 0.9.1) is stuck while ‘system*’
>      is in ‘waitpid’ waiting for child process completion (“stuck” as
>      in: doesn’t do anything, not even answering ‘herd’ requests or
>      inetd connections.)
>
>   2. I don’t think that can happen with ‘system*’ (because it’s in C),
>      but generally speaking, there’s a possibility that shepherd’s event
>      loop will handle child process termination before some other
>      user-made ‘waitpid’ call does.
>
> Anyway, that’s a bad situation.
>
> So I can think of several ways to address it:
>
>   1. Change the nginx service ‘stop’ method to just
>      (make-kill-destructor), which should work just as well as invoking
>      “nginx -s stop”.
>
>   2. Have Shepherd provide a replacement for ‘system*’.

These fresh Shepherd commits install a non-blocking ‘system*’ replacement:

  975b0aa service: Provide a non-blocking replacement of 'system*'.
  039c7a8 service: Spawn a fiber responsible for process monitoring.

We’ll have to do more testing and probably go for a 0.9.3 release soon.

Protip: you can test the latest shepherd with:

--8<---------------cut here---------------start------------->8---
(operating-system
  ;; …
  (essential-services
   (modify-services (operating-system-default-essential-services
                     this-operating-system)
     (shepherd-root-service-type
      config =>
      (shepherd-configuration
       (shepherd (package
                   (inherit shepherd-0.9)
                   (version "0.9.3pre")
                   (source (git-checkout
                            (url "https://git.savannah.gnu.org/git/shepherd.git")))
                   (native-inputs
                    (modify-inputs (package-native-inputs shepherd-0.9)
                      (append autoconf automake help2man texinfo gnu-gettext))))))))))
--8<---------------cut here---------------end--------------->8---

Full example attached.

Ludo’.


[-- Attachment #2: the example --]
[-- Type: text/plain, Size: 3640 bytes --]

;; This is an operating system configuration template
;; for a "bare bones" setup, with no X11 display server.

(use-modules (gnu) (guix) (guix git))
(use-service-modules networking ssh web vpn shepherd)
(use-package-modules linux screen ssh
                     admin autotools gettext man texinfo)

(operating-system
  (host-name "komputilo")
  (timezone "Europe/Berlin")
  (locale "en_US.utf8")

  ;; Boot in "legacy" BIOS mode, assuming /dev/sdX is the
  ;; target hard disk, and "my-root" is the label of the target
  ;; root file system.
  (bootloader (bootloader-configuration
               (bootloader grub-bootloader)
               (targets '("/dev/sdX"))))
  ;; It's fitting to support the equally bare bones ‘-nographic’
  ;; QEMU option, which also nicely sidesteps forcing QWERTY.
  (kernel-arguments (list "console=ttyS0,115200"))
  (file-systems (cons (file-system
                        (device (file-system-label "my-root"))
                        (mount-point "/")
                        (type "ext4"))
                      %base-file-systems))

  ;; This is where user accounts are specified.  The "root"
  ;; account is implicit, and is initially created with the
  ;; empty password.
  (users (cons (user-account
                (name "alice")
                (comment "Bob's sister")
                (group "users")

                ;; Adding the account to the "wheel" group
                ;; makes it a sudoer.  Adding it to "audio"
                ;; and "video" allows the user to play sound
                ;; and access the webcam.
                (supplementary-groups '("wheel"
                                        "audio" "video")))
               %base-user-accounts))

  ;; Globally-installed packages.
  (packages (append (list screen strace) %base-packages))

  (essential-services
   (modify-services (operating-system-default-essential-services
                     this-operating-system)
     (shepherd-root-service-type
      config =>
      (shepherd-configuration
       (shepherd (package
                   (inherit shepherd-0.9)
                   (version "0.9.3pre")
                   (source (git-checkout
                            (url "https://git.savannah.gnu.org/git/shepherd.git")))
                   (native-inputs
                    (modify-inputs (package-native-inputs shepherd-0.9)
                      (append autoconf automake help2man texinfo gnu-gettext)))))))))

  ;; Add services to the baseline: a DHCP client and
  ;; an SSH server.
  (services (append (list (service dhcp-client-service-type)
                          (service nginx-service-type
                                   (nginx-configuration
                                    (server-blocks
                                     (list (nginx-server-configuration
                                            (listen '("80"))
                                            (server-name '("www.example.org"))
                                            (root "/srv/whatever"))))))
                          (service wireguard-service-type
                                   (wireguard-configuration
                                    (addresses (list "10.0.0.2/24"))
                                    (dns '("10.0.0.50")))) ;does not exit


                          (service openssh-service-type
                                   (openssh-configuration
                                    (openssh openssh-sans-x)
                                    (port-number 2222))))
                    %base-services)))

  parent reply	other threads:[~2022-11-13 23:17 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-20 21:39 bug#56674: [Shepherd] Use of ‘waitpid’, ‘system*’, etc. in service code can cause deadlocks Ludovic Courtès
2022-07-20 23:48 ` Maxime Devos
2022-07-21 15:39   ` Ludovic Courtès
2022-08-13 14:59     ` Maxime Devos
2022-11-13 23:16 ` Ludovic Courtès [this message]
2022-11-14 16:32   ` bug#58926: Shepherd becomes unresponsive after an interrupt Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87o7tabg2x.fsf@gnu.org \
    --to=ludo@gnu.org \
    --cc=56674@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).