libstore: asyncify Store::init

Change-Id: I38d59b40ab806996018f0ed17896e3ca9dc303be
This commit is contained in:
eldritch horrors
2025-02-24 15:09:02 +00:00
parent c6f5a6a196
commit 3cdf9fed2f
7 changed files with 33 additions and 15 deletions
+5 -2
View File
@@ -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,
+1 -1
View File
@@ -91,7 +91,7 @@ public:
public:
virtual void init() override;
virtual kj::Promise<Result<void>> init() override;
private:
+7 -3
View File
@@ -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()
+8 -4
View File
@@ -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 -3
View File
@@ -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
+1 -1
View File
@@ -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);
}
+4 -1
View File
@@ -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;