From b02a66d13ec83a40fce6072da99a258050acc482 Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Sat, 18 Oct 2025 19:43:44 +0200 Subject: [PATCH] libstore: simplify hook instance handling we never need the connection or the rpc client directly after the hook is constructed, only the hook instance rpc object. wrapping them using kj primitives makes this more explicit and prevents destruction errors Change-Id: I7e0b14d7e365c2e001273e04c0e741ba4afb12f2 --- lix/libstore/build/derivation-goal.cc | 4 +--- lix/libstore/build/hook-instance.cc | 5 ++--- lix/libstore/build/hook-instance.hh | 12 ++---------- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/lix/libstore/build/derivation-goal.cc b/lix/libstore/build/derivation-goal.cc index 0cad92073..01972f6d9 100644 --- a/lix/libstore/build/derivation-goal.cc +++ b/lix/libstore/build/derivation-goal.cc @@ -1055,7 +1055,7 @@ try { KJ_DEFER(hook = nullptr); auto output = handleChildOutput(); - auto buildReq = hook->rpc.buildRequest(); + auto buildReq = hook->rpc->buildRequest(); RPC_FILL(buildReq, setAmWilling, slotToken.valid()); RPC_FILL(buildReq, setNeededSystem, drv->platform); RPC_FILL(buildReq, initDrvPath, drvPath, worker.store); @@ -1114,8 +1114,6 @@ try { // close the rpc connection to have the hook exit hook->rpc = nullptr; - hook->client = nullptr; - hook->conn = nullptr; if (auto error = TRY_AWAIT(output)) { co_return HookResult::Accept{std::move(*error)}; diff --git a/lix/libstore/build/hook-instance.cc b/lix/libstore/build/hook-instance.cc index 0f76d61fc..7e050d37e 100644 --- a/lix/libstore/build/hook-instance.cc +++ b/lix/libstore/build/hook-instance.cc @@ -7,6 +7,7 @@ #include "lix/libutil/rpc.hh" #include "lix/libutil/strings.hh" #include "lix/libutil/types-rpc.hh" // IWYU pragma: keep +#include #include namespace nix { @@ -76,9 +77,7 @@ try { co_return std::make_unique( std::move(fromHook_.readSide), - std::move(conn), - std::move(client), - std::move(rpc), + kj::heap(std::move(rpc)).attach(std::move(conn), std::move(client)), std::move(pid) ); } catch (...) { diff --git a/lix/libstore/build/hook-instance.hh b/lix/libstore/build/hook-instance.hh index 7d55d0a20..5bddf3ba7 100644 --- a/lix/libstore/build/hook-instance.hh +++ b/lix/libstore/build/hook-instance.hh @@ -19,24 +19,16 @@ struct HookInstance */ AutoCloseFD fromHook; - kj::Own conn; - std::unique_ptr client; - rpc::build_remote::HookInstance::Client rpc; + kj::Own rpc; std::map activities; static kj::Promise>> create(); HookInstance( - AutoCloseFD fromHook, - kj::Own conn, - std::unique_ptr client, - rpc::build_remote::HookInstance::Client rpc, - Pid pid + AutoCloseFD fromHook, kj::Own rpc, Pid pid ) : fromHook(std::move(fromHook)) - , conn(std::move(conn)) - , client(std::move(client)) , rpc(std::move(rpc)) , pidOrStatus(std::move(pid)) {