Package: guix-patches;
Reported by: Ludovic Courtès <ludo <at> gnu.org>
Date: Thu, 13 Feb 2025 11:45:01 UTC
Severity: normal
Tags: patch
Done: Ludovic Courtès <ludo <at> gnu.org>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: Ludovic Courtès <ludo <at> gnu.org> To: 76262 <at> debbugs.gnu.org Cc: Ludovic Courtès <ludo <at> gnu.org> Subject: [bug#76262] [PATCH 2/3] services: Use ‘spawn-command’ instead of ‘fork’ + ‘waitpid’. Date: Thu, 13 Feb 2025 12:45:47 +0100
This is more concise and more robust: these ‘waitpid’ calls would compete with those made by shepherd’s event loop upon SIGCHLD, and they could hang forever. * gnu/services/databases.scm (postgresql-role-shepherd-service): Use ‘spawn-command’ instead of ‘fork+exec-command’ followed by ‘waitpid’. * gnu/services/networking.scm (dhcp-client-shepherd-service): Change ‘start’ to use ‘spawn-command’ instead of ‘fork+exec-command’ and * gnu/services/web.scm (patchwork-django-admin-gexp): Use ‘spawn-command’ instead of ‘primitive-fork’ + ‘waitpid’. Change-Id: I449290bfa46f8600e6ccdb5a6da990ad0cb7948c --- gnu/services/databases.scm | 16 +++++++++------- gnu/services/networking.scm | 26 +++++++++++++------------- gnu/services/web.scm | 31 +++++++++---------------------- 3 files changed, 31 insertions(+), 42 deletions(-) diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm index e8a4acc996d..6530c6f0a12 100644 --- a/gnu/services/databases.scm +++ b/gnu/services/databases.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 David Thompson <davet <at> gnu.org> -;;; Copyright © 2015-2016, 2022-2023 Ludovic Courtès <ludo <at> gnu.org> +;;; Copyright © 2015-2016, 2022-2023, 2025 Ludovic Courtès <ludo <at> gnu.org> ;;; Copyright © 2016 Leo Famulari <leo <at> famulari.name> ;;; Copyright © 2017 Christopher Baines <mail <at> cbaines.net> ;;; Copyright © 2018 Clément Lassieur <clement <at> lassieur.org> @@ -448,12 +448,14 @@ (define (postgresql-role-shepherd-service config) (one-shot? #t) (start #~(lambda args - (let ((pid (fork+exec-command - #$(postgresql-create-roles config) - #:user "postgres" - #:group "postgres" - #:log-file #$log))) - (zero? (cdr (waitpid pid)))))) + (zero? (spawn-command + #$(postgresql-create-roles config) + #:user "postgres" + #:group "postgres" + ;; XXX: As of Shepherd 1.0.2, #:log-file is not + ;; supported. + ;; #:log-file #$log + )))) (documentation "Create PostgreSQL roles."))))) (define postgresql-role-service-type diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm index af28bd0626b..53f383f6f3d 100644 --- a/gnu/services/networking.scm +++ b/gnu/services/networking.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013-2024 Ludovic Courtès <ludo <at> gnu.org> +;;; Copyright © 2013-2025 Ludovic Courtès <ludo <at> gnu.org> ;;; Copyright © 2015 Mark H Weaver <mhw <at> netris.org> ;;; Copyright © 2016, 2018, 2020 Efraim Flashner <efraim <at> flashner.co.il> ;;; Copyright © 2016 John Darrington <jmd <at> gnu.org> @@ -389,18 +389,18 @@ (define dhcp-client-shepherd-service '())) (false-if-exception (delete-file #$pid-file)) - (let ((pid (fork+exec-command - ;; By default dhclient uses a - ;; pre-standardization implementation of - ;; DDNS, which is incompatable with - ;; non-ISC DHCP servers; thus, pass '-I'. - ;; <https://kb.isc.org/docs/aa-01091>. - `(,dhclient "-nw" "-I" - #$(string-append "-" version) - "-pf" ,#$pid-file - ,@config-file-args - ,@ifaces)))) - (and (zero? (cdr (waitpid pid))) + (let ((status (spawn-command + ;; By default dhclient uses a + ;; pre-standardization implementation of + ;; DDNS, which is incompatable with + ;; non-ISC DHCP servers; thus, pass '-I'. + ;; <https://kb.isc.org/docs/aa-01091>. + `(,dhclient "-nw" "-I" + #$(string-append "-" version) + "-pf" ,#$pid-file + ,@config-file-args + ,@ifaces)))) + (and (zero? status) (read-pid-file #$pid-file))))) (stop #~(make-kill-destructor))))))) (package diff --git a/gnu/services/web.scm b/gnu/services/web.scm index f5de5997acb..d42ef09c3c0 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 David Thompson <davet <at> gnu.org> -;;; Copyright © 2015-2023 Ludovic Courtès <ludo <at> gnu.org> +;;; Copyright © 2015-2023, 2025 Ludovic Courtès <ludo <at> gnu.org> ;;; Copyright © 2016 Nikita <nikita <at> n0.is> ;;; Copyright © 2016, 2017, 2018 Julien Lepiller <julien <at> lepiller.eu> ;;; Copyright © 2017, 2018, 2019 Christopher Baines <mail <at> cbaines.net> @@ -1902,27 +1902,14 @@ (define (patchwork-httpd-configuration patchwork-configuration) (define (patchwork-django-admin-gexp patchwork settings-module) #~(lambda command - (let ((pid (primitive-fork)) - (user (getpwnam "httpd"))) - (if (eq? pid 0) - (dynamic-wind - (const #t) - (lambda () - (setgid (passwd:gid user)) - (setuid (passwd:uid user)) - - (setenv "DJANGO_SETTINGS_MODULE" "guix.patchwork.settings") - (setenv "PYTHONPATH" #$settings-module) - (primitive-exit - (if (zero? - (apply system* - #$(file-append patchwork "/bin/patchwork-admin") - command)) - 0 - 1))) - (lambda () - (primitive-exit 1))) - (zero? (cdr (waitpid pid))))))) + (zero? (spawn-command + `(#$(file-append patchwork "/bin/patchwork-admin") + ,command) + #:user "httpd" + #:group "httpd" + #:environment-variables + `("DJANGO_SETTINGS_MODULE=guix.patchwork.settings" + ,(string-append "PYTHONPATH=" #$settings-module)))))) (define (patchwork-django-admin-action patchwork settings-module) (shepherd-action -- 2.48.1
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.