daemon: Read unsigned nar size and download size from substituter.
authorLudovic Courtès <ludo@gnu.org>
Wed, 24 Nov 2021 21:58:12 +0000 (22:58 +0100)
committerLudovic Courtès <ludo@gnu.org>
Wed, 24 Nov 2021 23:17:21 +0000 (00:17 +0100)
Fixes <https://issues.guix.gnu.org/51983>.
Reported by Tobias Geerinckx-Rice <me@tobias.gr>.

* nix/libstore/local-store.cc (LocalStore::querySubstitutablePathInfos):
Expect 'unsigned long long' for 'downloadSize' and 'narSize'.
* tests/store.scm ("substitute query and large size"): New test.

nix/libstore/local-store.cc
tests/store.scm

index 675d1ba..d52b102 100644 (file)
@@ -907,8 +907,8 @@ void LocalStore::querySubstitutablePathInfos(PathSet & paths, SubstitutablePathI
             assertStorePath(p);
             info.references.insert(p);
         }
-        info.downloadSize = getIntLineFromSubstituter<long long>(run);
-        info.narSize = getIntLineFromSubstituter<long long>(run);
+        info.downloadSize = getIntLineFromSubstituter<unsigned long long>(run);
+        info.narSize = getIntLineFromSubstituter<unsigned long long>(run);
     }
 }
 
index 5c9f651..11ca440 100644 (file)
                (build-derivations s (list d))
                #f))))))
 
+(test-equal "substitute query and large size"
+  (+ 100 (expt 2 63))                     ;<https://issues.guix.gnu.org/51983>
+  (with-store s
+    (let* ((size (+ 100 (expt 2 63)))      ;does not fit in signed 'long long'
+           (item (string-append (%store-prefix)
+                                "/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bad-size")))
+      ;; Create fake substituter data, to be read by 'guix substitute'.
+      (call-with-output-file (string-append (%substitute-directory)
+                                            "/" (store-path-hash-part item)
+                                            ".narinfo")
+        (lambda (port)
+          (format port "StorePath: ~a
+URL: http://example.org
+Compression: none
+NarSize: ~a
+NarHash: sha256:0fj9vhblff2997pi7qjj7lhmy7wzhnjwmkm2hmq6gr4fzmg10s0w
+References: 
+System: x86_64-linux~%"
+                  item size)))
+
+      ;; Remove entry from the local cache.
+      (false-if-exception
+       (delete-file-recursively (string-append (getenv "XDG_CACHE_HOME")
+                                               "/guix/substitute")))
+
+      ;; Make sure 'guix substitute' correctly communicates the above
+      ;; data.
+      (set-build-options s #:use-substitutes? #t
+                         #:substitute-urls (%test-substitute-urls))
+      (match (pk 'spi (substitutable-path-info s (list item)))
+        (((? substitutable? s))
+         (and (equal? (substitutable-path s) item)
+              (substitutable-nar-size s)))))))
+
 (test-assert "export/import several paths"
   (let* ((texts (unfold (cut >= <> 10)
                         (lambda _ (random-text))