guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/03: Replace derivation-file-names->vhash


From: Christopher Baines
Subject: 01/03: Replace derivation-file-names->vhash
Date: Fri, 24 Sep 2021 13:23:02 -0400 (EDT)

cbaines pushed a commit to branch master
in repository data-service.

commit 947cabb685ade2f662901c7bd1356b4c72bac32a
Author: Christopher Baines <mail@cbaines.net>
AuthorDate: Fri Sep 24 17:14:40 2021 +0100

    Replace derivation-file-names->vhash
    
    Rather than creating vhashes, just update the hash table that is used as a
    cache, and query that. This should speed things up and reduce memory usage
    when loading derivations.
---
 guix-data-service/model/derivation.scm | 193 +++++++++++++++------------------
 1 file changed, 86 insertions(+), 107 deletions(-)

diff --git a/guix-data-service/model/derivation.scm 
b/guix-data-service/model/derivation.scm
index 9b0b951..6997a9d 100644
--- a/guix-data-service/model/derivation.scm
+++ b/guix-data-service/model/derivation.scm
@@ -1498,29 +1498,29 @@ LIMIT $1"
       (simple-format
        #t "debug: ensure-input-derivations-exist: processing ~A derivations\n"
        (length input-derivation-file-names))
-      (let ((existing-derivation-entries
-             (derivation-file-names->vhash conn
-                                           derivation-ids-hash-table
-                                           input-derivation-file-names)))
-        (simple-format
-         #t
-         "debug: ensure-input-derivations-exist: checking for missing input 
derivations\n")
-        (let ((missing-derivations-filenames
-               (filter (lambda (derivation-file-name)
-                         (not (vhash-assoc derivation-file-name
-                                           existing-derivation-entries)))
-                       input-derivation-file-names)))
-
-          (unless (null? missing-derivations-filenames)
-            (simple-format
-             #f
-             "debug: ensure-input-derivations-exist: inserting missing input 
derivations\n")
-            ;; Ensure all the input derivations exist
-            (insert-missing-derivations
-             conn
-             derivation-ids-hash-table
-             (map read-derivation-from-file
-                  missing-derivations-filenames)))))))
+
+      (update-derivation-ids-hash-table! conn
+                                         derivation-ids-hash-table
+                                         input-derivation-file-names)
+      (simple-format
+       #t
+       "debug: ensure-input-derivations-exist: checking for missing input 
derivations\n")
+      (let ((missing-derivations-filenames
+             (filter (lambda (derivation-file-name)
+                       (not (hash-ref derivation-ids-hash-table
+                                      derivation-file-name)))
+                     input-derivation-file-names)))
+
+        (unless (null? missing-derivations-filenames)
+          (simple-format
+           #f
+           "debug: ensure-input-derivations-exist: inserting missing input 
derivations\n")
+          ;; Ensure all the input derivations exist
+          (insert-missing-derivations
+           conn
+           derivation-ids-hash-table
+           (map read-derivation-from-file
+                missing-derivations-filenames))))))
 
   (define (insert-into-derivations)
     (string-append
@@ -1698,46 +1698,33 @@ WHERE " criteria ";"))
    '()
    sorted-derivations))
 
