aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-04-27 19:55:54 +0200
committereldritch horrors <pennae@lix.systems>2024-05-09 23:18:05 +0200
commitc77bd88259dac6e6b7bcb29425905467aa2ef66f (patch)
tree09d29a52225e9d8fe25c5fb9c66817c1c0a96745 /src/libstore
parent1a002d1a11aed3ccf6f7271d82a3a07e61888cf9 (diff)
libstore: de-callback-ify BinaryCacheStore::getFile
Change-Id: I36b3eb9f645aa04058151e7b2353e15e6f29057b
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/binary-cache-store.cc71
-rw-r--r--src/libstore/binary-cache-store.hh10
-rw-r--r--src/libstore/http-binary-cache-store.cc33
3 files changed, 30 insertions, 84 deletions
diff --git a/src/libstore/binary-cache-store.cc b/src/libstore/binary-cache-store.cc
index 502fac05f..bf7265c35 100644
--- a/src/libstore/binary-cache-store.cc
+++ b/src/libstore/binary-cache-store.cc
@@ -67,26 +67,9 @@ void BinaryCacheStore::upsertFile(const std::string & path,
upsertFile(path, std::make_shared<std::stringstream>(std::move(data)), mimeType);
}
-void BinaryCacheStore::getFile(const std::string & path,
- Callback<std::optional<std::string>> callback) noexcept
-{
- try {
- callback(getFile(path));
- } catch (...) { callback.rethrow(); }
-}
-
void BinaryCacheStore::getFile(const std::string & path, Sink & sink)
{
- std::promise<std::optional<std::string>> promise;
- getFile(path,
- {[&](std::future<std::optional<std::string>> result) {
- try {
- promise.set_value(result.get());
- } catch (...) {
- promise.set_exception(std::current_exception());
- }
- }});
- sink(*promise.get_future().get());
+ sink(*getFile(path));
}
std::optional<std::string> BinaryCacheStore::getFile(const std::string & path)
@@ -377,25 +360,17 @@ void BinaryCacheStore::queryPathInfoUncached(const StorePath & storePath,
auto narInfoFile = narInfoFileFor(storePath);
- auto callbackPtr = std::make_shared<decltype(callback)>(std::move(callback));
-
- getFile(narInfoFile,
- {[=,this](std::future<std::optional<std::string>> fut) {
- try {
- auto data = fut.get();
-
- if (!data) return (*callbackPtr)({});
+ try {
+ auto data = getFile(narInfoFile);
- stats.narInfoRead++;
+ if (!data) return callback({});
- (*callbackPtr)((std::shared_ptr<ValidPathInfo>)
- std::make_shared<NarInfo>(*this, *data, narInfoFile));
+ stats.narInfoRead++;
- (void) act; // force Activity into this lambda to ensure it stays alive
- } catch (...) {
- callbackPtr->rethrow();
- }
- }});
+ callback(std::make_shared<NarInfo>(*this, *data, narInfoFile));
+ } catch (...) {
+ callback.rethrow();
+ }
}
StorePath BinaryCacheStore::addToStore(
@@ -477,24 +452,16 @@ void BinaryCacheStore::queryRealisationUncached(const DrvOutput & id,
{
auto outputInfoFilePath = realisationsPrefix + "/" + id.to_string() + ".doi";
- auto callbackPtr = std::make_shared<decltype(callback)>(std::move(callback));
-
- Callback<std::optional<std::string>> newCallback = {
- [=](std::future<std::optional<std::string>> fut) {
- try {
- auto data = fut.get();
- if (!data) return (*callbackPtr)({});
-
- auto realisation = Realisation::fromJSON(
- nlohmann::json::parse(*data), outputInfoFilePath);
- return (*callbackPtr)(std::make_shared<const Realisation>(realisation));
- } catch (...) {
- callbackPtr->rethrow();
- }
- }
- };
-
- getFile(outputInfoFilePath, std::move(newCallback));
+ try {
+ auto data = getFile(outputInfoFilePath);
+ if (!data) return callback({});
+
+ auto realisation = Realisation::fromJSON(
+ nlohmann::json::parse(*data), outputInfoFilePath);
+ return callback(std::make_shared<const Realisation>(realisation));
+ } catch (...) {
+ callback.rethrow();
+ }
}
void BinaryCacheStore::registerDrvOutput(const Realisation& info) {
diff --git a/src/libstore/binary-cache-store.hh b/src/libstore/binary-cache-store.hh
index 218a888e3..af2b50084 100644
--- a/src/libstore/binary-cache-store.hh
+++ b/src/libstore/binary-cache-store.hh
@@ -85,15 +85,7 @@ public:
*/
virtual void getFile(const std::string & path, Sink & sink);
- /**
- * Fetch the specified file and call the specified callback with
- * the result. A subclass may implement this asynchronously.
- */
- virtual void getFile(
- const std::string & path,
- Callback<std::optional<std::string>> callback) noexcept;
-
- std::optional<std::string> getFile(const std::string & path);
+ virtual std::optional<std::string> getFile(const std::string & path);
public:
diff --git a/src/libstore/http-binary-cache-store.cc b/src/libstore/http-binary-cache-store.cc
index 9b980d81f..764f97fc1 100644
--- a/src/libstore/http-binary-cache-store.cc
+++ b/src/libstore/http-binary-cache-store.cc
@@ -165,33 +165,20 @@ protected:
}
}
- void getFile(const std::string & path,
- Callback<std::optional<std::string>> callback) noexcept override
+ std::optional<std::string> getFile(const std::string & path) override
{
- try {
- checkEnabled();
- } catch (...) {
- callback.rethrow();
- return;
- }
+ checkEnabled();
auto request(makeRequest(path));
- auto callbackPtr = std::make_shared<decltype(callback)>(std::move(callback));
-
- getFileTransfer()->enqueueFileTransfer(request,
- {[callbackPtr, this](std::future<FileTransferResult> result) {
- try {
- (*callbackPtr)(std::move(result.get().data));
- } catch (FileTransferError & e) {
- if (e.error == FileTransfer::NotFound || e.error == FileTransfer::Forbidden)
- return (*callbackPtr)({});
- maybeDisable();
- callbackPtr->rethrow();
- } catch (...) {
- callbackPtr->rethrow();
- }
- }});
+ try {
+ return std::move(getFileTransfer()->enqueueFileTransfer(request).get().data);
+ } catch (FileTransferError & e) {
+ if (e.error == FileTransfer::NotFound || e.error == FileTransfer::Forbidden)
+ return {};
+ maybeDisable();
+ throw;
+ }
}
/**