libstore: de-callback-ify BinaryCacheStore::getFile
Change-Id: I36b3eb9f645aa04058151e7b2353e15e6f29057b
This commit is contained in:
parent
1a002d1a11
commit
c77bd88259
3 changed files with 29 additions and 83 deletions
|
@ -67,26 +67,9 @@ void BinaryCacheStore::upsertFile(const std::string & path,
|
||||||
upsertFile(path, std::make_shared<std::stringstream>(std::move(data)), mimeType);
|
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)
|
void BinaryCacheStore::getFile(const std::string & path, Sink & sink)
|
||||||
{
|
{
|
||||||
std::promise<std::optional<std::string>> promise;
|
sink(*getFile(path));
|
||||||
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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<std::string> BinaryCacheStore::getFile(const std::string & 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 narInfoFile = narInfoFileFor(storePath);
|
||||||
|
|
||||||
auto callbackPtr = std::make_shared<decltype(callback)>(std::move(callback));
|
try {
|
||||||
|
auto data = getFile(narInfoFile);
|
||||||
|
|
||||||
getFile(narInfoFile,
|
if (!data) return callback({});
|
||||||
{[=,this](std::future<std::optional<std::string>> fut) {
|
|
||||||
try {
|
|
||||||
auto data = fut.get();
|
|
||||||
|
|
||||||
if (!data) return (*callbackPtr)({});
|
stats.narInfoRead++;
|
||||||
|
|
||||||
stats.narInfoRead++;
|
callback(std::make_shared<NarInfo>(*this, *data, narInfoFile));
|
||||||
|
} catch (...) {
|
||||||
(*callbackPtr)((std::shared_ptr<ValidPathInfo>)
|
callback.rethrow();
|
||||||
std::make_shared<NarInfo>(*this, *data, narInfoFile));
|
}
|
||||||
|
|
||||||
(void) act; // force Activity into this lambda to ensure it stays alive
|
|
||||||
} catch (...) {
|
|
||||||
callbackPtr->rethrow();
|
|
||||||
}
|
|
||||||
}});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
StorePath BinaryCacheStore::addToStore(
|
StorePath BinaryCacheStore::addToStore(
|
||||||
|
@ -477,24 +452,16 @@ void BinaryCacheStore::queryRealisationUncached(const DrvOutput & id,
|
||||||
{
|
{
|
||||||
auto outputInfoFilePath = realisationsPrefix + "/" + id.to_string() + ".doi";
|
auto outputInfoFilePath = realisationsPrefix + "/" + id.to_string() + ".doi";
|
||||||
|
|
||||||
auto callbackPtr = std::make_shared<decltype(callback)>(std::move(callback));
|
try {
|
||||||
|
auto data = getFile(outputInfoFilePath);
|
||||||
|
if (!data) return callback({});
|
||||||
|
|
||||||
Callback<std::optional<std::string>> newCallback = {
|
auto realisation = Realisation::fromJSON(
|
||||||
[=](std::future<std::optional<std::string>> fut) {
|
nlohmann::json::parse(*data), outputInfoFilePath);
|
||||||
try {
|
return callback(std::make_shared<const Realisation>(realisation));
|
||||||
auto data = fut.get();
|
} catch (...) {
|
||||||
if (!data) return (*callbackPtr)({});
|
callback.rethrow();
|
||||||
|
}
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BinaryCacheStore::registerDrvOutput(const Realisation& info) {
|
void BinaryCacheStore::registerDrvOutput(const Realisation& info) {
|
||||||
|
|
|
@ -85,15 +85,7 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void getFile(const std::string & path, Sink & sink);
|
virtual void getFile(const std::string & path, Sink & sink);
|
||||||
|
|
||||||
/**
|
virtual std::optional<std::string> getFile(const std::string & path);
|
||||||
* 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);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
|
@ -165,33 +165,20 @@ protected:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void getFile(const std::string & path,
|
std::optional<std::string> getFile(const std::string & path) override
|
||||||
Callback<std::optional<std::string>> callback) noexcept override
|
|
||||||
{
|
{
|
||||||
try {
|
checkEnabled();
|
||||||
checkEnabled();
|
|
||||||
} catch (...) {
|
|
||||||
callback.rethrow();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto request(makeRequest(path));
|
auto request(makeRequest(path));
|
||||||
|
|
||||||
auto callbackPtr = std::make_shared<decltype(callback)>(std::move(callback));
|
try {
|
||||||
|
return std::move(getFileTransfer()->enqueueFileTransfer(request).get().data);
|
||||||
getFileTransfer()->enqueueFileTransfer(request,
|
} catch (FileTransferError & e) {
|
||||||
{[callbackPtr, this](std::future<FileTransferResult> result) {
|
if (e.error == FileTransfer::NotFound || e.error == FileTransfer::Forbidden)
|
||||||
try {
|
return {};
|
||||||
(*callbackPtr)(std::move(result.get().data));
|
maybeDisable();
|
||||||
} catch (FileTransferError & e) {
|
throw;
|
||||||
if (e.error == FileTransfer::NotFound || e.error == FileTransfer::Forbidden)
|
}
|
||||||
return (*callbackPtr)({});
|
|
||||||
maybeDisable();
|
|
||||||
callbackPtr->rethrow();
|
|
||||||
} catch (...) {
|
|
||||||
callbackPtr->rethrow();
|
|
||||||
}
|
|
||||||
}});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue