diff options
author | eldritch horrors <pennae@lix.systems> | 2024-10-19 16:17:58 +0200 |
---|---|---|
committer | eldritch horrors <pennae@lix.systems> | 2024-10-19 16:17:58 +0200 |
commit | 564d931134190a88026b74238d534d6b0624adb3 (patch) | |
tree | 485a400e41fbddd62584b38169b7c0ca28bf0d65 /src | |
parent | f6077314fa6aff862758095bb55fe844e9162a1d (diff) |
libstore: always release build/substitution slot tokens
not doing this can freeze slots until the goal that occupied them is
freed (rather than simply complete), and then can freeze the system.
fixes #549
Change-Id: I042df04222f8ffbaa18ef4a4eae6cbd6f89b679e
Diffstat (limited to 'src')
-rw-r--r-- | src/libstore/build/goal.cc | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/libstore/build/goal.cc b/src/libstore/build/goal.cc index 02b22b8ad..db16e2cf8 100644 --- a/src/libstore/build/goal.cc +++ b/src/libstore/build/goal.cc @@ -22,6 +22,12 @@ kj::Promise<void> Goal::waitForAWhile() kj::Promise<Result<Goal::WorkResult>> Goal::work() noexcept try { + // always clear the slot token, no matter what happens. not doing this + // can cause builds to get stuck on exceptions (or other early exist). + // ideally we'd use scoped slot tokens instead of keeping them in some + // goal member variable, but we cannot do this yet for legacy reasons. + KJ_DEFER({ slotToken = {}; }); + BOOST_OUTCOME_CO_TRY(auto result, co_await workImpl()); trace("done"); |