about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2008-08-04T13·15+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2008-08-04T13·15+0000
commit5adbb0aabe54479304453bf5e544f84b40ee7dd7 (patch)
treefd4fc6b57a3d9e7aa81ae5ad354e0cbce05304fd /src
parent5b1052663a35940fc99ae6a8fcf6e707ae939fef (diff)
* build.cc: only use a substituter if it returns info for a path.
Diffstat (limited to 'src')
-rw-r--r--src/libstore/build.cc47
-rw-r--r--src/libstore/local-store.cc58
-rw-r--r--src/libstore/local-store.hh3
3 files changed, 57 insertions, 51 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 22f1c64ae3a8..33a53c148f13 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -2187,14 +2187,34 @@ void SubstitutionGoal::init()
         return;
     }
 
-    if (!worker.store.querySubstitutablePathInfo(storePath, info)) {
+    subs = substituters;
+    
+    tryNext();
+}
+
+
+void SubstitutionGoal::tryNext()
+{
+    trace("trying next substituter");
+
+    if (subs.size() == 0) {
+        /* None left.  Terminate this goal and let someone else deal
+           with it. */
         printMsg(lvlError,
-            format("path `%1%' is required, but there is no substituter that knows anything about it")
+            format("path `%1%' is required, but there is no substituter that can build it")
             % storePath);
         amDone(ecFailed);
         return;
     }
 
+    sub = subs.front();
+    subs.pop_front();
+
+    if (!worker.store.querySubstitutablePathInfo(sub, storePath, info)) {
+        tryNext();
+        return;
+    }
+
     /* To maintain the closure invariant, we first have to realise the
        paths referenced by this one. */
     foreach (PathSet::iterator, i, info.references)
@@ -2223,29 +2243,6 @@ void SubstitutionGoal::referencesValid()
         if (*i != storePath) /* ignore self-references */
             assert(worker.store.isValidPath(*i));
 
-    subs = substituters;
-
-    tryNext();
-}
-
-
-void SubstitutionGoal::tryNext()
-{
-    trace("trying next substituter");
-
-    if (subs.size() == 0) {
-        /* None left.  Terminate this goal and let someone else deal
-           with it. */
-        printMsg(lvlError,
-            format("path `%1%' is required, but there is no substituter that can build it")
-            % storePath);
-        amDone(ecFailed);
-        return;
-    }
-
-    sub = subs.front();
-    subs.pop_front();
-
     state = &SubstitutionGoal::tryToRun;
     worker.waitForBuildSlot(shared_from_this());
 }
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index 141c7a85297f..ccf1a51bc5b2 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -541,38 +541,44 @@ bool LocalStore::hasSubstitutes(const Path & path)
 }
 
 
-bool LocalStore::querySubstitutablePathInfo(const Path & path,
-    SubstitutablePathInfo & info)
+bool LocalStore::querySubstitutablePathInfo(const Path & substituter,
+    const Path & path, SubstitutablePathInfo & info)
 {
-    foreach (Paths::iterator, i, substituters) {
-        RunningSubstituter & run(runningSubstituters[*i]);
-        startSubstituter(*i, run);
+    RunningSubstituter & run(runningSubstituters[substituter]);
+    startSubstituter(substituter, run);
 
-        *run.to << "info\n" << path << "\n" << std::flush;
+    *run.to << "info\n" << path << "\n" << std::flush;
+        
+    string s;
 
-        string s;
+    int res;
+    getline(*run.from, s);
+    if (!string2Int(s, res)) abort();
 
-        int res;
-        getline(*run.from, s);
-        if (!string2Int(s, res)) abort();
-
-        if (res) {
-            getline(*run.from, info.deriver);
-            int nrRefs;
-            getline(*run.from, s);
-            if (!string2Int(s, nrRefs)) abort();
-            while (nrRefs--) {
-                Path p; getline(*run.from, p);
-                info.references.insert(p);
-            }
-            getline(*run.from, s);
-            long long size;
-            if (!string2Int(s, size)) abort();
-            info.downloadSize = size;
-            return true;
-        }
+    if (!res) return false;
+    
+    getline(*run.from, info.deriver);
+    int nrRefs;
+    getline(*run.from, s);
+    if (!string2Int(s, nrRefs)) abort();
+    while (nrRefs--) {
+        Path p; getline(*run.from, p);
+        info.references.insert(p);
     }
+    getline(*run.from, s);
+    long long size;
+    if (!string2Int(s, size)) abort();
+    info.downloadSize = size;
     
+    return true;
+}
+
+
+bool LocalStore::querySubstitutablePathInfo(const Path & path,
+    SubstitutablePathInfo & info)
+{
+    foreach (Paths::iterator, i, substituters)
+        if (querySubstitutablePathInfo(*i, path, info)) return true;
     return false;
 }
 
diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh
index f096bdd8557a..8266184f0edf 100644
--- a/src/libstore/local-store.hh
+++ b/src/libstore/local-store.hh
@@ -86,6 +86,9 @@ public:
     bool querySubstitutablePathInfo(const Path & path,
         SubstitutablePathInfo & info);
     
+    bool querySubstitutablePathInfo(const Path & substituter,
+        const Path & path, SubstitutablePathInfo & info);
+    
     Path addToStore(const Path & srcPath, bool fixed = false,
         bool recursive = false, string hashAlgo = "",
         PathFilter & filter = defaultPathFilter);