aboutsummaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2013-01-29 23:34:50 +0100
committerLudovic Courtès <ludo@gnu.org>2013-01-30 00:09:32 +0100
commit2c3f47ee3a621f20d24ae5c78b1abc0eb00ba445 (patch)
treef8fac49cf1ce8368b91b3a1f5ee1154f20fbfd7d /guix
parent2fbf053b7b7c24ceb36766e19d630f469d0641ce (diff)
downloadgnu-guix-2c3f47ee3a621f20d24ae5c78b1abc0eb00ba445.tar
gnu-guix-2c3f47ee3a621f20d24ae5c78b1abc0eb00ba445.tar.gz
store: Make the `add-to-store' cache per-connection.
* guix/store.scm (<nix-server>)[ats-cache]: New field. (open-connection): Update accordingly. (add-to-store/cached): Use (nix-server-add-to-store-cache SERVER) instead of a weak hash table.
Diffstat (limited to 'guix')
-rw-r--r--guix/store.scm21
1 files changed, 14 insertions, 7 deletions
diff --git a/guix/store.scm b/guix/store.scm
index 79e651f01b..aa762b667c 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -292,11 +292,17 @@
;; remote-store.cc
(define-record-type <nix-server>
- (%make-nix-server socket major minor)
+ (%make-nix-server socket major minor
+ ats-cache)
nix-server?
(socket nix-server-socket)
(major nix-server-major-version)
- (minor nix-server-minor-version))
+ (minor nix-server-minor-version)
+
+ ;; Caches. We keep them per-connection, because store paths build
+ ;; during the session are temporary GC roots kept for the duration of
+ ;; the session.
+ (ats-cache nix-server-add-to-store-cache))
(define-condition-type &nix-error &error
nix-error?)
@@ -333,7 +339,8 @@ operate, should the disk become full. Return a server object."
(write-int (if reserve-space? 1 0) s))
(let ((s (%make-nix-server s
(protocol-major v)
- (protocol-minor v))))
+ (protocol-minor v)
+ (make-hash-table))))
(let loop ((done? (process-stderr s)))
(or done? (process-stderr s)))
s))))))))
@@ -468,13 +475,13 @@ FIXED? is for backward compatibility with old Nix versions and must be #t."
;; A memoizing version of `add-to-store'. This is important because
;; `add-to-store' leads to huge data transfers to the server, and
;; because it's often called many times with the very same argument.
- (let ((add-to-store add-to-store)
- (cache (make-weak-value-hash-table 500)))
+ (let ((add-to-store add-to-store))
(lambda (server basename fixed? recursive? hash-algo file-name)
"Add the contents of FILE-NAME under BASENAME to the store. Note that
FIXED? is for backward compatibility with old Nix versions and must be #t."
- (let* ((st (stat file-name #f))
- (args `(,basename ,recursive? ,hash-algo ,st)))
+ (let* ((st (stat file-name #f))
+ (args `(,basename ,recursive? ,hash-algo ,st))
+ (cache (nix-server-add-to-store-cache server)))
(or (and st (hash-ref cache args))
(let ((path (add-to-store server basename fixed? recursive?
hash-algo file-name)))