[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#48806] [PATCH 6/7] store: 'references/cached' now uses a per-sessio
From: |
Ludovic Courtès |
Subject: |
[bug#48806] [PATCH 6/7] store: 'references/cached' now uses a per-session cache. |
Date: |
Thu, 3 Jun 2021 09:34:00 +0200 |
* guix/store.scm (%reference-cache): Remove.
(%reference-cache-id): New variable.
(references/cached): Rewrite in terms of it.
---
guix/store.scm | 35 ++++++++++++++++++++---------------
1 file changed, 20 insertions(+), 15 deletions(-)
diff --git a/guix/store.scm b/guix/store.scm
index ea784a33d2..b761264ac0 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -1476,21 +1476,6 @@ error if there is no such root."
"Return the list of references of PATH."
store-path-list))
-(define %reference-cache
- ;; Brute-force cache mapping store items to their list of references.
- ;; Caching matters because when building a profile in the presence of
- ;; grafts, we keep calling 'graft-derivation', which in turn calls
- ;; 'references/cached' many times with the same arguments. Ideally we
- ;; would use a cache associated with the daemon connection instead (XXX).
- (make-hash-table 100))
-
-(define (references/cached store item)
- "Like 'references', but cache results."
- (or (hash-ref %reference-cache item)
- (let ((references (references store item)))
- (hash-set! %reference-cache item references)
- references)))
-
(define* (fold-path store proc seed paths
#:optional (relatives (cut references store <>)))
"Call PROC for each of the RELATIVES of PATHS, exactly once, and return the
@@ -1810,6 +1795,26 @@ This is a mutating version that should be avoided.
Prefer the functional
'set-store-connection-cache' instead, together with using %STORE-MONAD."
(vector-set! (store-connection-caches store) cache value))
+
+(define %reference-cache-id
+ ;; Cache mapping store items to their list of references. Caching matters
+ ;; because when building a profile in the presence of grafts, we keep
+ ;; calling 'graft-derivation', which in turn calls 'references/cached' many
+ ;; times with the same arguments.
+ (allocate-store-connection-cache 'reference-cache))
+
+(define (references/cached store item)
+ "Like 'references', but cache results."
+ (let ((cache (store-connection-cache store %reference-cache-id)))
+ (match (vhash-assoc item cache)
+ ((_ . references)
+ references)
+ (#f
+ (let* ((references (references store item))
+ (cache (vhash-cons item references cache)))
+ (set-store-connection-cache! store %reference-cache-id cache)
+ references)))))
+
;;;
;;; Store monad.
--
2.31.1
- [bug#48806] [PATCH 0/7] Generalized cache support and improved graft caching, Ludovic Courtès, 2021/06/03
- [bug#48806] [PATCH 1/7] store: Support dynamic allocation of per-connection caches., Ludovic Courtès, 2021/06/03
- [bug#48806] [PATCH 2/7] store: Generalize cache lookup recording., Ludovic Courtès, 2021/06/03
- [bug#48806] [PATCH 3/7] grafts: Record cache lookups for profiling., Ludovic Courtès, 2021/06/03
- [bug#48806] [PATCH 5/7] store: Remove 'references/substitutes'., Ludovic Courtès, 2021/06/03
- [bug#48806] [PATCH 6/7] store: 'references/cached' now uses a per-session cache.,
Ludovic Courtès <=
- [bug#48806] [PATCH 4/7] grafts: Use SRFI-71 instead of SRFI-11., Ludovic Courtès, 2021/06/03
- [bug#48806] [PATCH 7/7] grafts: Cache the derivation/graft mapping for the whole session., Ludovic Courtès, 2021/06/03
- [bug#48806] [PATCH 0/7] Generalized cache support and improved graft caching, Lars-Dominik Braun, 2021/06/03