From 8fc0e0d24ba51c47087b07b01f56fd6688befee8 Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Fri, 21 Feb 2025 00:35:11 +0100 Subject: [PATCH] libstore: asyncify Store::exportPath{,s} Change-Id: I92915a3cb27bda73e7b9f3b32dc1feea3f47abda --- lix/legacy/nix-store.cc | 6 ++++-- lix/libstore/export-import.cc | 17 ++++++++++++----- lix/libstore/store-api.hh | 4 ++-- perl/lib/Nix/Store.xs | 2 +- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lix/legacy/nix-store.cc b/lix/legacy/nix-store.cc index b0d42e2d5..be8e8554b 100644 --- a/lix/legacy/nix-store.cc +++ b/lix/legacy/nix-store.cc @@ -713,7 +713,7 @@ static void opExport(AsyncIoRoot & aio, Strings opFlags, Strings opArgs) paths.insert(store->followLinksToStorePath(i)); FdSink sink(STDOUT_FILENO); - store->exportPaths(paths, sink); + aio.blockOn(store->exportPaths(paths, sink)); sink.flush(); } @@ -927,7 +927,9 @@ static void opServe(AsyncIoRoot & aio, Strings opFlags, Strings opArgs) case ServeProto::Command::ExportPaths: { readInt(in); // obsolete - store->exportPaths(ServeProto::Serialise::read(*store, rconn), out); + aio.blockOn(store->exportPaths( + ServeProto::Serialise::read(*store, rconn), out + )); break; } diff --git a/lix/libstore/export-import.cc b/lix/libstore/export-import.cc index 1eb70bee2..f19618e0a 100644 --- a/lix/libstore/export-import.cc +++ b/lix/libstore/export-import.cc @@ -1,3 +1,4 @@ +#include "lix/libutil/result.hh" #include "lix/libutil/serialise.hh" #include "lix/libstore/store-api.hh" #include "lix/libutil/archive.hh" @@ -8,21 +9,24 @@ namespace nix { -void Store::exportPaths(const StorePathSet & paths, Sink & sink) -{ +kj::Promise> Store::exportPaths(const StorePathSet & paths, Sink & sink) +try { auto sorted = topoSortPaths(paths); std::reverse(sorted.begin(), sorted.end()); for (auto & path : sorted) { sink << 1; - exportPath(path, sink); + TRY_AWAIT(exportPath(path, sink)); } sink << 0; + co_return result::success(); +} catch (...) { + co_return result::current_exception(); } -void Store::exportPath(const StorePath & path, Sink & sink) -{ +kj::Promise> Store::exportPath(const StorePath & path, Sink & sink) +try { auto info = queryPathInfo(path); HashSink hashSink(HashType::SHA256); @@ -47,6 +51,9 @@ void Store::exportPath(const StorePath & path, Sink & sink) teeSink << (info->deriver ? printStorePath(*info->deriver) : "") << 0; + co_return result::success(); +} catch (...) { + co_return result::current_exception(); } kj::Promise> Store::importPaths(Source & source, CheckSigsFlag checkSigs) diff --git a/lix/libstore/store-api.hh b/lix/libstore/store-api.hh index 363735ae7..cbb1d0d87 100644 --- a/lix/libstore/store-api.hh +++ b/lix/libstore/store-api.hh @@ -793,9 +793,9 @@ public: * Export multiple paths in the format expected by ‘nix-store * --import’. */ - void exportPaths(const StorePathSet & paths, Sink & sink); + kj::Promise> exportPaths(const StorePathSet & paths, Sink & sink); - void exportPath(const StorePath & path, Sink & sink); + kj::Promise> exportPath(const StorePath & path, Sink & sink); /** * Import a sequence of NAR dumps created by exportPaths() into the diff --git a/perl/lib/Nix/Store.xs b/perl/lib/Nix/Store.xs index b8406a8bd..bd316d7a9 100644 --- a/perl/lib/Nix/Store.xs +++ b/perl/lib/Nix/Store.xs @@ -197,7 +197,7 @@ void exportPaths(int fd, ...) StorePathSet paths; for (int n = 1; n < items; ++n) paths.insert(store()->parseStorePath(SvPV_nolen(ST(n)))); FdSink sink(fd); - store()->exportPaths(paths, sink); + aio().blockOn(store()->exportPaths(paths, sink)); } catch (Error & e) { croak("%s", e.what()); }