Make the realisation fetching from binary caches async

That way we can fetch several realisations from the same cache in
parallel
This commit is contained in:
regnat 2021-10-27 11:50:57 +02:00
parent 96670ed216
commit fbc70034b3

View file

@ -441,16 +441,25 @@ void BinaryCacheStore::queryRealisationUncached(const DrvOutput & id,
Callback<std::shared_ptr<const Realisation>> callback) noexcept Callback<std::shared_ptr<const Realisation>> callback) noexcept
{ {
auto outputInfoFilePath = realisationsPrefix + "/" + id.to_string() + ".doi"; auto outputInfoFilePath = realisationsPrefix + "/" + id.to_string() + ".doi";
auto rawOutputInfo = getFile(outputInfoFilePath);
if (rawOutputInfo) { auto callbackPtr = std::make_shared<decltype(callback)>(std::move(callback));
auto realisation = Realisation::fromJSON(
nlohmann::json::parse(*rawOutputInfo), outputInfoFilePath); Callback<std::shared_ptr<std::string>> newCallback = {
callback(std::make_shared<const Realisation>(realisation)); [=](std::future<std::shared_ptr<std::string>> fut) {
return; try {
} else { auto data = fut.get();
callback(nullptr); if (!data) return (*callbackPtr)(nullptr);
}
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) {