GNU bug report logs -
#66387
[PATCH] home: services: Fix race condition when detecting first login
Previous Next
Full log
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
* gnu/home/services.scm (compute-on-first-login-script): Use open to
atomically check whether a file exists and create it if not.
---
I run Guix Home on NixOS with SDDM as my display manager. When I log in, I find that there are two shepherd processes running. Looking at the on-first-login script I noticed a race condition that I suspect was causing the issue.
I believe the "open" incantation I have used is atomic, except on NFS, so this should ensure that the gexps are only run once. I have confirmed that this patch fixes my problem. With this patch, when I login I only have a single shepherd process.
gnu/home/services.scm | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/gnu/home/services.scm b/gnu/home/services.scm
index 8d53f2f4d3..95ef66e091 100644
--- a/gnu/home/services.scm
+++ b/gnu/home/services.scm
@@ -2,6 +2,7 @@
;;; Copyright © 2021-2023 Andrew Tropin <andrew <at> trop.in>
;;; Copyright © 2021 Xinglu Chen <public <at> yoctocell.xyz>
;;; Copyright © 2022-2023 Ludovic Courtès <ludo <at> gnu.org>
+;;; Copyright © 2023 Carlo Zancanaro <carlo <at> zancanaro.id.au>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -412,20 +413,29 @@ (define (compute-on-first-login-script _ gexps)
#~(begin
(use-modules (guix i18n)
(guix diagnostics))
+
+ (define (claim-first-run file-name)
+ (catch #t
+ (lambda ()
+ ;; This incantation will raise an error if the file at
+ ;; flag-file-path already exists, and will create it otherwise.
+ (close (open file-name (logior O_CREAT O_EXCL)))
+ #t)
+ (lambda (e)
+ #f)))
+
#$%initialize-gettext
(let* ((xdg-runtime-dir (or (getenv "XDG_RUNTIME_DIR")
(format #f "/run/user/~a" (getuid))))
(flag-file-path (string-append
- xdg-runtime-dir "/on-first-login-executed"))
- (touch (lambda (file-name)
- (call-with-output-file file-name (const #t)))))
+ xdg-runtime-dir "/on-first-login-executed")))
;; XDG_RUNTIME_DIR dissapears on logout, that means such trick
;; allows to launch on-first-login script on first login only
;; after complete logout/reboot.
(if (file-exists? xdg-runtime-dir)
- (unless (file-exists? flag-file-path)
- (begin #$@gexps (touch flag-file-path)))
+ (when (claim-first-run flag-file-path)
+ #$@gexps)
;; TRANSLATORS: 'on-first-login' is the name of a service and
;; shouldn't be translated
(warning (G_ "XDG_RUNTIME_DIR doesn't exists, on-first-login script
base-commit: b566e1a98a74d84d3978cffefd05295602c9445d
--
2.41.0
This bug report was last modified 1 year and 274 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.