Subject: bug#77373: [shepherd] Deadlock between service-controller and service-builtin-logger

From: nathan <[email-masked]>
Date: Sat, 29 Mar 2025 23:41:24 +0000

I definitely have a deadlock problem with Shepherd and I do believe I've found it.
shepherd 1.0.3

This is in service-controller when the service has been stopped:
(when logger
   (put-message logger 'terminate))
But in service-builtin-logger, this is called every time a line is read:
(or pid
     (and service
          (eq? 'running (service-status service))
          (match (service-running-value service)
            ((? process? process)
             (process-id process))
            (value
             value))))

service-status -> service-control-message -> put-message to the service
The fibers documentation says put-message is blocking. Surely this is a deadlock.

The value of `pid' can be cached and we might avoid the deadlock.
But this happens ONLY if a line of output is read while the service is 'running.
If output only comes while the service is 'starting/'stopping, we will keep calling service-status.

Potential fix:
At the time spawn-service-builtin-logger is called in fork+exec-command, we already know the pid.
Maybe just prepend the pid to the `command' argument if you want it to appear in the log output.