From ecfda8abe2389546f6d98e0c03148f9ed84bce85 Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Sun, 2 Feb 2025 15:45:15 +0100 Subject: [PATCH] libstore: asyncify openStore Change-Id: Ia152bfd2014851590328e732f434dff6695304bd --- lix/legacy/build-remote.cc | 4 +- lix/legacy/nix-build.cc | 4 +- lix/legacy/nix-channel.cc | 7 +-- lix/legacy/nix-collect-garbage.cc | 2 +- lix/legacy/nix-copy-closure.cc | 4 +- lix/legacy/nix-env.cc | 2 +- lix/legacy/nix-instantiate.cc | 4 +- lix/legacy/nix-store.cc | 2 +- lix/libcmd/command.cc | 8 ++-- lix/libcmd/common-eval-args.cc | 2 +- lix/libcmd/repl.cc | 7 ++- lix/libexpr/primops/fetchClosure.cc | 2 +- lix/libstore/machines.cc | 9 ++-- lix/libstore/machines.hh | 4 +- lix/libstore/store-api.cc | 43 +++++++++++-------- lix/libstore/store-api.hh | 2 +- lix/nix/daemon.cc | 14 +++--- lix/nix/flake.cc | 2 +- lix/nix/main.cc | 4 +- lix/nix/make-content-addressed.cc | 2 +- lix/nix/prefetch.cc | 2 +- lix/nix/repl.cc | 4 +- lix/nix/sigs.cc | 2 +- lix/nix/verify.cc | 2 +- perl/lib/Nix/Store.xs | 14 +++--- .../nix-eval-jobs/src/nix-eval-jobs.cc | 4 +- .../functional/test-libstoreconsumer/main.cc | 2 +- tests/unit/libcmd/args.cc | 2 +- tests/unit/libexpr-support/tests/libexpr.hh | 2 - tests/unit/libstore-support/tests/libstore.hh | 6 ++- 30 files changed, 97 insertions(+), 71 deletions(-) diff --git a/lix/legacy/build-remote.cc b/lix/legacy/build-remote.cc index e7cd2d741..7cbcce146 100644 --- a/lix/legacy/build-remote.cc +++ b/lix/legacy/build-remote.cc @@ -84,7 +84,7 @@ static int main_build_remote(AsyncIoRoot & aio, std::string programName, Strings initPlugins(); - auto store = openStore(); + auto store = aio.blockOn(openStore()); /* It would be more appropriate to use $XDG_RUNTIME_DIR, since that gets cleared on reboot, but it wouldn't work on macOS. */ @@ -243,7 +243,7 @@ static int main_build_remote(AsyncIoRoot & aio, std::string programName, Strings Activity act(*logger, lvlTalkative, actUnknown, fmt("connecting to '%s'", bestMachine->storeUri)); - sshStore = bestMachine->openStore(); + sshStore = aio.blockOn(bestMachine->openStore()); sshStore->connect(); storeUri = bestMachine->storeUri; diff --git a/lix/legacy/nix-build.cc b/lix/legacy/nix-build.cc index e924edeeb..1a4cce8f5 100644 --- a/lix/legacy/nix-build.cc +++ b/lix/legacy/nix-build.cc @@ -195,8 +195,8 @@ static void main_nix_build(AsyncIoRoot & aio, std::string programName, Strings a if (outLink.empty()) outLink = (Path) tmpDir + "/result"; - auto store = openStore(); - auto evalStore = myArgs.evalStoreUrl ? openStore(*myArgs.evalStoreUrl) : store; + auto store = aio.blockOn(openStore()); + auto evalStore = myArgs.evalStoreUrl ? aio.blockOn(openStore(*myArgs.evalStoreUrl)) : store; auto evaluator = std::make_unique(aio, myArgs.searchPath, evalStore, store); evaluator->repair = myArgs.repair; diff --git a/lix/legacy/nix-channel.cc b/lix/legacy/nix-channel.cc index 41271ef49..7d24a7d67 100644 --- a/lix/legacy/nix-channel.cc +++ b/lix/legacy/nix-channel.cc @@ -7,6 +7,7 @@ #include "lix/libfetchers/fetchers.hh" #include "lix/libexpr/eval-settings.hh" // for defexpr #include "lix/libstore/temporary-dir.hh" +#include "lix/libutil/async.hh" #include "lix/libutil/users.hh" #include "nix-channel.hh" @@ -75,11 +76,11 @@ static void removeChannel(const std::string & name) static Path nixDefExpr; // Fetch Nix expressions and binary cache URLs from the subscribed channels. -static void update(const StringSet & channelNames) +static void update(AsyncIoRoot & aio, const StringSet & channelNames) { readChannels(); - auto store = openStore(); + auto store = aio.blockOn(openStore()); auto [fd, unpackChannelPath] = createTempFile(); writeFull(fd.get(), @@ -241,7 +242,7 @@ static int main_nix_channel(AsyncIoRoot & aio, std::string programName, Strings std::cout << channel.first << ' ' << channel.second << '\n'; break; case cUpdate: - update(StringSet(args.begin(), args.end())); + update(aio, StringSet(args.begin(), args.end())); break; case cListGenerations: if (!args.empty()) diff --git a/lix/legacy/nix-collect-garbage.cc b/lix/legacy/nix-collect-garbage.cc index 0905d3027..3987e1ec8 100644 --- a/lix/legacy/nix-collect-garbage.cc +++ b/lix/legacy/nix-collect-garbage.cc @@ -94,7 +94,7 @@ static int main_nix_collect_garbage(AsyncIoRoot & aio, std::string programName, } else { options.action = GCOptions::gcReturnDead; } - auto store = openStore(); + auto store = aio.blockOn(openStore()); auto & gcStore = require(*store); GCResults results; PrintFreed freed(true, results); diff --git a/lix/legacy/nix-copy-closure.cc b/lix/legacy/nix-copy-closure.cc index 0522236fa..45911932d 100644 --- a/lix/legacy/nix-copy-closure.cc +++ b/lix/legacy/nix-copy-closure.cc @@ -48,8 +48,8 @@ static int main_nix_copy_closure(AsyncIoRoot & aio, std::string programName, Str throw UsageError("no host name specified"); auto remoteUri = "ssh://" + sshHost + (gzip ? "?compress=true" : ""); - auto to = toMode ? openStore(remoteUri) : openStore(); - auto from = toMode ? openStore() : openStore(remoteUri); + auto to = aio.blockOn(toMode ? openStore(remoteUri) : openStore()); + auto from = aio.blockOn(toMode ? openStore() : openStore(remoteUri)); RealisedPath::Set storePaths2; for (auto & path : storePaths) diff --git a/lix/legacy/nix-env.cc b/lix/legacy/nix-env.cc index 499b93295..48bdf98ca 100644 --- a/lix/legacy/nix-env.cc +++ b/lix/legacy/nix-env.cc @@ -1539,7 +1539,7 @@ static int main_nix_env(AsyncIoRoot & aio, std::string programName, Strings argv if (showHelp) showManPage("nix-env" + opName); if (!op) throw UsageError("no operation specified"); - auto store = openStore(); + auto store = aio.blockOn(openStore()); globals.state = std::make_shared(aio, myArgs.searchPath, store); globals.state->repair = myArgs.repair; diff --git a/lix/legacy/nix-instantiate.cc b/lix/legacy/nix-instantiate.cc index 4ee457f0e..a164f3aba 100644 --- a/lix/legacy/nix-instantiate.cc +++ b/lix/legacy/nix-instantiate.cc @@ -154,8 +154,8 @@ static int main_nix_instantiate(AsyncIoRoot & aio, std::string programName, Stri if (evalOnly && !wantsReadWrite) settings.readOnlyMode = true; - auto store = openStore(); - auto evalStore = myArgs.evalStoreUrl ? openStore(*myArgs.evalStoreUrl) : store; + auto store = aio.blockOn(openStore()); + auto evalStore = myArgs.evalStoreUrl ? aio.blockOn(openStore(*myArgs.evalStoreUrl)) : store; auto evaluator = std::make_unique(aio, myArgs.searchPath, evalStore, store); auto state = evaluator->begin(aio); diff --git a/lix/legacy/nix-store.cc b/lix/legacy/nix-store.cc index 909a3c115..6dbeecef7 100644 --- a/lix/legacy/nix-store.cc +++ b/lix/legacy/nix-store.cc @@ -1173,7 +1173,7 @@ static int main_nix_store(AsyncIoRoot & aio, std::string programName, Strings ar if (!op) throw UsageError("no operation specified"); if (op != opDump && op != opRestore) /* !!! hack */ - store = openStore(); + store = aio.blockOn(openStore()); op(aio, std::move(opFlags), std::move(opArgs)); diff --git a/lix/libcmd/command.cc b/lix/libcmd/command.cc index ac297d316..9a5cba6c8 100644 --- a/lix/libcmd/command.cc +++ b/lix/libcmd/command.cc @@ -41,7 +41,7 @@ ref StoreCommand::getStore() ref StoreCommand::createStore() { - return openStore(); + return aio().blockOn(openStore()); } void StoreCommand::run() @@ -68,7 +68,7 @@ CopyCommand::CopyCommand() ref CopyCommand::createStore() { - return srcUri.empty() ? StoreCommand::createStore() : openStore(srcUri); + return srcUri.empty() ? StoreCommand::createStore() : aio().blockOn(openStore(srcUri)); } ref CopyCommand::getDstStore() @@ -76,7 +76,7 @@ ref CopyCommand::getDstStore() if (srcUri.empty() && dstUri.empty()) throw UsageError("you must pass '--from' and/or '--to'"); - return dstUri.empty() ? openStore() : openStore(dstUri); + return aio().blockOn(dstUri.empty() ? openStore() : openStore(dstUri)); } EvalCommand::EvalCommand() @@ -98,7 +98,7 @@ EvalCommand::~EvalCommand() ref EvalCommand::getEvalStore() { if (!evalStore) - evalStore = evalStoreUrl ? openStore(*evalStoreUrl) : getStore(); + evalStore = evalStoreUrl ? aio().blockOn(openStore(*evalStoreUrl)) : getStore(); return ref(evalStore); } diff --git a/lix/libcmd/common-eval-args.cc b/lix/libcmd/common-eval-args.cc index 6d9c7d791..1663ee0f6 100644 --- a/lix/libcmd/common-eval-args.cc +++ b/lix/libcmd/common-eval-args.cc @@ -155,7 +155,7 @@ MixEvalArgs::MixEvalArgs() fetchers::overrideRegistry(from.input, to.input, extraAttrs); }}, .completer = {[&](AddCompletions & completions, size_t, std::string_view prefix) { - completeFlakeRef(completions, openStore(), prefix); + completeFlakeRef(completions, aio().blockOn(openStore()), prefix); }} }); diff --git a/lix/libcmd/repl.cc b/lix/libcmd/repl.cc index a8878ea26..2925fe3bd 100644 --- a/lix/libcmd/repl.cc +++ b/lix/libcmd/repl.cc @@ -1152,7 +1152,12 @@ ReplExitStatus AbstractNixRepl::run( ReplExitStatus AbstractNixRepl::runSimple(EvalState & evalState, const ValMap & extraEnv) { return run( - {}, openStore(), evalState, [] { return AnnotatedValues{}; }, extraEnv, nullptr + {}, + evalState.aio.blockOn(openStore()), + evalState, + [] { return AnnotatedValues{}; }, + extraEnv, + nullptr ); } diff --git a/lix/libexpr/primops/fetchClosure.cc b/lix/libexpr/primops/fetchClosure.cc index 590df3449..2b9bdf569 100644 --- a/lix/libexpr/primops/fetchClosure.cc +++ b/lix/libexpr/primops/fetchClosure.cc @@ -198,7 +198,7 @@ void prim_fetchClosure(EvalState & state, const PosIdx pos, Value * * args, Valu .pos = state.ctx.positions[pos] }); - auto fromStore = openStore(parsedURL.to_string()); + auto fromStore = state.aio.blockOn(openStore(parsedURL.to_string())); if (toPath) runFetchClosureWithRewrite(state, pos, *fromStore, *fromPath, *toPath, v); diff --git a/lix/libstore/machines.cc b/lix/libstore/machines.cc index fff5df8aa..b0caf60cc 100644 --- a/lix/libstore/machines.cc +++ b/lix/libstore/machines.cc @@ -1,6 +1,7 @@ #include "lix/libstore/machines.hh" #include "lix/libstore/globals.hh" #include "lix/libstore/store-api.hh" +#include "lix/libutil/async.hh" #include "lix/libutil/strings.hh" #include @@ -64,8 +65,8 @@ bool Machine::mandatoryMet(const std::set & features) const }); } -ref Machine::openStore() const -{ +kj::Promise>> Machine::openStore() const +try { StoreConfig::Params storeParams; if (storeUri.starts_with("ssh://")) { storeParams["log-fd"] = "4"; @@ -91,7 +92,9 @@ ref Machine::openStore() const append(mandatoryFeatures); } - return nix::openStore(storeUri, storeParams); + co_return TRY_AWAIT(nix::openStore(storeUri, storeParams)); +} catch (...) { + co_return result::current_exception(); } static std::vector expandBuilderLines(const std::string & builders) diff --git a/lix/libstore/machines.hh b/lix/libstore/machines.hh index 2430347c7..162bcd8ec 100644 --- a/lix/libstore/machines.hh +++ b/lix/libstore/machines.hh @@ -2,6 +2,8 @@ ///@file #include "lix/libutil/ref.hh" +#include "lix/libutil/result.hh" +#include #include #include @@ -47,7 +49,7 @@ struct Machine { decltype(mandatoryFeatures) mandatoryFeatures, decltype(sshPublicHostKey) sshPublicHostKey); - ref openStore() const; + kj::Promise>> openStore() const; }; typedef std::vector Machines; diff --git a/lix/libstore/store-api.cc b/lix/libstore/store-api.cc index ecc0a8ca3..6ad729b9f 100644 --- a/lix/libstore/store-api.cc +++ b/lix/libstore/store-api.cc @@ -16,8 +16,10 @@ #include "lix/libstore/worker-protocol.hh" #include "lix/libutil/users.hh" +#include #include #include +#include using json = nlohmann::json; @@ -1528,9 +1530,9 @@ static std::string extractConnStr(const std::string &proto, const std::string &c return connStr; } -ref openStore(const std::string & uri_, +kj::Promise>> openStore(const std::string & uri_, const StoreConfig::Params & extraParams) -{ +try { auto params = extraParams; try { auto parsedUri = parseURL(uri_); @@ -1548,7 +1550,7 @@ ref openStore(const std::string & uri_, experimentalFeatureSettings.require(store->config().experimentalFeature()); store->init(); store->config().warnUnknownSettings(); - return ref(store); + co_return ref(store); } } } @@ -1559,40 +1561,45 @@ ref openStore(const std::string & uri_, if (auto store = openFromNonUri(uri, params)) { store->config().warnUnknownSettings(); - return ref(store); + co_return ref(store); } } throw Error("don't know how to open Nix store '%s'", uri_); +} catch (...) { + co_return result::current_exception(); } kj::Promise>>> getDefaultSubstituters() try { - static auto stores([]() { - std::list> stores; + static std::shared_mutex mtx; + static std::optional>> stores; + if (std::shared_lock l(mtx); stores.has_value()) { + co_return *stores; + } + + std::lock_guard l(mtx); + + if (!stores.has_value()) { StringSet done; - auto addStore = [&](const std::string & uri) { - if (!done.insert(uri).second) return; + stores.emplace(); + for (auto uri : settings.substituters.get()) { + if (!done.insert(uri).second) continue; try { - stores.push_back(openStore(uri)); + stores->push_back(TRY_AWAIT(openStore(uri))); } catch (Error & e) { logWarning(e.info()); } - }; + } - for (auto uri : settings.substituters.get()) - addStore(uri); - - stores.sort([](ref & a, ref & b) { + stores->sort([](ref & a, ref & b) { return a->config().priority < b->config().priority; }); + } - return stores; - } ()); - - co_return stores; + co_return *stores; } catch (...) { co_return result::current_exception(); } diff --git a/lix/libstore/store-api.hh b/lix/libstore/store-api.hh index dece1f90c..383e59f12 100644 --- a/lix/libstore/store-api.hh +++ b/lix/libstore/store-api.hh @@ -1000,7 +1000,7 @@ OutputPathMap resolveDerivedPath(Store &, const DerivedPath::Built &, Store * ev * You can pass parameters to the store implementation by appending * ‘?key=value&key=value&...’ to the URI. */ -ref openStore(const std::string & uri = settings.storeUri.get(), +kj::Promise>> openStore(const std::string & uri = settings.storeUri.get(), const StoreConfig::Params & extraParams = {}); diff --git a/lix/nix/daemon.cc b/lix/nix/daemon.cc index 2b0bb5155..e511a8938 100644 --- a/lix/nix/daemon.cc +++ b/lix/nix/daemon.cc @@ -208,12 +208,14 @@ static PeerInfo getPeerInfo(int remote) /** * Open a store without a path info cache. */ -static ref openUncachedStore() -{ +static kj::Promise>> openUncachedStore() +try { StoreConfig::Params params; // FIXME: get params from somewhere // Disable caching since the client already does that. params["path-info-cache-size"] = "0"; - return openStore(settings.storeUri, params); + co_return TRY_AWAIT(openStore(settings.storeUri, params)); +} catch (...) { + co_return result::current_exception(); } /** @@ -349,7 +351,9 @@ static void daemonLoopImpl(std::optional forceTrustClientOpt) // Handle the connection. FdSource from(remote.get()); FdSink to(remote.get()); - processConnection(aio, openUncachedStore(), from, to, trusted, NotRecursive); + processConnection( + aio, aio.blockOn(openUncachedStore()), from, to, trusted, NotRecursive + ); exit(0); }, options).release(); @@ -445,7 +449,7 @@ static void runDaemon(AsyncIoRoot & aio, bool stdio, std::optional forceTrustClientOpt) { if (stdio) { - auto store = openUncachedStore(); + auto store = aio.blockOn(openUncachedStore()); // If --force-untrusted is passed, we cannot forward the connection and // must process it ourselves (before delegating to the next store) to diff --git a/lix/nix/flake.cc b/lix/nix/flake.cc index 33f0659ac..dc56a2d39 100644 --- a/lix/nix/flake.cc +++ b/lix/nix/flake.cc @@ -1096,7 +1096,7 @@ struct CmdFlakeArchive : FlakeCommand, MixJSON, MixDryRun } if (!dryRun && !dstUri.empty()) { - ref dstStore = dstUri.empty() ? openStore() : openStore(dstUri); + ref dstStore = aio().blockOn(dstUri.empty() ? openStore() : openStore(dstUri)); copyPaths(*store, *dstStore, sources); } } diff --git a/lix/nix/main.cc b/lix/nix/main.cc index 78a17eaf1..006e3dee7 100644 --- a/lix/nix/main.cc +++ b/lix/nix/main.cc @@ -260,7 +260,7 @@ static void showHelp(AsyncIoRoot & aio, std::vector subcommand, Nix evalSettings.restrictEval.override(false); evalSettings.pureEval.override(false); - Evaluator evaluator(aio, {}, openStore("dummy://")); + Evaluator evaluator(aio, {}, aio.blockOn(openStore("dummy://"))); auto state = evaluator.begin(aio); auto vGenerateManpage = evaluator.mem.allocValue(); @@ -419,7 +419,7 @@ void mainWrapped(AsyncIoRoot & aio, int argc, char * * argv) | Xp::FetchClosure | Xp::DynamicDerivations); evalSettings.pureEval.override(false); - Evaluator state(aio, {}, openStore("dummy://")); + Evaluator state(aio, {}, aio.blockOn(openStore("dummy://"))); auto res = nlohmann::json::object(); res["builtins"] = ({ auto builtinsJson = nlohmann::json::object(); diff --git a/lix/nix/make-content-addressed.cc b/lix/nix/make-content-addressed.cc index a3d8e3573..c547d8282 100644 --- a/lix/nix/make-content-addressed.cc +++ b/lix/nix/make-content-addressed.cc @@ -30,7 +30,7 @@ struct CmdMakeContentAddressed : virtual CopyCommand, virtual StorePathsCommand, void run(ref srcStore, StorePaths && storePaths) override { - auto dstStore = dstUri.empty() ? openStore() : openStore(dstUri); + auto dstStore = aio().blockOn(dstUri.empty() ? openStore() : openStore(dstUri)); auto remappings = makeContentAddressed(*srcStore, *dstStore, StorePathSet(storePaths.begin(), storePaths.end())); diff --git a/lix/nix/prefetch.cc b/lix/nix/prefetch.cc index 832fdb9ab..868339125 100644 --- a/lix/nix/prefetch.cc +++ b/lix/nix/prefetch.cc @@ -186,7 +186,7 @@ static int main_nix_prefetch_url(AsyncIoRoot & aio, std::string programName, Str if (isOutputARealTerminal(StandardOutputStream::Stderr)) setLogFormat(LogFormat::bar); - auto store = openStore(); + auto store = aio.blockOn(openStore()); auto evaluator = std::make_unique(aio, myArgs.searchPath, store); auto state = evaluator->begin(aio); diff --git a/lix/nix/repl.cc b/lix/nix/repl.cc index af9fee5d9..466ffea6a 100644 --- a/lix/nix/repl.cc +++ b/lix/nix/repl.cc @@ -87,7 +87,9 @@ struct CmdRepl : RawInstallablesCommand } return values; }; - AbstractNixRepl::run(searchPath, openStore(), *state, getValues, {}, getAutoArgs(*evaluator)); + AbstractNixRepl::run( + searchPath, aio().blockOn(openStore()), *state, getValues, {}, getAutoArgs(*evaluator) + ); } }; diff --git a/lix/nix/sigs.cc b/lix/nix/sigs.cc index 1d7a8e016..9146d1c69 100644 --- a/lix/nix/sigs.cc +++ b/lix/nix/sigs.cc @@ -36,7 +36,7 @@ struct CmdCopySigs : StorePathsCommand // FIXME: factor out commonality with MixVerify. std::vector> substituters; for (auto & s : substituterUris) - substituters.push_back(openStore(s)); + substituters.push_back(aio().blockOn(openStore(s))); ThreadPool pool{"CopySigs pool"}; diff --git a/lix/nix/verify.cc b/lix/nix/verify.cc index 64baae297..fcad4ac85 100644 --- a/lix/nix/verify.cc +++ b/lix/nix/verify.cc @@ -63,7 +63,7 @@ struct CmdVerify : StorePathsCommand { std::vector> substituters; for (auto & s : substituterUris) - substituters.push_back(openStore(s)); + substituters.push_back(aio().blockOn(openStore(s))); auto publicKeys = getDefaultPublicKeys(); diff --git a/perl/lib/Nix/Store.xs b/perl/lib/Nix/Store.xs index 7f8ca051f..1ce939f91 100644 --- a/perl/lib/Nix/Store.xs +++ b/perl/lib/Nix/Store.xs @@ -26,13 +26,19 @@ using namespace nix; +static AsyncIoRoot & aio() +{ + static thread_local AsyncIoRoot root; + return root; +} + static ref store() { static std::shared_ptr _store; if (!_store) { try { initLibStore(); - _store = openStore(); + _store = aio().blockOn(openStore()); } catch (Error & e) { croak("%s", e.what()); } @@ -40,12 +46,6 @@ static ref store() return ref(_store); } -static AsyncIoRoot & aio() -{ - static thread_local AsyncIoRoot root; - return root; -} - MODULE = Nix::Store PACKAGE = Nix::Store PROTOTYPES: ENABLE diff --git a/subprojects/nix-eval-jobs/src/nix-eval-jobs.cc b/subprojects/nix-eval-jobs/src/nix-eval-jobs.cc index 8990398f5..97c3aba9b 100644 --- a/subprojects/nix-eval-jobs/src/nix-eval-jobs.cc +++ b/subprojects/nix-eval-jobs/src/nix-eval-jobs.cc @@ -66,9 +66,9 @@ struct Proc { debug("created worker process %d", getpid()); try { AsyncIoRoot aio; - auto evalStore = myArgs.evalStoreUrl + auto evalStore = aio.blockOn(myArgs.evalStoreUrl ? openStore(*myArgs.evalStoreUrl) - : openStore(); + : openStore()); auto evaluator = nix::make_ref( aio, myArgs.searchPath, evalStore); diff --git a/tests/functional/test-libstoreconsumer/main.cc b/tests/functional/test-libstoreconsumer/main.cc index 5821d3899..ba2c6cba9 100644 --- a/tests/functional/test-libstoreconsumer/main.cc +++ b/tests/functional/test-libstoreconsumer/main.cc @@ -19,7 +19,7 @@ int main (int argc, char **argv) initLibStore(); - auto store = nix::openStore(); + auto store = aio.blockOn(nix::openStore()); // build the derivation diff --git a/tests/unit/libcmd/args.cc b/tests/unit/libcmd/args.cc index ae2406af5..5d8dc2ce7 100644 --- a/tests/unit/libcmd/args.cc +++ b/tests/unit/libcmd/args.cc @@ -32,7 +32,7 @@ TEST(Arguments, lookupFileArg) { SearchPath searchPath; searchPath.elements.push_back(SearchPath::Elem::parse(searchPathElem)); - auto store = openStore("dummy://"); + auto store = aio.blockOn(openStore("dummy://")); auto state = std::make_shared(aio, searchPath, store, store); SourcePath const foundUnitData = aio.blockOn(lookupFileArg(*state, "")); diff --git a/tests/unit/libexpr-support/tests/libexpr.hh b/tests/unit/libexpr-support/tests/libexpr.hh index 8626cfc17..a084a3642 100644 --- a/tests/unit/libexpr-support/tests/libexpr.hh +++ b/tests/unit/libexpr-support/tests/libexpr.hh @@ -31,7 +31,6 @@ namespace nix { , state(*statePtr) { } - ~LibExprTest() noexcept = default; Value eval(std::string input, bool forceValue = true, const FeatureSettings & fSettings = featureSettings) { Value v; Expr & e = evaluator.parseExprFromString(input, CanonPath::root, fSettings); @@ -45,7 +44,6 @@ namespace nix { return evaluator.symbols.create(value); } - AsyncIoRoot aio; Evaluator evaluator; box_ptr statePtr; EvalState & state; diff --git a/tests/unit/libstore-support/tests/libstore.hh b/tests/unit/libstore-support/tests/libstore.hh index 1d83ac6b5..8a436c074 100644 --- a/tests/unit/libstore-support/tests/libstore.hh +++ b/tests/unit/libstore-support/tests/libstore.hh @@ -5,6 +5,7 @@ #include #include "lix/libstore/store-api.hh" +#include "lix/libutil/async.hh" namespace nix { @@ -16,9 +17,12 @@ class LibStoreTest : public ::testing::Test { protected: LibStoreTest() - : store(openStore("dummy://")) + : store(aio.blockOn(openStore("dummy://"))) { } + ~LibStoreTest() noexcept(true) {} + + AsyncIoRoot aio; ref store; };