Replace hasSubstitutes() with querySubstitutablePaths()
querySubstitutablePaths() takes a set of paths, so this greatly reduces daemon <-> client latency.
This commit is contained in:
		
							parent
							
								
									58ef4d9a95
								
							
						
					
					
						commit
						09a6321aeb
					
				
					 8 changed files with 52 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,6 +42,7 @@ typedef enum {
 | 
			
		|||
    wopQueryDerivationOutputNames = 28,
 | 
			
		||||
    wopQuerySubstitutablePathInfos = 29,
 | 
			
		||||
    wopQueryValidPaths = 30,
 | 
			
		||||
    wopQuerySubstitutablePaths = 31,
 | 
			
		||||
} WorkerOp;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue