summary refs log tree commit diff
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
parent2fbf053b7b7c24ceb36766e19d630f469d0641ce (diff)
downloadguix-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.
-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)))