From 4f08c85c69a3e0ae056aba3fe8ab2d289597edcd Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 2 Nov 2016 12:41:00 +0100 Subject: [PATCH] hydra-queue-runner: Fix assertion failure It was hitting assert(reservation.unique()); Since we do want the machine reservation to be released before calling wakeDispatcher(), let's use a different object for keeping track of active steps. --- src/hydra-queue-runner/builder.cc | 11 ++++++----- src/hydra-queue-runner/state.hh | 10 +++++++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/hydra-queue-runner/builder.cc b/src/hydra-queue-runner/builder.cc index 9f01425d..b0e96e95 100644 --- a/src/hydra-queue-runner/builder.cc +++ b/src/hydra-queue-runner/builder.cc @@ -13,13 +13,14 @@ void State::builder(MachineReservation::ptr reservation) nrStepsStarted++; - reservation->threadId = pthread_self(); - - activeSteps_.lock()->insert(reservation); + auto activeStep = std::make_shared(); + activeStep->step = reservation->step; + activeStep->threadId = pthread_self(); + activeSteps_.lock()->insert(activeStep); Finally removeActiveStep([&]() { - reservation->threadId = -1; - activeSteps_.lock()->erase(reservation); + activeStep->threadId = -1; + activeSteps_.lock()->erase(activeStep); }); auto step = reservation->step; diff --git a/src/hydra-queue-runner/state.hh b/src/hydra-queue-runner/state.hh index 31898d01..7de2af86 100644 --- a/src/hydra-queue-runner/state.hh +++ b/src/hydra-queue-runner/state.hh @@ -370,13 +370,17 @@ private: State & state; Step::ptr step; Machine::ptr machine; - pthread_t threadId = 0; - bool cancelled = false; MachineReservation(State & state, Step::ptr step, Machine::ptr machine); ~MachineReservation(); }; - nix::Sync>> activeSteps_; + struct ActiveStep + { + Step::ptr step; + pthread_t threadId; + }; + + nix::Sync>> activeSteps_; std::atomic lastDispatcherCheck{0};