From patchwork Fri Mar 8 11:51:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dale Mellor X-Patchwork-Id: 61523 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id E477127BBE2; Fri, 8 Mar 2024 11:51:57 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00,MAILING_LIST_MULTI, SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id D01F727BBE9 for ; Fri, 8 Mar 2024 11:51:55 +0000 (GMT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1riYlA-00081b-Ab; Fri, 08 Mar 2024 06:51:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1riYl9-00081I-8b for guix-patches@gnu.org; Fri, 08 Mar 2024 06:51:31 -0500 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1riYl9-0006A1-0W for guix-patches@gnu.org; Fri, 08 Mar 2024 06:51:31 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1riYle-000491-Rp for guix-patches@gnu.org; Fri, 08 Mar 2024 06:52:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#36451] [PATCH v2] gnu: services: postgresql: Don't initdb when directory exists References: <20190630205642.54866-1-rob@vllmrt.net> In-Reply-To: <20190630205642.54866-1-rob@vllmrt.net> Resent-From: Dale Mellor Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Fri, 08 Mar 2024 11:52:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 36451 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 36451@debbugs.gnu.org Cc: guix-devel-0brg6b@rdmp.org, rob@vllmrt.net X-Debbugs-Original-Cc: Dale Mellor , guix-patches@gnu.org, Robert Vollmert Received: via spool by 36451-submit@debbugs.gnu.org id=B36451.170989871015886 (code B ref 36451); Fri, 08 Mar 2024 11:52:02 +0000 Received: (at 36451) by debbugs.gnu.org; 8 Mar 2024 11:51:50 +0000 Received: from localhost ([127.0.0.1]:56916 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1riYlR-00048A-RJ for submit@debbugs.gnu.org; Fri, 08 Mar 2024 06:51:50 -0500 Received: from [195.15.247.228] (port=40448 helo=rdmp.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1riYlM-00047t-Vk for 36451@debbugs.gnu.org; Fri, 08 Mar 2024 06:51:49 -0500 Received: from [127.0.0.1] (helo=localhost.localdomain) by rdmp.org with esmtp (Exim 4.96.1) (envelope-from ) id 1riYkA-0004q8-1C; Fri, 08 Mar 2024 11:51:06 +0000 From: Dale Mellor Date: Fri, 8 Mar 2024 11:51:01 +0000 Message-ID: <20240308115101.2047407-1-guix-devel-0brg6b@rdmp.org> X-Mailer: git-send-email 2.41.0 MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org X-getmail-retrieved-from-mailbox: Patches From: Robert Vollmert * gnu/services/databases.scm (postgresql-activation): Check if directory exists. -------------- Dale Mellor: - Modified to make patch apply to head of current master branch. - Verified working, does not break an existing system. - Code change is clean. Reviewed-by: Dale Mellor --- gnu/services/databases.scm | 68 ++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm index 580031cb423..cb85d18e214 100644 --- a/gnu/services/databases.scm +++ b/gnu/services/databases.scm @@ -235,20 +235,7 @@ (define postgresql-activation (use-modules (guix build utils) (ice-9 match)) - (let ((user (getpwnam "postgres")) - (initdb (string-append - #$(final-postgresql postgresql - extension-packages) - "/bin/initdb")) - (initdb-args - (append - (if #$locale - (list (string-append "--locale=" #$locale)) - '())))) - ;; Create db state directory. - (mkdir-p #$data-directory) - (chown #$data-directory (passwd:uid user) (passwd:gid user)) - + (let ((user (getpwnam "postgres"))) ;; Create the socket directory. (let ((socket-directory #$(postgresql-config-file-socket-directory config-file))) @@ -261,25 +248,40 @@ (define postgresql-activation (mkdir-p #$log-directory) (chown #$log-directory (passwd:uid user) (passwd:gid user))) - ;; Drop privileges and init state directory in a new - ;; process. Wait for it to finish before proceeding. - (match (primitive-fork) - (0 - ;; Exit with a non-zero status code if an exception is thrown. - (dynamic-wind - (const #t) - (lambda () - (setgid (passwd:gid user)) - (setuid (passwd:uid user)) - (primitive-exit - (apply system* - initdb - "-D" - #$data-directory - initdb-args))) - (lambda () - (primitive-exit 1)))) - (pid (waitpid pid)))))))) + (unless (file-exists? #$data-directory) + (let ((initdb (string-append + #$(final-postgresql postgresql + extension-packages) + "/bin/initdb")) + (initdb-args + (append + (if #$locale + (list (string-append "--locale=" #$locale)) + '())))) + ;; Create db state directory. + (mkdir-p #$data-directory) + (chown #$data-directory (passwd:uid user) (passwd:gid user)) + + ;; Drop privileges and init state directory in a new + ;; process. Wait for it to finish before proceeding. + (match (primitive-fork) + (0 + ;; Exit with a non-zero status code if an exception is + ;; thrown. + (dynamic-wind + (const #t) + (lambda () + (setgid (passwd:gid user)) + (setuid (passwd:uid user)) + (primitive-exit + (apply system* + initdb + "-D" + #$data-directory + initdb-args))) + (lambda () + (primitive-exit 1)))) + (pid (waitpid pid)))))))))) (define postgresql-shepherd-service (match-lambda