Nix 2.93.3
Lix: A modern, delicious implementation of the Nix package manager; unstable internal interfaces
Loading...
Searching...
No Matches
derivation-goal.hh
Go to the documentation of this file.
1#pragma once
3
11#include <kj/time.h>
12
13namespace nix {
14
15using std::map;
16
17struct HookInstance;
18
20 struct [[nodiscard]] Accept {
21 kj::Promise<Outcome<void, Goal::WorkResult>> promise;
22 };
23 struct [[nodiscard]] Decline {};
24 struct [[nodiscard]] Postpone {};
25};
26
27struct [[nodiscard]] HookReply
29 std::variant<HookReplyBase::Accept, HookReplyBase::Decline, HookReplyBase::Postpone>
30{
31 HookReply() = delete;
32 using variant::variant;
33};
34
39enum struct PathStatus {
40 Corrupt,
41 Absent,
42 Valid,
43};
44
46 StorePath path;
47 PathStatus status;
51 bool isValid() const {
52 return status == PathStatus::Valid;
53 }
54
57 bool isPresent() const {
58 return status == PathStatus::Corrupt
59 || status == PathStatus::Valid;
60 }
61};
62
64 bool wanted;
65 Hash outputHash;
66 std::optional<InitialOutputStatus> known = {};
67};
68
72struct DerivationGoal : public Goal
73{
74 struct InputStream;
75
80 bool isDone = false;
81
86
89
93 std::shared_ptr<DerivationGoal> resolvedDrvGoal;
94
99
105 std::map<std::pair<StorePath, std::string>, StorePath> inputDrvOutputs;
106
115 OutputsUnmodifedDontNeed,
127 };
128
132 NeedRestartForMoreOutputs needRestart = NeedRestartForMoreOutputs::OutputsUnmodifedDontNeed;
133
134 bool anyHashMismatchSeen = false;
135 bool anyCheckMismatchSeen = false;
136
156
162
166 std::unique_ptr<Derivation> drv;
167
168 std::unique_ptr<ParsedDerivation> parsedDrv;
169
173
177 std::optional<PathLocks> outputLocks;
178
183 StorePathSet inputPaths;
184
185 std::map<std::string, InitialOutput> initialOutputs;
186
191
196 std::shared_ptr<BufferedSink> logFileSink, logSink;
197
201 unsigned long logSize;
202
206 std::list<std::string> logTail;
207
208 std::string currentLogLine;
209 size_t currentLogLinePos = 0; // to handle carriage return
210
211 std::string currentHookLine;
212
216 std::unique_ptr<HookInstance> hook;
217
224
228 std::optional<DerivationType> derivationType;
229
230 BuildMode buildMode;
231
232 NotifyingCounter<uint64_t>::Bump mcExpectedBuilds, mcRunningBuilds;
233
234 std::unique_ptr<Activity> act;
235
239 std::unique_ptr<Activity> actLock;
240
241 std::map<ActivityId, Activity> builderActivities;
242
246 std::string machineName;
247
249 struct DrvHasRoot { explicit DrvHasRoot() = default; };
250
251 DerivationGoal(const StorePath & drvPath,
253 BuildMode buildMode = bmNormal);
254 DerivationGoal(DrvHasRoot, const StorePath & drvPath, const BasicDerivation & drv,
256 BuildMode buildMode = bmNormal);
257 virtual ~DerivationGoal() noexcept(false);
258
259 WorkResult timedOut(Error && ex);
260
261 kj::Promise<Result<WorkResult>> workImpl() noexcept override;
262
266 bool addWantedOutputs(const OutputsSpec & outputs);
267
271 kj::Promise<Result<WorkResult>> getDerivation() noexcept;
272 kj::Promise<Result<WorkResult>> loadDerivation() noexcept;
273 kj::Promise<Result<WorkResult>> haveDerivation() noexcept;
274 kj::Promise<Result<WorkResult>> outputsSubstitutionTried() noexcept;
275 kj::Promise<Result<WorkResult>> gaveUpOnSubstitution() noexcept;
276 kj::Promise<Result<WorkResult>> closureRepaired() noexcept;
277 kj::Promise<Result<WorkResult>> inputsRealised() noexcept;
278 kj::Promise<Result<WorkResult>> tryToBuild() noexcept;
279 virtual kj::Promise<Result<WorkResult>> tryLocalBuild() noexcept;
280 kj::Promise<Result<WorkResult>> buildDone() noexcept;
281
282 kj::Promise<Result<WorkResult>> resolvedFinished() noexcept;
283
288
289 virtual int getChildStatus();
290
295 virtual kj::Promise<Result<SingleDrvOutputs>> registerOutputs();
296
301
305 virtual void signRealisation(Realisation&) {}
306
310 void closeLogFile();
311
315 virtual void closeReadPipes();
316
320 virtual void cleanupHookFinally();
321 virtual void cleanupPreChildKill();
322 virtual void cleanupPostChildKill();
323 virtual bool cleanupDecideWhetherDiskFull();
324 virtual void cleanupPostOutputsRegisteredModeCheck();
325 virtual void cleanupPostOutputsRegisteredModeNonCheck();
326
327protected:
328 kj::TimePoint lastChildActivity = kj::minValue;
329
330 kj::Promise<Outcome<void, WorkResult>> handleChildOutput() noexcept;
331 kj::Promise<Outcome<void, WorkResult>>
332 handleChildStreams(InputStream & builderIn, InputStream * hookIn) noexcept;
333 kj::Promise<Outcome<void, WorkResult>> handleBuilderOutput(InputStream & in) noexcept;
334 kj::Promise<Outcome<void, WorkResult>> handleHookOutput(InputStream & in) noexcept;
335 kj::Promise<Outcome<void, WorkResult>> monitorForSilence() noexcept;
336 WorkResult tooMuchLogs();
337 void flushLine();
338
339public:
345 kj::Promise<Result<std::map<std::string, std::optional<StorePath>>>> queryPartialDerivationOutputMap();
346 kj::Promise<Result<OutputPathMap>> queryDerivationOutputMap();
347
354 kj::Promise<Result<std::pair<bool, SingleDrvOutputs>>> checkPathValidity();
355
360 kj::Promise<Result<SingleDrvOutputs>> assertPathValidity();
361
365 virtual void killChild();
366
367 kj::Promise<Result<WorkResult>> repairClosure() noexcept;
368
369 void started();
370
371 WorkResult done(
372 BuildResult::Status status,
373 SingleDrvOutputs builtOutputs = {},
374 std::optional<Error> ex = {});
375
376 void waiteeDone(GoalPtr waitee) override;
377
378 virtual bool respectsTimeouts()
379 {
380 return false;
381 }
382
383 StorePathSet exportReferences(const StorePathSet & storePaths);
384
385 JobCategory jobCategory() const override {
386 return JobCategory::Build;
387 };
388};
389
390MakeError(NotDeterministic, BuildError);
391
392}
Definition file-descriptor.hh:51
Definition notifying-counter.hh:19
Definition path.hh:21
Definition worker.hh:89
PathStatus
Definition derivation-goal.hh:39
JobCategory
Definition goal.hh:36
@ Build
Definition goal.hh:40
std::map< OutputName, Realisation > SingleDrvOutputs
Definition realisation.hh:89
Definition derivations.hh:274
Definition build-result.hh:17
Definition derivation-goal.hh:249
Definition derivation-goal.cc:1404
std::unique_ptr< HookInstance > hook
Definition derivation-goal.hh:216
JobCategory jobCategory() const override
Hint for the scheduler, which concurrency limit applies.
Definition derivation-goal.hh:385
bool addWantedOutputs(const OutputsSpec &outputs)
Definition derivation-goal.cc:138
std::optional< PathLocks > outputLocks
Definition derivation-goal.hh:177
std::unique_ptr< Derivation > drv
Definition derivation-goal.hh:166
unsigned long logSize
Definition derivation-goal.hh:201
HookReply tryBuildHook()
Definition derivation-goal.cc:1234
bool isDone
Definition derivation-goal.hh:80
kj::Promise< Result< SingleDrvOutputs > > assertPathValidity()
Definition derivation-goal.cc:1745
kj::Promise< Result< std::map< std::string, std::optional< StorePath > > > > queryPartialDerivationOutputMap()
Definition derivation-goal.cc:1621
void closeLogFile()
Definition derivation-goal.cc:1384
virtual kj::Promise< Result< SingleDrvOutputs > > registerOutputs()
Definition derivation-goal.cc:1338
Path openLogFile()
Definition derivation-goal.cc:1350
NeedRestartForMoreOutputs needRestart
Definition derivation-goal.hh:132
kj::Promise< Result< std::pair< bool, SingleDrvOutputs > > > checkPathValidity()
Definition derivation-goal.cc:1663
std::optional< DerivationType > derivationType
Definition derivation-goal.hh:228
NeedRestartForMoreOutputs
Definition derivation-goal.hh:110
@ BuildInProgressWillNotNeed
Definition derivation-goal.hh:126
@ OutputsAddedDoNeed
Definition derivation-goal.hh:120
virtual void cleanupHookFinally()
Definition derivation-goal.cc:929
RetrySubstitution retrySubstitution
Definition derivation-goal.hh:161
std::map< std::pair< StorePath, std::string >, StorePath > inputDrvOutputs
Definition derivation-goal.hh:105
AutoCloseFD * builderOutFD
Definition derivation-goal.hh:223
OutputsSpec wantedOutputs
Definition derivation-goal.hh:98
kj::Promise< Result< WorkResult > > getDerivation() noexcept
Definition derivation-goal.cc:164
AutoCloseFD fdLogFile
Definition derivation-goal.hh:195
std::shared_ptr< DerivationGoal > resolvedDrvGoal
Definition derivation-goal.hh:93
RetrySubstitution
Definition derivation-goal.hh:140
@ YesNeed
Definition derivation-goal.hh:149
@ NoNeed
Definition derivation-goal.hh:144
@ AlreadyRetried
Definition derivation-goal.hh:154
StorePathSet inputPaths
Definition derivation-goal.hh:183
virtual void closeReadPipes()
Definition derivation-goal.cc:921
std::unique_ptr< Activity > actLock
Definition derivation-goal.hh:239
virtual void killChild()
Definition derivation-goal.cc:111
bool useDerivation
Definition derivation-goal.hh:85
std::list< std::string > logTail
Definition derivation-goal.hh:206
BuildResult buildResult
Definition derivation-goal.hh:190
std::string machineName
Definition derivation-goal.hh:246
virtual void signRealisation(Realisation &)
Definition derivation-goal.hh:305
StorePath drvPath
Definition derivation-goal.hh:88
Definition goal.hh:89
const bool isDependency
Definition goal.hh:61
Worker & worker
Definition goal.hh:54
Definition hash.hh:41
Definition hook-instance.hh:11
Definition derivation-goal.hh:20
Definition derivation-goal.hh:23
Definition derivation-goal.hh:24
Definition derivation-goal.hh:19
Definition derivation-goal.hh:30
Definition derivation-goal.hh:45
bool isPresent() const
Definition derivation-goal.hh:57
bool isValid() const
Definition derivation-goal.hh:51
Definition derivation-goal.hh:63
Definition outputs-spec.hh:28
Definition realisation.hh:49
std::string Path
Definition types.hh:28