diff options
author | eldritch horrors <pennae@lix.systems> | 2024-04-27 19:55:54 +0200 |
---|---|---|
committer | eldritch horrors <pennae@lix.systems> | 2024-05-09 23:18:05 +0200 |
commit | c77bd88259dac6e6b7bcb29425905467aa2ef66f (patch) | |
tree | 09d29a52225e9d8fe25c5fb9c66817c1c0a96745 /src | |
parent | 1a002d1a11aed3ccf6f7271d82a3a07e61888cf9 (diff) |
libstore: de-callback-ify BinaryCacheStore::getFile
Change-Id: I36b3eb9f645aa04058151e7b2353e15e6f29057b
Diffstat (limited to 'src')
-rw-r--r-- | src/libstore/binary-cache-store.cc | 71 | ||||
-rw-r--r-- | src/libstore/binary-cache-store.hh | 10 | ||||
-rw-r--r-- | src/libstore/http-binary-cache-store.cc | 33 |
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; + } } /** |