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) {
|
foreach (Paths::iterator, i, substituters) {
|
||||||
|
if (res.size() == paths.size()) break;
|
||||||
RunningSubstituter & run(runningSubstituters[*i]);
|
RunningSubstituter & run(runningSubstituters[*i]);
|
||||||
startSubstituter(*i, run);
|
startSubstituter(*i, run);
|
||||||
writeLine(run.to, "have\n" + path);
|
string s = "have ";
|
||||||
if (getIntLine<int>(run.from)) return true;
|
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);
|
StringSet queryDerivationOutputNames(const Path & path);
|
||||||
|
|
||||||
PathSet querySubstitutablePaths();
|
PathSet querySubstitutablePaths(const PathSet & paths);
|
||||||
|
|
||||||
bool hasSubstitutes(const Path & path);
|
|
||||||
|
|
||||||
void querySubstitutablePathInfos(const Path & substituter,
|
void querySubstitutablePathInfos(const Path & substituter,
|
||||||
PathSet & paths, SubstitutablePathInfos & infos);
|
PathSet & paths, SubstitutablePathInfos & infos);
|
||||||
|
|
|
@ -219,13 +219,13 @@ bool RemoteStore::isValidPath(const Path & path)
|
||||||
|
|
||||||
PathSet RemoteStore::queryValidPaths(const PathSet & paths)
|
PathSet RemoteStore::queryValidPaths(const PathSet & paths)
|
||||||
{
|
{
|
||||||
|
openConnection();
|
||||||
if (GET_PROTOCOL_MINOR(daemonVersion) < 12) {
|
if (GET_PROTOCOL_MINOR(daemonVersion) < 12) {
|
||||||
PathSet res;
|
PathSet res;
|
||||||
foreach (PathSet::const_iterator, i, paths)
|
foreach (PathSet::const_iterator, i, paths)
|
||||||
if (isValidPath(*i)) res.insert(*i);
|
if (isValidPath(*i)) res.insert(*i);
|
||||||
return res;
|
return res;
|
||||||
} else {
|
} else {
|
||||||
openConnection();
|
|
||||||
writeInt(wopQueryValidPaths, to);
|
writeInt(wopQueryValidPaths, to);
|
||||||
writeStrings(paths, to);
|
writeStrings(paths, to);
|
||||||
processStderr();
|
processStderr();
|
||||||
|
@ -243,14 +243,24 @@ PathSet RemoteStore::queryAllValidPaths()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool RemoteStore::hasSubstitutes(const Path & path)
|
PathSet RemoteStore::querySubstitutablePaths(const PathSet & paths)
|
||||||
{
|
{
|
||||||
openConnection();
|
openConnection();
|
||||||
|
if (GET_PROTOCOL_MINOR(daemonVersion) < 12) {
|
||||||
|
PathSet res;
|
||||||
|
foreach (PathSet::const_iterator, i, paths) {
|
||||||
writeInt(wopHasSubstitutes, to);
|
writeInt(wopHasSubstitutes, to);
|
||||||
writeString(path, to);
|
writeString(*i, to);
|
||||||
processStderr();
|
processStderr();
|
||||||
unsigned int reply = readInt(from);
|
if (readInt(from)) res.insert(*i);
|
||||||
return reply != 0;
|
}
|
||||||
|
return res;
|
||||||
|
} else {
|
||||||
|
writeInt(wopQuerySubstitutablePaths, to);
|
||||||
|
writeStrings(paths, to);
|
||||||
|
processStderr();
|
||||||
|
return readStorePaths<PathSet>(from);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ public:
|
||||||
|
|
||||||
StringSet queryDerivationOutputNames(const Path & path);
|
StringSet queryDerivationOutputNames(const Path & path);
|
||||||
|
|
||||||
bool hasSubstitutes(const Path & path);
|
PathSet querySubstitutablePaths(const PathSet & paths);
|
||||||
|
|
||||||
void querySubstitutablePathInfos(const PathSet & paths,
|
void querySubstitutablePathInfos(const PathSet & paths,
|
||||||
SubstitutablePathInfos & infos);
|
SubstitutablePathInfos & infos);
|
||||||
|
|
|
@ -145,8 +145,8 @@ public:
|
||||||
/* Query the output names of the derivation denoted by `path'. */
|
/* Query the output names of the derivation denoted by `path'. */
|
||||||
virtual StringSet queryDerivationOutputNames(const Path & path) = 0;
|
virtual StringSet queryDerivationOutputNames(const Path & path) = 0;
|
||||||
|
|
||||||
/* Query whether a path has substitutes. */
|
/* Query which of the given paths have substitutes. */
|
||||||
virtual bool hasSubstitutes(const Path & path) = 0;
|
virtual PathSet querySubstitutablePaths(const PathSet & paths) = 0;
|
||||||
|
|
||||||
/* Query substitute info (i.e. references, derivers and download
|
/* Query substitute info (i.e. references, derivers and download
|
||||||
sizes) of a set of paths. If a path does not have substitute
|
sizes) of a set of paths. If a path does not have substitute
|
||||||
|
|
|
@ -42,6 +42,7 @@ typedef enum {
|
||||||
wopQueryDerivationOutputNames = 28,
|
wopQueryDerivationOutputNames = 28,
|
||||||
wopQuerySubstitutablePathInfos = 29,
|
wopQuerySubstitutablePathInfos = 29,
|
||||||
wopQueryValidPaths = 30,
|
wopQueryValidPaths = 30,
|
||||||
|
wopQuerySubstitutablePaths = 31,
|
||||||
} WorkerOp;
|
} WorkerOp;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -211,9 +211,12 @@ static int comparePriorities(EvalState & state,
|
||||||
|
|
||||||
static bool isPrebuilt(EvalState & state, const DrvInfo & elem)
|
static bool isPrebuilt(EvalState & state, const DrvInfo & elem)
|
||||||
{
|
{
|
||||||
|
assert(false);
|
||||||
|
#if 0
|
||||||
return
|
return
|
||||||
store->isValidPath(elem.queryOutPath(state)) ||
|
store->isValidPath(elem.queryOutPath(state)) ||
|
||||||
store->hasSubstitutes(elem.queryOutPath(state));
|
store->hasSubstitutes(elem.queryOutPath(state));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -931,8 +934,7 @@ static void opQuery(Globals & globals,
|
||||||
|
|
||||||
|
|
||||||
/* Query which paths have substitutes. */
|
/* Query which paths have substitutes. */
|
||||||
SubstitutablePathInfos subs;
|
PathSet validPaths, substitutablePaths;
|
||||||
PathSet validPaths;
|
|
||||||
if (printStatus) {
|
if (printStatus) {
|
||||||
PathSet paths;
|
PathSet paths;
|
||||||
foreach (vector<DrvInfo>::iterator, i, elems2)
|
foreach (vector<DrvInfo>::iterator, i, elems2)
|
||||||
|
@ -943,7 +945,7 @@ static void opQuery(Globals & globals,
|
||||||
i->setFailed();
|
i->setFailed();
|
||||||
}
|
}
|
||||||
validPaths = store->queryValidPaths(paths);
|
validPaths = store->queryValidPaths(paths);
|
||||||
store->querySubstitutablePathInfos(paths, subs);
|
substitutablePaths = store->querySubstitutablePaths(paths);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -969,7 +971,7 @@ static void opQuery(Globals & globals,
|
||||||
|
|
||||||
if (printStatus) {
|
if (printStatus) {
|
||||||
Path outPath = i->queryOutPath(globals.state);
|
Path outPath = i->queryOutPath(globals.state);
|
||||||
bool hasSubs = subs.find(outPath) != subs.end();
|
bool hasSubs = substitutablePaths.find(outPath) != substitutablePaths.end();
|
||||||
bool isInstalled = installed.find(outPath) != installed.end();
|
bool isInstalled = installed.find(outPath) != installed.end();
|
||||||
bool isValid = validPaths.find(outPath) != validPaths.end();
|
bool isValid = validPaths.find(outPath) != validPaths.end();
|
||||||
if (xmlOutput) {
|
if (xmlOutput) {
|
||||||
|
|
|
@ -309,9 +309,18 @@ static void performOp(unsigned int clientVersion,
|
||||||
case wopHasSubstitutes: {
|
case wopHasSubstitutes: {
|
||||||
Path path = readStorePath(from);
|
Path path = readStorePath(from);
|
||||||
startWork();
|
startWork();
|
||||||
bool result = store->hasSubstitutes(path);
|
PathSet res = store->querySubstitutablePaths(singleton<PathSet>(path));
|
||||||
stopWork();
|
stopWork();
|
||||||
writeInt(result, to);
|
writeInt(res.find(path) != res.end(), to);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case wopQuerySubstitutablePaths: {
|
||||||
|
PathSet paths = readStorePaths<PathSet>(from);
|
||||||
|
startWork();
|
||||||
|
PathSet res = store->querySubstitutablePaths(paths);
|
||||||
|
stopWork();
|
||||||
|
writeStrings(res, to);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue