diff options
author | Ludovic Courtès <ludo@gnu.org> | 2020-06-14 14:51:02 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2020-06-14 15:34:41 +0200 |
commit | 9acac9f9c6452cd76a21e52c7e5a33e8384b82b4 (patch) | |
tree | 1de74951648d77b4b7ce3d031a75bfc83462c1b8 | |
parent | 20d9034cc5bdfd0acec24b7589859cc77f5e9164 (diff) | |
download | guix-9acac9f9c6452cd76a21e52c7e5a33e8384b82b4.tar guix-9acac9f9c6452cd76a21e52c7e5a33e8384b82b4.tar.gz |
profiles: Fix pathological performance of 'manifest-transitive-entries'.
For packages with lots of propagated inputs,
'manifest-transitive-entries', as called from 'check-for-collisions',
would exhibit pathological behavior. For example, "guix install cl-ana"
wouldn't complete in 1mn; now, it's down to 20s.
The issue was that manifest entries would never be 'equal?' due to the
delayed field in <manifest-entry>.
* guix/profiles.scm (manifest-transitive-entries): Use a vhash instead
of a set. Use 'manifest-entry=?' instead of 'equal?' when checking for
equality.
-rw-r--r-- | guix/profiles.scm | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/guix/profiles.scm b/guix/profiles.scm index 25ff146bdf..6064820b9a 100644 --- a/guix/profiles.scm +++ b/guix/profiles.scm @@ -41,7 +41,6 @@ #:use-module (guix modules) #:use-module (guix monads) #:use-module (guix store) - #:use-module (guix sets) #:use-module (ice-9 vlist) #:use-module (ice-9 match) #:use-module (ice-9 regex) @@ -260,17 +259,17 @@ field." recursively." (let loop ((entries (manifest-entries manifest)) (result '()) - (visited (set))) ;compare with 'equal?' + (visited vlist-null)) ;compare with 'manifest-entry=?' (match entries (() (reverse result)) ((head . tail) - (if (set-contains? visited head) + (if (vhash-assoc head visited manifest-entry=?) (loop tail result visited) (loop (append (manifest-entry-dependencies head) tail) (cons head result) - (set-insert head visited))))))) + (vhash-cons head #t visited))))))) (define (profile-manifest profile) "Return the PROFILE's manifest." |