diff --git a/lix/libstore/binary-cache-store.cc b/lix/libstore/binary-cache-store.cc index 63a274f27..d956ac4c2 100644 --- a/lix/libstore/binary-cache-store.cc +++ b/lix/libstore/binary-cache-store.cc @@ -33,8 +33,8 @@ BinaryCacheStore::BinaryCacheStore(const BinaryCacheStoreConfig & config) narMagic = sink.s; } -void BinaryCacheStore::init() -{ +kj::Promise> BinaryCacheStore::init() +try { std::string cacheInfoFile = "nix-cache-info"; auto cacheInfo = getFileContents(cacheInfoFile); @@ -57,6 +57,9 @@ void BinaryCacheStore::init() } } } + co_return result::success(); +} catch (...) { + co_return result::current_exception(); } void BinaryCacheStore::upsertFile(const std::string & path, diff --git a/lix/libstore/binary-cache-store.hh b/lix/libstore/binary-cache-store.hh index e3ce627cb..9d921d3b9 100644 --- a/lix/libstore/binary-cache-store.hh +++ b/lix/libstore/binary-cache-store.hh @@ -91,7 +91,7 @@ public: public: - virtual void init() override; + virtual kj::Promise> init() override; private: diff --git a/lix/libstore/http-binary-cache-store.cc b/lix/libstore/http-binary-cache-store.cc index 726291c7c..cc4d0aadb 100644 --- a/lix/libstore/http-binary-cache-store.cc +++ b/lix/libstore/http-binary-cache-store.cc @@ -3,6 +3,7 @@ #include "lix/libstore/filetransfer.hh" #include "lix/libstore/globals.hh" #include "lix/libstore/nar-info-disk-cache.hh" +#include "lix/libutil/result.hh" namespace nix { @@ -62,15 +63,15 @@ public: return cacheUri; } - void init() override - { + kj::Promise> init() override + try { // FIXME: do this lazily? if (auto cacheInfo = diskCache->upToDateCacheExists(cacheUri)) { config_.wantMassQuery.setDefault(cacheInfo->wantMassQuery); config_.priority.setDefault(cacheInfo->priority); } else { try { - BinaryCacheStore::init(); + TRY_AWAIT(BinaryCacheStore::init()); } catch (UploadToHTTP &) { throw Error("'%s' does not appear to be a binary cache", cacheUri); } @@ -78,6 +79,9 @@ public: cacheUri, config_.storeDir, config_.wantMassQuery, config_.priority ); } + co_return result::success(); + } catch (...) { + co_return result::current_exception(); } static std::set uriSchemes() diff --git a/lix/libstore/local-binary-cache-store.cc b/lix/libstore/local-binary-cache-store.cc index 008f56ef6..1fb0d495a 100644 --- a/lix/libstore/local-binary-cache-store.cc +++ b/lix/libstore/local-binary-cache-store.cc @@ -2,6 +2,7 @@ #include "lix/libstore/binary-cache-store.hh" #include "lix/libstore/globals.hh" #include "lix/libstore/nar-info-disk-cache.hh" +#include "lix/libutil/result.hh" #include @@ -44,7 +45,7 @@ public: { } - void init() override; + kj::Promise> init() override; std::string getUri() override { @@ -104,14 +105,17 @@ protected: } }; -void LocalBinaryCacheStore::init() -{ +kj::Promise> LocalBinaryCacheStore::init() +try { createDirs(binaryCacheDir + "/nar"); createDirs(binaryCacheDir + "/" + realisationsPrefix); if (config_.writeDebugInfo) createDirs(binaryCacheDir + "/debuginfo"); createDirs(binaryCacheDir + "/log"); - BinaryCacheStore::init(); + TRY_AWAIT(BinaryCacheStore::init()); + co_return result::success(); +} catch (...) { + co_return result::current_exception(); } bool LocalBinaryCacheStore::fileExists(const std::string & path) diff --git a/lix/libstore/s3-binary-cache-store.cc b/lix/libstore/s3-binary-cache-store.cc index eb2927d44..c71d2b491 100644 --- a/lix/libstore/s3-binary-cache-store.cc +++ b/lix/libstore/s3-binary-cache-store.cc @@ -7,6 +7,7 @@ #include "lix/libstore/globals.hh" #include "lix/libutil/compression.hh" #include "lix/libstore/filetransfer.hh" +#include "lix/libutil/result.hh" #include "lix/libutil/strings.hh" #include @@ -287,17 +288,20 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore return "s3://" + bucketName; } - void init() override - { + kj::Promise> init() override + try { if (auto cacheInfo = diskCache->upToDateCacheExists(getUri())) { config().wantMassQuery.setDefault(cacheInfo->wantMassQuery); config().priority.setDefault(cacheInfo->priority); } else { - BinaryCacheStore::init(); + TRY_AWAIT(BinaryCacheStore::init()); diskCache->createCache( getUri(), config().storeDir, config().wantMassQuery, config().priority ); } + co_return result::success(); + } catch (...) { + co_return result::current_exception(); } const Stats & getS3Stats() override diff --git a/lix/libstore/store-api.cc b/lix/libstore/store-api.cc index 8f2eb231f..cc29985b8 100644 --- a/lix/libstore/store-api.cc +++ b/lix/libstore/store-api.cc @@ -1580,7 +1580,7 @@ try { auto store = implem.create(parsedUri.scheme, baseURI, params); if (store) { experimentalFeatureSettings.require(store->config().experimentalFeature()); - store->init(); + TRY_AWAIT(store->init()); store->config().warnUnknownSettings(); co_return ref(store); } diff --git a/lix/libstore/store-api.hh b/lix/libstore/store-api.hh index ae8ae1aa0..6ef474e30 100644 --- a/lix/libstore/store-api.hh +++ b/lix/libstore/store-api.hh @@ -231,7 +231,10 @@ public: * Perform any necessary effectful operation to make the store up and * running */ - virtual void init() {}; + virtual kj::Promise> init() + { + return {result::success()}; + } virtual StoreConfig & config() = 0; virtual const StoreConfig & config() const = 0;