~ruther/guix-local

1eb40a6dc4917f5a2e915f8b31b750dba3d378c6 — Ludovic Courtès 4 years ago a4cbd31
daemon: Read unsigned nar size and download size from substituter.

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.
2 files changed, 36 insertions(+), 2 deletions(-)

M nix/libstore/local-store.cc
M tests/store.scm
M nix/libstore/local-store.cc => nix/libstore/local-store.cc +2 -2
@@ 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);
    }
}


M tests/store.scm => tests/store.scm +34 -0
@@ 942,6 942,40 @@
               (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))