store: Make `add-to-store' memoizing.

* guix/store.scm (add-to-store/cached): New variable.
  Use it as the new `add-to-store'.
  This reduces the number of RPCs when doing "guix-build gdb" from 5009
  to 3053, and the execution time from 7s to 3.9s.
This commit is contained in:
Ludovic Courtès 2013-01-29 00:16:18 +01:00
parent d7e8e288c5
commit a7b6ffee68

@ -464,6 +464,25 @@ path."
FIXED? is for backward compatibility with old Nix versions and must be #t."
store-path)
(define add-to-store/cached
;; 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)))
(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)))
(or (and st (hash-ref cache args))
(let ((path (add-to-store server basename fixed? recursive?
hash-algo file-name)))
(hash-set! cache args path)
path))))))
(define add-to-store add-to-store/cached)
(define-operation (build-derivations (string-list derivations))
"Build DERIVATIONS, and return when the worker is done building them.
Return #t on success."