diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-01-25T17·08+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2005-01-25T17·08+0000 |
commit | 066da4ab852ebe4288536149824ea175dc36cad4 (patch) | |
tree | d9258a2d224a0574c0135cd799cb704fc8c25433 /src/libstore/build.cc | |
parent | c6290e42bc8890e2036013773a98e3551352c91a (diff) |
* Really fix the substitute mechanism, i.e., ensure the closure
invariant by registering references through the manifest. * Added a test for nix-pull.
Diffstat (limited to 'src/libstore/build.cc')
-rw-r--r-- | src/libstore/build.cc | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 026721f3b9d8..7dd7412e9f21 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -472,9 +472,8 @@ void DerivationGoal::outputsSubstituted() { trace("all outputs substituted (maybe)"); - if (nrFailed > 0 && !tryFallback) { + if (nrFailed > 0 && !tryFallback) throw Error(format("some substitutes for the outputs of derivation `%1%' failed; try `--fallback'") % drvPath); - } nrFailed = 0; @@ -1252,6 +1251,9 @@ private: /* The current substitute. */ Substitute sub; + /* Outgoing references for this path. */ + PathSet references; + /* Pipe for the substitute's standard output/error. */ Pipe logPipe; @@ -1272,6 +1274,7 @@ public: /* The states. */ void init(); + void referencesValid(); void tryNext(); void tryToRun(); void finished(); @@ -1313,13 +1316,35 @@ void SubstitutionGoal::init() return; } - /* !!! build the outgoing references of this path first to - maintain the closure invariant! */ - - /* Otherwise, get the substitutes. */ + /* Read the substitutes. */ subs = querySubstitutes(storePath); - /* Try the first one. */ + /* To maintain the closure invairant, we first have to realise the + paths referenced by this one. */ + queryReferences(storePath, references); + + for (PathSet::iterator i = references.begin(); + i != references.end(); ++i) + addWaitee(worker.makeSubstitutionGoal(*i)); + + if (waitees.empty()) /* to prevent hang (no wake-up event) */ + referencesValid(); + else + state = &SubstitutionGoal::referencesValid; +} + + +void SubstitutionGoal::referencesValid() +{ + trace("all referenced realised"); + + if (nrFailed > 0) + throw Error(format("some references of path `%1%' could not be realised") % storePath); + + for (PathSet::iterator i = references.begin(); + i != references.end(); ++i) + assert(isValidPath(*i)); + tryNext(); } |