store: Add "add-data-to-store-cache" profiling component.
* guix/store.scm (add-data-to-store): Define 'lookup' and use it instead of 'hash-ref'.
This commit is contained in:
parent
e856177597
commit
d1f7748a2e
|
@ -996,14 +996,52 @@ string). Raise an error if no such path exists."
|
||||||
(operation (add-text-to-store (string name) (bytevector text)
|
(operation (add-text-to-store (string name) (bytevector text)
|
||||||
(string-list references))
|
(string-list references))
|
||||||
#f
|
#f
|
||||||
store-path)))
|
store-path))
|
||||||
|
(lookup (if (profiled? "add-data-to-store-cache")
|
||||||
|
(let ((lookups 0)
|
||||||
|
(hits 0)
|
||||||
|
(drv 0)
|
||||||
|
(scheme 0))
|
||||||
|
(define (show-stats)
|
||||||
|
(define (% n)
|
||||||
|
(if (zero? lookups)
|
||||||
|
100.
|
||||||
|
(* 100. (/ n lookups))))
|
||||||
|
|
||||||
|
(format (current-error-port) "
|
||||||
|
'add-data-to-store' cache:
|
||||||
|
lookups: ~5@a
|
||||||
|
hits: ~5@a (~,1f%)
|
||||||
|
.drv files: ~5@a (~,1f%)
|
||||||
|
Scheme files: ~5@a (~,1f%)~%"
|
||||||
|
lookups hits (% hits)
|
||||||
|
drv (% drv)
|
||||||
|
scheme (% scheme)))
|
||||||
|
|
||||||
|
(register-profiling-hook! "add-data-to-store-cache"
|
||||||
|
show-stats)
|
||||||
|
(lambda (cache args)
|
||||||
|
(let ((result (hash-ref cache args)))
|
||||||
|
(set! lookups (+ 1 lookups))
|
||||||
|
(when result
|
||||||
|
(set! hits (+ 1 hits)))
|
||||||
|
(match args
|
||||||
|
((_ name _)
|
||||||
|
(cond ((string-suffix? ".drv" name)
|
||||||
|
(set! drv (+ drv 1)))
|
||||||
|
((string-suffix? "-builder" name)
|
||||||
|
(set! scheme (+ scheme 1)))
|
||||||
|
((string-suffix? ".scm" name)
|
||||||
|
(set! scheme (+ scheme 1))))))
|
||||||
|
result)))
|
||||||
|
hash-ref)))
|
||||||
(lambda* (server name bytes #:optional (references '()))
|
(lambda* (server name bytes #:optional (references '()))
|
||||||
"Add BYTES under file NAME in the store, and return its store path.
|
"Add BYTES under file NAME in the store, and return its store path.
|
||||||
REFERENCES is the list of store paths referred to by the resulting store
|
REFERENCES is the list of store paths referred to by the resulting store
|
||||||
path."
|
path."
|
||||||
(let* ((args `(,bytes ,name ,references))
|
(let* ((args `(,bytes ,name ,references))
|
||||||
(cache (store-connection-add-text-to-store-cache server)))
|
(cache (store-connection-add-text-to-store-cache server)))
|
||||||
(or (hash-ref cache args)
|
(or (lookup cache args)
|
||||||
(let ((path (add-text-to-store server name bytes references)))
|
(let ((path (add-text-to-store server name bytes references)))
|
||||||
(hash-set! cache args path)
|
(hash-set! cache args path)
|
||||||
path))))))
|
path))))))
|
||||||
|
|
Loading…
Reference in New Issue