services: postgresql-roles: Fix race condition.

Make sure that the postgresql-roles script is completed before declaring the
postgresql-roles service as started.

* gnu/services/databases.scm (postgresql-create-roles): Return the command
line instead of a program-file.
(postgresql-role-shepherd-service): Use fork+exec-command to start the role
creation script and wait for its completion before returning.
This commit is contained in:
Mathieu Othacehe 2021-02-23 11:00:18 +01:00
parent bebcf97600
commit 1a8cfb6d4c
No known key found for this signature in database
GPG key ID: 8354763531769CA6

View file

@ -410,13 +410,8 @@ (define (roles->queries roles)
(let ((host (postgresql-role-configuration-host config))
(roles (postgresql-role-configuration-roles config)))
(program-file
"postgresql-create-roles"
#~(begin
(let ((psql #$(file-append postgresql "/bin/psql")))
(execl psql psql "-a"
"-h" #$host
"-f" #$(roles->queries roles)))))))
#~(let ((psql #$(file-append postgresql "/bin/psql")))
(list psql "-a" "-h" #$host "-f" #$(roles->queries roles)))))
(define (postgresql-role-shepherd-service config)
(match-record config <postgresql-role-configuration>
@ -425,10 +420,14 @@ (define (postgresql-role-shepherd-service config)
(requirement '(postgres))
(provision '(postgres-roles))
(one-shot? #t)
(start #~(make-forkexec-constructor
(list #$(postgresql-create-roles config))
#:user "postgres" #:group "postgres"
#:log-file #$log))
(start
#~(lambda args
(let ((pid (fork+exec-command
#$(postgresql-create-roles config)
#:user "postgres"
#:group "postgres"
#:log-file #$log)))
(zero? (cdr (waitpid pid))))))
(documentation "Create PostgreSQL roles.")))))
(define postgresql-role-service-type