diff mbox series

[bug#45860,v2,2/5] services: postgresql: Add socket directory support.

Message ID 20210118101628.202607-3-othacehe@gnu.org
State Accepted
Headers show
Series services: postgresql: Improve service. | expand

Checks

Context Check Description
cbaines/submitting builds success
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch success View Laminar job
cbaines/issue success View issue

Commit Message

Mathieu Othacehe Jan. 18, 2021, 10:16 a.m. UTC
* gnu/services/databases.scm (postgresql-config-file-socket-directory): New
procedure.
(<postgresql-config-file>)[socket-directory]: New field.
(postgresql-config-file-compiler): Honor it.
(postgresql-activation): Create the socket directory if needed.
* doc/guix.texi (Database Services): Document it.
---
 doc/guix.texi              |  6 ++++++
 gnu/services/databases.scm | 32 +++++++++++++++++++++++---------
 2 files changed, 29 insertions(+), 9 deletions(-)

Comments

Christopher Baines Jan. 27, 2021, 8:35 a.m. UTC | #1
Mathieu Othacehe <othacehe@gnu.org> writes:

> * gnu/services/databases.scm (postgresql-config-file-socket-directory): New
> procedure.
> (<postgresql-config-file>)[socket-directory]: New field.
> (postgresql-config-file-compiler): Honor it.
> (postgresql-activation): Create the socket directory if needed.
> * doc/guix.texi (Database Services): Document it.
> ---
>  doc/guix.texi              |  6 ++++++
>  gnu/services/databases.scm | 32 +++++++++++++++++++++++---------
>  2 files changed, 29 insertions(+), 9 deletions(-)

This looks good, I did spot some system tests fail though, and I'm
guessing it's this patch in the series that's the reason [1]

1: https://data.guix-patches.cbaines.net/compare/system-test-derivations?base_commit=2d9c6542c804eb2ef3d8934e1e3ab8b24e9bbafb&target_commit=f8a367281daaad998059dd657818c49ed5beac30&locale=en_US.UTF-8

Looking at the patchwork system test log, I'm guessing it's using the
default socket directory on the client side, which is now not working.

I think patching the postgresql package to adjust [2] accordingly would
be useful to keep PostgreSQL connecting with the default socket
directory.

2:
#define DEFAULT_PGSOCKET_DIR  "/tmp"
Mathieu Othacehe Jan. 28, 2021, 12:04 p.m. UTC | #2
Hello Chris,

> I think patching the postgresql package to adjust [2] accordingly would
> be useful to keep PostgreSQL connecting with the default socket
> directory.

Thanks for having a look! I fixed the tests that were broken by the
socket directory introduction.

I also updated the postgresql default socket directory on core-updates
as you suggested.

Thanks,

Mathieu
diff mbox series

Patch

diff --git a/doc/guix.texi b/doc/guix.texi
index 3ec5e3be15..46039d26d0 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -19402,6 +19402,12 @@  configuration.
 @item @code{ident-file} (default: @code{%default-postgres-ident})
 Filename or G-expression for the user name mapping configuration.
 
+@item @code{socket-directory} (default: @code{"/var/lib/postgresql"})
+Specifies the directory of the Unix-domain socket(s) on which PostgreSQL
+is to listen for connections from client applications.  If set to
+@code{#false} PostgreSQL does not listen on any Unix-domain sockets, in
+which case only TCP/IP sockets can be used to connect to the server.
+
 @item @code{extra-config} (default: @code{'()})
 List of additional keys and values to include in the PostgreSQL config
 file.  Each entry in the list should be a list where the first element
diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm
index bb0e40632e..83dee52cf3 100644
--- a/gnu/services/databases.scm
+++ b/gnu/services/databases.scm
@@ -43,6 +43,7 @@ 
             postgresql-config-file-log-destination
             postgresql-config-file-hba-file
             postgresql-config-file-ident-file
+            postgresql-config-file-socket-directory
             postgresql-config-file-extra-config
 
             postgresql-configuration
@@ -101,20 +102,23 @@  host	all	all	::1/128 	md5"))
 (define-record-type* <postgresql-config-file>
   postgresql-config-file make-postgresql-config-file
   postgresql-config-file?
-  (log-destination postgresql-config-file-log-destination
-                   (default "syslog"))
-  (hba-file        postgresql-config-file-hba-file
-                   (default %default-postgres-hba))
-  (ident-file      postgresql-config-file-ident-file
-                   (default %default-postgres-ident))
-  (extra-config    postgresql-config-file-extra-config
-                   (default '())))
+  (log-destination   postgresql-config-file-log-destination
+                     (default "syslog"))
+  (hba-file          postgresql-config-file-hba-file
+                     (default %default-postgres-hba))
+  (ident-file        postgresql-config-file-ident-file
+                     (default %default-postgres-ident))
+  (socket-directory  postgresql-config-file-socket-directory
+                     (default "/var/run/postgresql"))
+  (extra-config      postgresql-config-file-extra-config
+                     (default '())))
 
 (define-gexp-compiler (postgresql-config-file-compiler
                        (file <postgresql-config-file>) system target)
   (match file
     (($ <postgresql-config-file> log-destination hba-file
-                                 ident-file extra-config)
+                                 ident-file socket-directory
+                                 extra-config)
      ;; See: https://www.postgresql.org/docs/current/config-setting.html.
     (define (format-value value)
       (cond
@@ -136,6 +140,9 @@  host	all	all	::1/128 	md5"))
        `(("log_destination" ,log-destination)
          ("hba_file" ,hba-file)
          ("ident_file" ,ident-file)
+         ,@(if socket-directory
+               `(("unix_socket_directories" ,socket-directory))
+               '())
          ,@extra-config)))
 
      (gexp->derivation
@@ -211,6 +218,13 @@  host	all	all	::1/128 	md5"))
            (mkdir-p #$data-directory)
            (chown #$data-directory (passwd:uid user) (passwd:gid user))
 
+           ;; Create the socket directory.
+           (let ((socket-directory
+                  #$(postgresql-config-file-socket-directory config-file)))
+             (when (string? socket-directory)
+               (mkdir-p socket-directory)
+               (chown socket-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)