diff --git a/lix/libstore/local-store.cc b/lix/libstore/local-store.cc index 4a9bca245..b0538d085 100644 --- a/lix/libstore/local-store.cc +++ b/lix/libstore/local-store.cc @@ -1069,21 +1069,29 @@ StorePathSet LocalStore::queryValidDerivers(const StorePath & path) } -std::map> +kj::Promise>>> LocalStore::queryStaticPartialDerivationOutputMap(const StorePath & path) -{ - return retrySQLite([&]() { - auto state = dbPool.get(); - std::map> outputs; - uint64_t drvId; - drvId = queryValidPathId(*state, path); - auto use(state->stmts->QueryDerivationOutputs.use()(drvId)); - while (use.next()) - outputs.insert_or_assign( - use.getStr(0), parseStorePath(use.getStr(1))); +try { + co_return TRY_AWAIT( + // NOLINTNEXTLINE(cppcoreguidelines-avoid-capturing-lambda-coroutines) + retrySQLite([&]() -> kj::Promise>>> { + try { + auto state = dbPool.get(); + std::map> outputs; + uint64_t drvId; + drvId = queryValidPathId(*state, path); + auto use(state->stmts->QueryDerivationOutputs.use()(drvId)); + while (use.next()) + outputs.insert_or_assign(use.getStr(0), parseStorePath(use.getStr(1))); - return outputs; - }, always_progresses); + co_return outputs; + } catch (...) { + co_return result::current_exception(); + } + }) + ); +} catch (...) { + co_return result::current_exception(); } kj::Promise>> diff --git a/lix/libstore/local-store.hh b/lix/libstore/local-store.hh index 81a966421..2cdee0f0f 100644 --- a/lix/libstore/local-store.hh +++ b/lix/libstore/local-store.hh @@ -202,7 +202,8 @@ public: StorePathSet queryValidDerivers(const StorePath & path) override; - std::map> queryStaticPartialDerivationOutputMap(const StorePath & path) override; + kj::Promise>>> + queryStaticPartialDerivationOutputMap(const StorePath & path) override; kj::Promise>> queryPathFromHashPart(const std::string & hashPart) override; diff --git a/lix/libstore/remote-store.cc b/lix/libstore/remote-store.cc index 1db697cab..ef5c1bb2d 100644 --- a/lix/libstore/remote-store.cc +++ b/lix/libstore/remote-store.cc @@ -352,7 +352,7 @@ try { ); } else { auto & evalStore = *evalStore_; - auto outputs = evalStore.queryStaticPartialDerivationOutputMap(path); + auto outputs = TRY_AWAIT(evalStore.queryStaticPartialDerivationOutputMap(path)); // union with the first branch overriding the statically-known ones // when non-`std::nullopt`. for (auto && [outputName, optPath] : @@ -374,7 +374,7 @@ try { // from the derivation itself (and not the ones that are known because // the have been built), but as old stores don't handle floating-CA // derivations this shouldn't matter - co_return evalStore.queryStaticPartialDerivationOutputMap(path); + co_return TRY_AWAIT(evalStore.queryStaticPartialDerivationOutputMap(path)); } } catch (...) { co_return result::current_exception(); diff --git a/lix/libstore/store-api.cc b/lix/libstore/store-api.cc index bac4a5158..318429d7c 100644 --- a/lix/libstore/store-api.cc +++ b/lix/libstore/store-api.cc @@ -506,14 +506,17 @@ bool Store::PathInfoCacheValue::isKnownNow() return std::chrono::steady_clock::now() < time_point + ttl; } -std::map> Store::queryStaticPartialDerivationOutputMap(const StorePath & path) -{ +kj::Promise>>> +Store::queryStaticPartialDerivationOutputMap(const StorePath & path) +try { std::map> outputs; auto drv = readInvalidDerivation(path); for (auto & [outputName, output] : drv.outputsAndOptPaths(*this)) { outputs.emplace(outputName, output.second); } - return outputs; + co_return outputs; +} catch (...) { + co_return result::current_exception(); } kj::Promise>>> @@ -521,7 +524,7 @@ Store::queryPartialDerivationOutputMap(const StorePath & path, Store * evalStore try { auto & evalStore = evalStore_ ? *evalStore_ : *this; - auto outputs = evalStore.queryStaticPartialDerivationOutputMap(path); + auto outputs = TRY_AWAIT(evalStore.queryStaticPartialDerivationOutputMap(path)); if (!experimentalFeatureSettings.isEnabled(Xp::CaDerivations)) co_return outputs; diff --git a/lix/libstore/store-api.hh b/lix/libstore/store-api.hh index 76d840480..c7ad1a4de 100644 --- a/lix/libstore/store-api.hh +++ b/lix/libstore/store-api.hh @@ -463,8 +463,8 @@ public: * Just a helper function for implementing * `queryPartialDerivationOutputMap`. */ - virtual std::map> queryStaticPartialDerivationOutputMap( - const StorePath & path); + virtual kj::Promise>>> + queryStaticPartialDerivationOutputMap(const StorePath & path); /** * Query the mapping outputName=>outputPath for the given derivation.