Message ID | 20240110013058.1822277-2-shinyzero0@tilde.club |
---|---|
State | New |
Headers | show |
Series | [bug#68357] shepherd: service: fix `unload all` | expand |
Hi, "zero@fedora" <shinyzero0@tilde.club> skribis: > * modules/shepherd/service.scm: fix `unload all` Thanks for the patch! > - (('unregister-all) ;no reply > - (let ((root (cdr (vhash-assq 'root registered)))) > - (loop (fold (cut vhash-consq <> root <>) > - vlist-null > - (service-provision root))))) > (('lookup name reply) > ;; Look up NAME and return it, or #f, to REPLY. > (put-message reply > @@ -2638,8 +2633,11 @@ requested to be removed." > (let ((name (string->symbol service-name))) > (cond ((eq? name 'all) > ;; Special 'remove all' case. > - (put-message (current-registry-channel) `(unregister-all)) > - #t) > + (unregister-services > + (filter > + (lambda (sv) > + (not (eq? (service-canonical-name sv) 'root))) > + (service-list)))) Do I get it right that the problem with the current implementation is that services are removed from the registry but not actually stopped? Ludo’.
Hi Ludo! Thanks for replying. Yes, that was the problem. `herd reload root all` was leaving the processes running and many of them crashed or had strange behaviour after loading, so one had to kill them manually and then restart the services. Of course `herd unload root all` was the same. Best wishes, Paul.
Hi! "ShinyZero0" <shinyzero0@tilde.club> skribis: > Yes, that was the problem. `herd reload root all` was leaving the > processes running and many of them crashed or had strange behaviour > after loading, so one had to kill them manually and then restart > the services. > > Of course `herd unload root all` was the same. > > Best wishes, Paul. Thanks for clarifying. I pushed something similar along with a test as commit b7fcdad75dff73fb4a8f531d0834eb9a965bcfd6. Ludo’.
diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm index 5be78bd..54d3400 100644 --- a/modules/shepherd/service.scm +++ b/modules/shepherd/service.scm @@ -1136,11 +1136,6 @@ requests arriving on @var{channel}." (length lst)) (map service-canonical-name lst)) (loop registered)))) - (('unregister-all) ;no reply - (let ((root (cdr (vhash-assq 'root registered)))) - (loop (fold (cut vhash-consq <> root <>) - vlist-null - (service-provision root))))) (('lookup name reply) ;; Look up NAME and return it, or #f, to REPLY. (put-message reply @@ -2638,8 +2633,11 @@ requested to be removed." (let ((name (string->symbol service-name))) (cond ((eq? name 'all) ;; Special 'remove all' case. - (put-message (current-registry-channel) `(unregister-all)) - #t) + (unregister-services + (filter + (lambda (sv) + (not (eq? (service-canonical-name sv) 'root))) + (service-list)))) (else ;; Removing only one service. (match (lookup-service name)