about summary refs log tree commit diff
path: root/src/libstore
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-07-11T21·52-0400
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-07-11T21·52-0400
commit09a6321aeb7393cdb4b5af62d2e4106d83124fdf (patch)
treedc7066fa0145a37b4a82edd7b8a64430293a3bfa /src/libstore
parent58ef4d9a95584fb89ebcf6222fbac6e698aa6b0b (diff)
Replace hasSubstitutes() with querySubstitutablePaths()
querySubstitutablePaths() takes a set of paths, so this greatly
reduces daemon <-> client latency.
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/local-store.cc18
-rw-r--r--src/libstore/local-store.hh4
-rw-r--r--src/libstore/remote-store.cc24
-rw-r--r--src/libstore/remote-store.hh2
-rw-r--r--src/libstore/store-api.hh4
-rw-r--r--src/libstore/worker-protocol.hh1
6 files changed, 35 insertions, 18 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index e3d23fdfbc..6e4cd053c8 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -932,16 +932,24 @@ template<class T> T getIntLine(int fd)
 }
 
 
-bool LocalStore::hasSubstitutes(const Path & path)
+PathSet LocalStore::querySubstitutablePaths(const PathSet & paths)
 {
+    PathSet res;
     foreach (Paths::iterator, i, substituters) {
+        if (res.size() == paths.size()) break;
         RunningSubstituter & run(runningSubstituters[*i]);
         startSubstituter(*i, run);
-        writeLine(run.to, "have\n" + path);
-        if (getIntLine<int>(run.from)) return true;
+        string s = "have ";
+        foreach (PathSet::const_iterator, i, paths)
+            if (res.find(*i) == res.end()) { s += *i; s += " "; }
+        writeLine(run.to, s);
+        while (true) {
+            Path path = readLine(run.from);
+            if (path == "") break;
+            res.insert(path);
+        }
     }
-
-    return false;
+    return res;
 }
 
 
diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh
index 7398c1b9e5..3281a9106e 100644
--- a/src/libstore/local-store.hh
+++ b/src/libstore/local-store.hh
@@ -123,9 +123,7 @@ public:
 
     StringSet queryDerivationOutputNames(const Path & path);
     
-    PathSet querySubstitutablePaths();
-    
-    bool hasSubstitutes(const Path & path);
+    PathSet querySubstitutablePaths(const PathSet & paths);
 
     void querySubstitutablePathInfos(const Path & substituter,
         PathSet & paths, SubstitutablePathInfos & infos);
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 0cd29c5751..2232720c2b 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -219,13 +219,13 @@ bool RemoteStore::isValidPath(const Path & path)
 
 PathSet RemoteStore::queryValidPaths(const PathSet & paths)
 {
+    openConnection();
     if (GET_PROTOCOL_MINOR(daemonVersion) < 12) {
         PathSet res;
         foreach (PathSet::const_iterator, i, paths)
             if (isValidPath(*i)) res.insert(*i);
         return res;
     } else {
-        openConnection();
         writeInt(wopQueryValidPaths, to);
         writeStrings(paths, to);
         processStderr();
@@ -243,14 +243,24 @@ PathSet RemoteStore::queryAllValidPaths()
 }
 
 
-bool RemoteStore::hasSubstitutes(const Path & path)
+PathSet RemoteStore::querySubstitutablePaths(const PathSet & paths)
 {
     openConnection();
-    writeInt(wopHasSubstitutes, to);
-    writeString(path, to);
-    processStderr();
-    unsigned int reply = readInt(from);
-    return reply != 0;
+    if (GET_PROTOCOL_MINOR(daemonVersion) < 12) {
+        PathSet res;
+        foreach (PathSet::const_iterator, i, paths) {
+            writeInt(wopHasSubstitutes, to);
+            writeString(*i, to);
+            processStderr();
+            if (readInt(from)) res.insert(*i);
+        }
+        return res;
+    } else {
+        writeInt(wopQuerySubstitutablePaths, to);
+        writeStrings(paths, to);
+        processStderr();
+        return readStorePaths<PathSet>(from);
+    }
 }
 
 
diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh
index 2668fe2568..5b007be483 100644
--- a/src/libstore/remote-store.hh
+++ b/src/libstore/remote-store.hh
@@ -45,7 +45,7 @@ public:
     
     StringSet queryDerivationOutputNames(const Path & path);
 
-    bool hasSubstitutes(const Path & path);
+    PathSet querySubstitutablePaths(const PathSet & paths);
     
     void querySubstitutablePathInfos(const PathSet & paths,
         SubstitutablePathInfos & infos);
diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh
index 13dcd9269d..e7963d053f 100644
--- a/src/libstore/store-api.hh
+++ b/src/libstore/store-api.hh
@@ -145,8 +145,8 @@ public:
     /* Query the output names of the derivation denoted by `path'. */
     virtual StringSet queryDerivationOutputNames(const Path & path) = 0;
     
-    /* Query whether a path has substitutes. */
-    virtual bool hasSubstitutes(const Path & path) = 0;
+    /* Query which of the given paths have substitutes. */
+    virtual PathSet querySubstitutablePaths(const PathSet & paths) = 0;
 
     /* Query substitute info (i.e. references, derivers and download
        sizes) of a set of paths.  If a path does not have substitute
diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh
index b34ad48461..6011ec211d 100644
--- a/src/libstore/worker-protocol.hh
+++ b/src/libstore/worker-protocol.hh
@@ -42,6 +42,7 @@ typedef enum {
     wopQueryDerivationOutputNames = 28,
     wopQuerySubstitutablePathInfos = 29,
     wopQueryValidPaths = 30,
+    wopQuerySubstitutablePaths = 31,
 } WorkerOp;