diff options
author | Ludovic Courtès <ludo@gnu.org> | 2016-08-31 15:23:32 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2016-08-31 15:44:20 +0200 |
commit | d4f8884fdb897e648fd7f4262b2142d8c363ac76 (patch) | |
tree | 8ded679c906151037b82937e26fa1fd664e1a531 | |
parent | 6673bddc9ae8f8835a8676cfb3ca0f5b9eb29405 (diff) | |
download | patches-d4f8884fdb897e648fd7f4262b2142d8c363ac76.tar patches-d4f8884fdb897e648fd7f4262b2142d8c363ac76.tar.gz |
guix system: Do not unload services depended on.
Reported by Mark H Weaver <mhw@netris.org>
at <https://lists.gnu.org/archive/html/guix-devel/2016-08/msg01470.html>.
* guix/scripts/system.scm (service-upgrade)[live-service-required?]: New
procedure.
[obsolete?]: Use it.
* tests/system.scm ("service-upgrade: service depended on is not
unloaded", "service-upgrade: obsolete services that depend on each
other"): New tests.
-rw-r--r-- | guix/scripts/system.scm | 7 | ||||
-rw-r--r-- | tests/system.scm | 32 |
2 files changed, 38 insertions, 1 deletions
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm index 80f62fb109..bcf19dbb7e 100644 --- a/guix/scripts/system.scm +++ b/guix/scripts/system.scm @@ -298,9 +298,14 @@ needs to be loaded." (service (and (not (live-service-running service)) service)))) + (define live-service-dependents + (shepherd-service-back-edges live + #:provision live-service-provision + #:requirement live-service-requirement)) + (define (obsolete? service) (match (lookup-target (first (live-service-provision service))) - (#f #t) + (#f (every obsolete? (live-service-dependents service))) (_ #f))) (define to-load diff --git a/tests/system.scm b/tests/system.scm index eff997062f..9c1a13dd9b 100644 --- a/tests/system.scm +++ b/tests/system.scm @@ -149,4 +149,36 @@ (list (map live-service-provision unload) (map shepherd-service-provision load))))) +(test-equal "service-upgrade: service depended on is not unloaded" + '(((baz)) ;unload + ()) ;load + (call-with-values + (lambda () + ;; Service 'bar' is not among the target services; yet, it must not be + ;; unloaded because 'foo' depends on it. + (service-upgrade (list (live-service '(foo) '(bar) #t) + (live-service '(bar) '() #t) ;still used! + (live-service '(baz) '() #t)) + (list (shepherd-service (provision '(foo)) + (start #t))))) + (lambda (unload load) + (list (map live-service-provision unload) + (map shepherd-service-provision load))))) + +(test-equal "service-upgrade: obsolete services that depend on each other" + '(((foo) (bar) (baz)) ;unload + ((qux))) ;load + (call-with-values + (lambda () + ;; 'foo', 'bar', and 'baz' depend on each other, but all of them are + ;; obsolete, and thus should be unloaded. + (service-upgrade (list (live-service '(foo) '(bar) #t) ;obsolete + (live-service '(bar) '(baz) #t) ;obsolete + (live-service '(baz) '() #t)) ;obsolete + (list (shepherd-service (provision '(qux)) + (start #t))))) + (lambda (unload load) + (list (map live-service-provision unload) + (map shepherd-service-provision load))))) + (test-end) |