summaryrefslogtreecommitdiff
path: root/guix/profiles.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2020-06-14 14:51:02 +0200
committerLudovic Courtès <ludo@gnu.org>2020-06-14 15:34:41 +0200
commit9acac9f9c6452cd76a21e52c7e5a33e8384b82b4 (patch)
tree1de74951648d77b4b7ce3d031a75bfc83462c1b8 /guix/profiles.scm
parent20d9034cc5bdfd0acec24b7589859cc77f5e9164 (diff)
downloadguix-patches-9acac9f9c6452cd76a21e52c7e5a33e8384b82b4.tar
guix-patches-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.
Diffstat (limited to 'guix/profiles.scm')
-rw-r--r--guix/profiles.scm7
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."