-(define (derivation-file-names->vhash conn derivation-ids-hash-table 
file-names)
-  (simple-format #t "debug: derivation-file-names->vhash: ~A file-names\n"
-                 (length file-names))
-  (match (fold (match-lambda*
-                 ((file-name (result . missing-file-names))
-                  (let ((cached-id (hash-ref derivation-ids-hash-table
-                                             file-name)))
-                    (if cached-id
-                        (cons (vhash-cons file-name cached-id result)
-                              missing-file-names)
-                        (cons result
-                              (cons file-name missing-file-names))))))
-               (cons vlist-null '())
-               file-names)
-    ((result)
-     (simple-format
-      #t "debug: derivation-file-names->vhash: lookup ~A file-names, all 
found\n"
-      (length file-names))
-     result)
-    ((result . missing-file-names)
-     (simple-format
-      #t "debug: derivation-file-names->vhash: lookup ~A file-names, ~A not 
cached\n"
-      (length file-names) (length missing-file-names))
-     (let ((result-for-missing-file-names
-            (exec-query->vhash
-             conn
-             (select-existing-derivations missing-file-names)
-             second ;; file_name
-             (lambda (result)
-               (string->number (first result)))))) ;; id
-       (simple-format
-        #t "debug: derivation-file-names->vhash: adding ~A entries to the 
cache\n"
-        (vlist-length result-for-missing-file-names))
-       (vhash-fold
-        (lambda (key value combined)
-          ;; Update the derivation-ids-hash-table as we go through the vhash
-          (hash-set! derivation-ids-hash-table key value)
-          (vhash-cons key value combined))
-        result
-        result-for-missing-file-names)))))
+(define (update-derivation-ids-hash-table! conn
+                                           derivation-ids-hash-table
+                                           file-names)
+  (define file-names-count (length file-names))
+
+  (simple-format #t "debug: update-derivation-ids-hash-table!: ~A file-names\n"
+                 file-names-count)
+  (let ((missing-file-names
+         (fold (lambda (file-name result)
+                 (if (hash-ref derivation-ids-hash-table
+                               file-name)
+                     result
+                     (cons file-name result)))
+               '()
+               file-names)))
+
+    (simple-format
+     #t "debug: update-derivation-ids-hash-table!: lookup ~A file-names, ~A 
not cached\n"
+     file-names-count (length missing-file-names))
+
+    (for-each
+     (match-lambda
+       ((id file-name)
+        (hash-set! derivation-ids-hash-table
+                   file-name
+                   (string->number id))))
+     (exec-query conn (select-existing-derivations missing-file-names)))))
 
 (define (derivation-file-names->derivation-ids conn derivation-file-names)
   (define (select-source-files-missing-nars derivation-ids)
@@ -1809,47 +1796,39 @@ INNER JOIN derivation_source_files
         (simple-format
          #t "debug: derivation-file-names->derivation-ids: processing ~A 
derivations\n"
          derivations-count)
-        (let* ((existing-derivation-entries
-                (derivation-file-names->vhash conn
-                                              derivation-ids-hash-table
-                                              derivation-file-names))
-
-               (missing-derivations
-                (map read-derivation-from-file
-                     (deduplicate-strings
-                      (filter (lambda (derivation-file-name)
-                                (not (vhash-assoc derivation-file-name
-                                                  
existing-derivation-entries)))
-                              derivation-file-names))))
-
-               (new-derivation-entries
-                (if (null? missing-derivations)
-                    '()
-                    (insert-missing-derivations conn
-                                                derivation-ids-hash-table
-                                                missing-derivations)))
-
-               (new-entries-id-lookup-vhash
-                (two-lists->vhash (map derivation-file-name 
missing-derivations)
-                                  new-derivation-entries))
-
-               (all-ids
-                (map (lambda (derivation-file-name)
-                       (cdr
-                        (or (vhash-assoc derivation-file-name
-                                         existing-derivation-entries)
-                            (vhash-assoc derivation-file-name
-                                         new-entries-id-lookup-vhash)
-                            (error "missing derivation id"))))
-                     derivation-file-names)))
-
-          (with-time-logging "inserting missing source files"
-            (for-each (match-lambda
-                        ((derivation-source-file-id store-path)
-                         (insert-derivation-source-file-nar
-                          conn
-                          (string->number derivation-source-file-id)
-                          store-path)))
-                      (select-source-files-missing-nars all-ids)))
-
-          all-ids))))
+
+        (update-derivation-ids-hash-table! conn
+                                           derivation-ids-hash-table
+                                           derivation-file-names)
+
+        (let ((missing-derivations
+               (map read-derivation-from-file
+                    (deduplicate-strings
+                     (filter (lambda (derivation-file-name)
+                               (not (hash-ref derivation-ids-hash-table
+                                              derivation-file-name)))
+                             derivation-file-names)))))
+
+          (unless (null? missing-derivations)
+            (insert-missing-derivations conn
+                                        derivation-ids-hash-table
+                                        missing-derivations))
+
+
+          (let ((all-ids
+                 (map (lambda (derivation-file-name)
+                        (or (hash-ref derivation-ids-hash-table
+                                      derivation-file-name)
+                            (error "missing derivation id")))
+                      derivation-file-names)))
+
+            (with-time-logging "inserting missing source files"
+              (for-each (match-lambda
+                          ((derivation-source-file-id store-path)
+                           (insert-derivation-source-file-nar
+                            conn
+                            (string->number derivation-source-file-id)
+                            store-path)))
+                        (select-source-files-missing-nars all-ids)))
+
+            all-ids)))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]