libstore: limit CA realisation info substitution concurrency

this seems to be an oversight, considering that regular substitutions
are concurrency-limited. while not particularly necessary at present,
once we've removed the `Callback` based interfaces it will be needed.

Change-Id: Ide2d08169fcc24752cbd07a1d33fb8482f7034f5
This commit is contained in:
eldritch horrors 2024-04-27 18:51:39 +02:00
parent 29f93e1e0d
commit 230860dbb8
3 changed files with 22 additions and 0 deletions

View file

@ -3,6 +3,7 @@
#include "worker.hh" #include "worker.hh"
#include "substitution-goal.hh" #include "substitution-goal.hh"
#include "callback.hh" #include "callback.hh"
#include "signals.hh"
namespace nix { namespace nix {
@ -38,6 +39,18 @@ void DrvOutputSubstitutionGoal::tryNext()
{ {
trace("trying next substituter"); trace("trying next substituter");
/* Make sure that we are allowed to start a substitution. Note that even
if maxSubstitutionJobs == 0, we still allow a substituter to run. This
prevents infinite waiting. */
if (worker.runningCASubstitutions >= std::max(1U, settings.maxSubstitutionJobs.get())) {
worker.waitForBuildSlot(shared_from_this());
return;
}
maintainRunningSubstitutions =
std::make_unique<MaintainCount<uint64_t>>(worker.runningCASubstitutions);
worker.updateProgress();
if (subs.size() == 0) { if (subs.size() == 0) {
/* None left. Terminate this goal and let someone else deal /* None left. Terminate this goal and let someone else deal
with it. */ with it. */
@ -87,6 +100,7 @@ void DrvOutputSubstitutionGoal::tryNext()
void DrvOutputSubstitutionGoal::realisationFetched() void DrvOutputSubstitutionGoal::realisationFetched()
{ {
worker.childTerminated(this); worker.childTerminated(this);
maintainRunningSubstitutions.reset();
try { try {
outputInfo = downloadState->promise.get_future().get(); outputInfo = downloadState->promise.get_future().get();

View file

@ -41,6 +41,13 @@ class DrvOutputSubstitutionGoal : public Goal {
*/ */
std::shared_ptr<Store> sub; std::shared_ptr<Store> sub;
/**
* The substituter thread.
*/
std::thread thr;
std::unique_ptr<MaintainCount<uint64_t>> maintainRunningSubstitutions;
struct DownloadState struct DownloadState
{ {
Pipe outPipe; Pipe outPipe;

View file

@ -166,6 +166,7 @@ public:
uint64_t doneSubstitutions = 0; uint64_t doneSubstitutions = 0;
uint64_t failedSubstitutions = 0; uint64_t failedSubstitutions = 0;
uint64_t runningSubstitutions = 0; uint64_t runningSubstitutions = 0;
uint64_t runningCASubstitutions = 0;
uint64_t expectedDownloadSize = 0; uint64_t expectedDownloadSize = 0;
uint64_t doneDownloadSize = 0; uint64_t doneDownloadSize = 0;
uint64_t expectedNarSize = 0; uint64_t expectedNarSize = 0;