Subject: bug#48521: opendht-service-type hangs Shepherd at boot

From: Maxim Cournoyer <[email-masked]>
Date: Wed, 19 May 2021 17:36:38 -0400

Maxim Cournoyer <[email-masked]> writes:

> Hello,
>
> I just noticed about this problem following a reboot.  I can also
> reproduce it in 'guix system vm', simply adding the opendht-service-type
> to my operating-system declaration.
>
> The boot proceeds until 'error in finalization thread: Success' then
> hangs indefinitely.
>
> What is troubling for me is that the service is rather straightforwardly
> defined.  It uses the make-forkexec-constructor/container like so:
>
> (define (opendht-shepherd-service config)
>   "Return a <shepherd-service> running OpenDHT."
>   (shepherd-service
>    (documentation "Run an OpenDHT node.")
>    (provision '(opendht dhtnode dhtproxy))
>    (requirement '(user-processes syslogd))
>    (start #~(make-forkexec-constructor/container
>              (list #$@(opendht-configuration->command-line-arguments config))
>              #:mappings (list (file-system-mapping
>                                (source "/dev/log") ;for syslog
>                                (target source)))
>              #:user "opendht"))
>    (stop #~(make-kill-destructor))))
>
> I'm not sure how using such basic building blocks could lead to a hang
> in Shepherd ?

After much trial and error, the service can be made to not hang Shepherd
with the removal of the mappings argument:

--8<---------------cut here---------------start------------->8---
modified   gnu/services/networking.scm
@@ -845,9 +845,9 @@ CONFIG, an <opendht-configuration> object."
    (requirement '(user-processes networking syslogd))
    (start #~(make-forkexec-constructor/container
              (list #$@(opendht-configuration->command-line-arguments config))
-             #:mappings (list (file-system-mapping
-                               (source "/dev/log") ;for syslog
-                               (target source)))
+             ;; #:mappings (list (file-system-mapping
+             ;;                   (source "/dev/log") ;for syslog
+             ;;                   (target source)))
              #:user "opendht"))
    (stop #~(make-kill-destructor))))
--8<---------------cut here---------------end--------------->8---

I have no idea why that is, but given that the tor-service-type does the
same thing, I can only conclude that it is some strange interaction
between dhtnode and syslog.

The above fixes the hang, but breaks logging to syslog.

Ideas?

Maxim