~ruther/guix-local

a7b6ffee68d7b47fe3f00a2a0bd8e5c83314f9ce — Ludovic Courtès 13 years ago d7e8e28
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.
1 files changed, 19 insertions(+), 0 deletions(-)

M guix/store.scm
M guix/store.scm => guix/store.scm +19 -0
@@ 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."