From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36362) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfBR6-0007Lb-08 for guix-patches@gnu.org; Tue, 08 Aug 2017 16:49:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dfBR1-0007eu-0a for guix-patches@gnu.org; Tue, 08 Aug 2017 16:49:08 -0400 Received: from debbugs.gnu.org ([208.118.235.43]:43601) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dfBR0-0007eo-T0 for guix-patches@gnu.org; Tue, 08 Aug 2017 16:49:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1dfBR0-00018z-Ln for guix-patches@gnu.org; Tue, 08 Aug 2017 16:49:02 -0400 Subject: [bug#28021] [PATCH] gnu: Fix memcached service startup. Resent-Message-ID: Received: from eggs.gnu.org ([2001:4830:134:3::10]:36220) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfBQl-00073g-IB for guix-patches@gnu.org; Tue, 08 Aug 2017 16:48:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dfBQg-0007U6-Gl for guix-patches@gnu.org; Tue, 08 Aug 2017 16:48:47 -0400 Received: from li622-129.members.linode.com ([212.71.249.129]:48214 helo=mira.cbaines.net) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dfBQg-0007To-8L for guix-patches@gnu.org; Tue, 08 Aug 2017 16:48:42 -0400 Received: from localhost (cpc102582-walt20-2-0-cust14.13-2.cable.virginm.net [86.27.34.15]) by mira.cbaines.net (Postfix) with ESMTPSA id 3F4A213E3BD for ; Tue, 8 Aug 2017 21:48:40 +0100 (BST) Received: from localhost.localdomain (localhost [127.0.0.1]) by localhost (OpenSMTPD) with ESMTP id 53e1af1a for ; Tue, 8 Aug 2017 20:48:39 +0000 (UTC) From: Christopher Baines Date: Tue, 8 Aug 2017 21:48:39 +0100 Message-Id: <20170808204839.23723-1-mail@cbaines.net> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: 28021@debbugs.gnu.org Memcached changes to the memcached user from root before writing the PID file. This means that it must be able to write the PID file as the memcached user. To make this work, create the /var/run/memcached directory when the service starts, make it owned by memcached, and change memcached to write the PID file to /var/run/memcached/pid. This wasn't picked up by the system test as the "service running" part was too permissive, and only failed on an error. Instead, test the response from calling start-service and check that the PID is a number. * gnu/services/databases.scm (memcached-activation): New variable. (memcached-shepherd-service): Change PID file location. (memcached-service-type): Extend the activation-service-type. * gnu/tests/databases.scm (run-memcached-test)[test]: Change the "service running" test to check the response from the shepherd. --- gnu/services/databases.scm | 17 +++++++++++++++-- gnu/tests/databases.scm | 10 ++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm index 3b64d0e07..de1f6b841 100644 --- a/gnu/services/databases.scm +++ b/gnu/services/databases.scm @@ -216,6 +216,14 @@ and stores the database cluster in @var{data-directory}." (home-directory "/var/empty") (shell (file-append shadow "/sbin/nologin"))))) +(define memcached-activation + #~(begin + (use-modules (guix build utils)) + (let ((user (getpwnam "memcached"))) + (mkdir-p "/var/run/memcached") + (chown "/var/run/memcached" + (passwd:uid user) (passwd:gid user))))) + (define memcached-shepherd-service (match-lambda (($ memcached interfaces tcp-port udp-port @@ -233,11 +241,14 @@ and stores the database cluster in @var{data-directory}." "-p" #$(number->string tcp-port) "-U" #$(number->string udp-port) "--daemon" - "-P" "/var/run/memcached.pid" + ;; Memcached changes to the memcached user prior to + ;; writing the pid file, so write it to a directory + ;; that memcached owns. + "-P" "/var/run/memcached/pid" "-u" "memcached" ,#$@additional-options) #:log-file "/var/log/memcached" - #:pid-file "/var/run/memcached.pid")) + #:pid-file "/var/run/memcached/pid")) (stop #~(make-kill-destructor)))))))) (define memcached-service-type @@ -245,6 +256,8 @@ and stores the database cluster in @var{data-directory}." (extensions (list (service-extension shepherd-root-service-type memcached-shepherd-service) + (service-extension activation-service-type + (const memcached-activation)) (service-extension account-service-type (const %memcached-accounts)))) (default-value (memcached-configuration)))) diff --git a/gnu/tests/databases.scm b/gnu/tests/databases.scm index 310210c36..9d9a75374 100644 --- a/gnu/tests/databases.scm +++ b/gnu/tests/databases.scm @@ -63,13 +63,15 @@ (test-begin "memcached") ;; Wait for memcached to be up and running. - (test-eq "service running" - 'running! + (test-assert "service running" (marionette-eval '(begin (use-modules (gnu services herd)) - (start-service 'memcached) - 'running!) + (match (start-service 'memcached) + (#f #f) + (('service response-parts ...) + (match (assq-ref response-parts 'running) + ((pid) (number? pid)))))) marionette)) (let* ((ai (car (getaddrinfo "localhost" -- 2.14.0