diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2019-04-29 21:42:04 +0200 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2019-04-29 21:54:10 +0200 |
| commit | c20d4cac1fb72afe26a3e534b92e9a9691936458 (patch) | |
| tree | 01bf7a57b8ea8dd7a9ec6aa26b3020aeb0274ecb | |
| parent | c21d912a027056c30ee86c1ce021322e89f474c3 (diff) | |
processes: Gracefully handle daemons without clients.
Fixes <https://bugs.gnu.org/34716>.
Reported by Mark H Weaver <mhw@netris.org>.
The problem could be reproduced by running, on one hand:
sh -c 'exec -a guix-daemon sleep 777'
and on the other hand:
guix processes
If there is no process with PID 777, 'guix processes' would barf as it
stumbles upon a <daemon-session> record whose client is #f.
* guix/scripts/processes.scm (daemon-sessions)[child-process->session]:
New procedure, with lambda formerly passed to 'map'. Handle #f returns
from 'lookup-process'.
Call 'child-process->session' within 'filter-map', not just 'map'.
| -rw-r--r-- | guix/scripts/processes.scm | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/guix/scripts/processes.scm b/guix/scripts/processes.scm index 2dd3bbf30a3..a2ab0174908 100644 --- a/guix/scripts/processes.scm +++ b/guix/scripts/processes.scm | |||
| @@ -158,15 +158,22 @@ active sessions, and the master 'guix-daemon' process." | |||
| 158 | (= pid (process-parent-id process)))) | 158 | (= pid (process-parent-id process)))) |
| 159 | processes)) | 159 | processes)) |
| 160 | 160 | ||
| 161 | (values (map (lambda (process) | 161 | (define (child-process->session process) |
| 162 | (match (process-command process) | 162 | (match (process-command process) |
| 163 | ((argv0 (= string->number client) _ ...) | 163 | ((argv0 (= string->number client) _ ...) |
| 164 | (let ((files (process-open-files process))) | 164 | (let ((files (process-open-files process)) |
| 165 | (daemon-session process | 165 | (client (lookup-process client))) |
| 166 | (lookup-process client) | 166 | ;; After a client has died, there's a window during which its |
| 167 | (lookup-children (process-id process)) | 167 | ;; corresponding 'guix-daemon' process is still alive, in which |
| 168 | (filter lock-file? files)))))) | 168 | ;; case 'lookup-process' returns #f. In that case ignore the |
| 169 | children) | 169 | ;; session. |
| 170 | (and client | ||
| 171 | (daemon-session process client | ||
| 172 | (lookup-children | ||
| 173 | (process-id process)) | ||
| 174 | (filter lock-file? files))))))) | ||
| 175 | |||
| 176 | (values (filter-map child-process->session children) | ||
| 170 | master))) | 177 | master))) |
| 171 | 178 | ||
| 172 | (define (daemon-session->recutils session port) | 179 | (define (daemon-session->recutils session port) |
