libstore: asyncify Store::init
Change-Id: I38d59b40ab806996018f0ed17896e3ca9dc303be
This commit is contained in:
@@ -33,8 +33,8 @@ BinaryCacheStore::BinaryCacheStore(const BinaryCacheStoreConfig & config)
|
||||
narMagic = sink.s;
|
||||
}
|
||||
|
||||
void BinaryCacheStore::init()
|
||||
{
|
||||
kj::Promise<Result<void>> 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,
|
||||
|
||||
@@ -91,7 +91,7 @@ public:
|
||||
|
||||
public:
|
||||
|
||||
virtual void init() override;
|
||||
virtual kj::Promise<Result<void>> init() override;
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@@ -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<Result<void>> 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<std::string> uriSchemes()
|
||||
|
||||
@@ -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 <atomic>
|
||||
|
||||
@@ -44,7 +45,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
void init() override;
|
||||
kj::Promise<Result<void>> init() override;
|
||||
|
||||
std::string getUri() override
|
||||
{
|
||||
@@ -104,14 +105,17 @@ protected:
|
||||
}
|
||||
};
|
||||
|
||||
void LocalBinaryCacheStore::init()
|
||||
{
|
||||
kj::Promise<Result<void>> 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)
|
||||
|
||||
@@ -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 <aws/core/Aws.h>
|
||||
@@ -287,17 +288,20 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
||||
return "s3://" + bucketName;
|
||||
}
|
||||
|
||||
void init() override
|
||||
{
|
||||
kj::Promise<Result<void>> 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
|
||||
|
||||
@@ -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>(store);
|
||||
}
|
||||
|
||||
@@ -231,7 +231,10 @@ public:
|
||||
* Perform any necessary effectful operation to make the store up and
|
||||
* running
|
||||
*/
|
||||
virtual void init() {};
|
||||
virtual kj::Promise<Result<void>> init()
|
||||
{
|
||||
return {result::success()};
|
||||
}
|
||||
|
||||
virtual StoreConfig & config() = 0;
|
||||
virtual const StoreConfig & config() const = 0;
|
||||
|
||||
Reference in New Issue
Block a user