From 2c52a20dd2037109863214660eb0ab52be69b8be Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Fri, 7 Feb 2025 00:27:57 +0100 Subject: [PATCH] libstore: asyncify Store::addMultipleToStore Change-Id: I6a552fecfef8c32979afdec8caa9cdeaf875b511 --- lix/libstore/daemon.cc | 4 ++-- lix/libstore/remote-store.cc | 18 ++++++++++++------ lix/libstore/remote-store.hh | 4 ++-- lix/libstore/store-api.cc | 16 +++++++++++----- lix/libstore/store-api.hh | 4 ++-- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/lix/libstore/daemon.cc b/lix/libstore/daemon.cc index 8622de0be..c63c21e04 100644 --- a/lix/libstore/daemon.cc +++ b/lix/libstore/daemon.cc @@ -515,9 +515,9 @@ static void performOp(AsyncIoRoot & aio, TunnelLogger * logger, ref store logger->startWork(); { FramedSource source(from); - store->addMultipleToStore(source, + aio.blockOn(store->addMultipleToStore(source, RepairFlag{repair}, - dontCheckSigs ? NoCheckSigs : CheckSigs); + dontCheckSigs ? NoCheckSigs : CheckSigs)); } logger->stopWork(); break; diff --git a/lix/libstore/remote-store.cc b/lix/libstore/remote-store.cc index a89f7e460..b512be79b 100644 --- a/lix/libstore/remote-store.cc +++ b/lix/libstore/remote-store.cc @@ -489,12 +489,12 @@ void RemoteStore::addToStore(const ValidPathInfo & info, Source & source, } -void RemoteStore::addMultipleToStore( +kj::Promise> RemoteStore::addMultipleToStore( PathsSource & pathsToCopy, Activity & act, RepairFlag repair, CheckSigsFlag checkSigs) -{ +try { auto remoteVersion = getProtocol(); GeneratorSource source{ @@ -516,14 +516,17 @@ void RemoteStore::addMultipleToStore( }(this, pathsToCopy, remoteVersion) }; - addMultipleToStore(source, repair, checkSigs); + TRY_AWAIT(addMultipleToStore(source, repair, checkSigs)); + co_return result::success(); +} catch (...) { + co_return result::current_exception(); } -void RemoteStore::addMultipleToStore( +kj::Promise> RemoteStore::addMultipleToStore( Source & source, RepairFlag repair, CheckSigsFlag checkSigs) -{ +try { if (GET_PROTOCOL_MINOR(getConnection()->daemonVersion) >= 32) { auto conn(getConnection()); conn->to @@ -534,7 +537,10 @@ void RemoteStore::addMultipleToStore( source.drainInto(sink); }); } else - Store::addMultipleToStore(source, repair, checkSigs); + TRY_AWAIT(Store::addMultipleToStore(source, repair, checkSigs)); + co_return result::success(); +} catch (...) { + co_return result::current_exception(); } diff --git a/lix/libstore/remote-store.hh b/lix/libstore/remote-store.hh index d1a9aef9f..f4285a8ef 100644 --- a/lix/libstore/remote-store.hh +++ b/lix/libstore/remote-store.hh @@ -91,12 +91,12 @@ public: void addToStore(const ValidPathInfo & info, Source & nar, RepairFlag repair, CheckSigsFlag checkSigs) override; - void addMultipleToStore( + kj::Promise> addMultipleToStore( Source & source, RepairFlag repair, CheckSigsFlag checkSigs) override; - void addMultipleToStore( + kj::Promise> addMultipleToStore( PathsSource & pathsToCopy, Activity & act, RepairFlag repair, diff --git a/lix/libstore/store-api.cc b/lix/libstore/store-api.cc index 8cd1db55b..3709b54c2 100644 --- a/lix/libstore/store-api.cc +++ b/lix/libstore/store-api.cc @@ -286,12 +286,12 @@ StorePath Store::addToStore( return addToStoreFromDump(source, name, method, hashAlgo, repair, references); } -void Store::addMultipleToStore( +kj::Promise> Store::addMultipleToStore( PathsSource & pathsToCopy, Activity & act, RepairFlag repair, CheckSigsFlag checkSigs) -{ +try { std::atomic nrDone{0}; std::atomic nrFailed{0}; std::atomic bytesExpected{0}; @@ -361,13 +361,16 @@ void Store::addMultipleToStore( nrDone++; showProgress(); }); + co_return result::success(); +} catch (...) { + co_return result::current_exception(); } -void Store::addMultipleToStore( +kj::Promise> Store::addMultipleToStore( Source & source, RepairFlag repair, CheckSigsFlag checkSigs) -{ +try { auto remoteVersion = getProtocol(); auto expected = readNum(source); @@ -379,6 +382,9 @@ void Store::addMultipleToStore( info.ultimate = false; addToStore(info, source, repair, checkSigs); } + co_return result::success(); +} catch (...) { + co_return result::current_exception(); } namespace { @@ -1288,7 +1294,7 @@ try { }); } - dstStore.addMultipleToStore(pathsToCopy, act, repair, checkSigs); + TRY_AWAIT(dstStore.addMultipleToStore(pathsToCopy, act, repair, checkSigs)); co_return pathsMap; } catch (...) { diff --git a/lix/libstore/store-api.hh b/lix/libstore/store-api.hh index db4411757..59b398c0f 100644 --- a/lix/libstore/store-api.hh +++ b/lix/libstore/store-api.hh @@ -507,12 +507,12 @@ public: /** * Import multiple paths into the store. */ - virtual void addMultipleToStore( + virtual kj::Promise> addMultipleToStore( Source & source, RepairFlag repair = NoRepair, CheckSigsFlag checkSigs = CheckSigs); - virtual void addMultipleToStore( + virtual kj::Promise> addMultipleToStore( PathsSource & pathsToCopy, Activity & act, RepairFlag repair = NoRepair,