* More remote operations.
* Added new operation hasSubstitutes(), which is more efficient than querySubstitutes().size() > 0.
This commit is contained in:
parent
aac547a8b3
commit
0565b5f2b3
12 changed files with 138 additions and 46 deletions
|
@ -660,7 +660,7 @@ void DerivationGoal::haveStoreExpr()
|
|||
i != invalidOutputs.end(); ++i)
|
||||
/* Don't bother creating a substitution goal if there are no
|
||||
substitutes. */
|
||||
if (store->querySubstitutes(*i).size() > 0)
|
||||
if (store->hasSubstitutes(*i))
|
||||
addWaitee(worker.makeSubstitutionGoal(*i));
|
||||
|
||||
if (waitees.empty()) /* to prevent hang (no wake-up event) */
|
||||
|
|
|
@ -481,15 +481,15 @@ void registerSubstitute(const Transaction & txn,
|
|||
}
|
||||
|
||||
|
||||
Substitutes querySubstitutes(const Transaction & txn, const Path & srcPath)
|
||||
Substitutes querySubstitutes(const Transaction & txn, const Path & path)
|
||||
{
|
||||
return readSubstitutes(txn, srcPath);
|
||||
return readSubstitutes(txn, path);
|
||||
}
|
||||
|
||||
|
||||
Substitutes LocalStore::querySubstitutes(const Path & srcPath)
|
||||
Substitutes LocalStore::querySubstitutes(const Path & path)
|
||||
{
|
||||
return nix::querySubstitutes(noTxn, srcPath);
|
||||
return nix::querySubstitutes(noTxn, path);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ void queryMissing(const PathSet & targets,
|
|||
for (DerivationOutputs::iterator i = drv.outputs.begin();
|
||||
i != drv.outputs.end(); ++i)
|
||||
if (!store->isValidPath(i->second.path) &&
|
||||
store->querySubstitutes(i->second.path).size() == 0)
|
||||
!store->hasSubstitutes(i->second.path))
|
||||
mustBuild = true;
|
||||
|
||||
if (mustBuild) {
|
||||
|
@ -81,7 +81,7 @@ void queryMissing(const PathSet & targets,
|
|||
|
||||
else {
|
||||
if (store->isValidPath(p)) continue;
|
||||
if (store->querySubstitutes(p).size() > 0)
|
||||
if (store->hasSubstitutes(p))
|
||||
willSubstitute.insert(p);
|
||||
PathSet refs;
|
||||
store->queryReferences(p, todo);
|
||||
|
|
|
@ -39,7 +39,7 @@ RemoteStore::RemoteStore()
|
|||
throw SysError("dupping read side");
|
||||
|
||||
execlp(worker.c_str(), worker.c_str(),
|
||||
"-vvv", "--slave", NULL);
|
||||
"--slave", NULL);
|
||||
|
||||
throw SysError(format("executing `%1%'") % worker);
|
||||
|
||||
|
@ -81,32 +81,44 @@ bool RemoteStore::isValidPath(const Path & path)
|
|||
}
|
||||
|
||||
|
||||
Substitutes RemoteStore::querySubstitutes(const Path & srcPath)
|
||||
Substitutes RemoteStore::querySubstitutes(const Path & path)
|
||||
{
|
||||
// writeInt(wopQuerySubstitutes);
|
||||
|
||||
// throw Error("not implemented 2");
|
||||
return Substitutes();
|
||||
throw Error("not implemented 2");
|
||||
}
|
||||
|
||||
|
||||
bool RemoteStore::hasSubstitutes(const Path & path)
|
||||
{
|
||||
writeInt(wopHasSubstitutes, to);
|
||||
writeString(path, to);
|
||||
unsigned int reply = readInt(from);
|
||||
return reply != 0;
|
||||
}
|
||||
|
||||
|
||||
Hash RemoteStore::queryPathHash(const Path & path)
|
||||
{
|
||||
throw Error("not implemented");
|
||||
throw Error("not implemented 3");
|
||||
}
|
||||
|
||||
|
||||
void RemoteStore::queryReferences(const Path & storePath,
|
||||
void RemoteStore::queryReferences(const Path & path,
|
||||
PathSet & references)
|
||||
{
|
||||
throw Error("not implemented");
|
||||
writeInt(wopQueryReferences, to);
|
||||
writeString(path, to);
|
||||
PathSet references2 = readStringSet(from);
|
||||
references.insert(references2.begin(), references2.end());
|
||||
}
|
||||
|
||||
|
||||
void RemoteStore::queryReferrers(const Path & storePath,
|
||||
void RemoteStore::queryReferrers(const Path & path,
|
||||
PathSet & referrers)
|
||||
{
|
||||
throw Error("not implemented");
|
||||
writeInt(wopQueryReferrers, to);
|
||||
writeString(path, to);
|
||||
PathSet referrers2 = readStringSet(from);
|
||||
referrers.insert(referrers2.begin(), referrers2.end());
|
||||
}
|
||||
|
||||
|
||||
|
@ -123,7 +135,7 @@ Path RemoteStore::addToStore(const Path & srcPath)
|
|||
Path RemoteStore::addToStoreFixed(bool recursive, string hashAlgo,
|
||||
const Path & srcPath)
|
||||
{
|
||||
throw Error("not implemented 4");
|
||||
throw Error("not implemented 6");
|
||||
}
|
||||
|
||||
|
||||
|
@ -133,9 +145,7 @@ Path RemoteStore::addTextToStore(const string & suffix, const string & s,
|
|||
writeInt(wopAddTextToStore, to);
|
||||
writeString(suffix, to);
|
||||
writeString(s, to);
|
||||
writeInt(references.size(), to);
|
||||
for (PathSet::iterator i = references.begin(); i != references.end(); ++i)
|
||||
writeString(*i, to);
|
||||
writeStringSet(references, to);
|
||||
|
||||
Path path = readString(from);
|
||||
return path;
|
||||
|
@ -144,13 +154,17 @@ Path RemoteStore::addTextToStore(const string & suffix, const string & s,
|
|||
|
||||
void RemoteStore::buildDerivations(const PathSet & drvPaths)
|
||||
{
|
||||
throw Error("not implemented 6");
|
||||
writeInt(wopBuildDerivations, to);
|
||||
writeStringSet(drvPaths, to);
|
||||
readInt(from);
|
||||
}
|
||||
|
||||
|
||||
void RemoteStore::ensurePath(const Path & storePath)
|
||||
void RemoteStore::ensurePath(const Path & path)
|
||||
{
|
||||
throw Error("not implemented 7");
|
||||
writeInt(wopEnsurePath, to);
|
||||
writeString(path, to);
|
||||
readInt(from);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -27,15 +27,15 @@ public:
|
|||
|
||||
bool isValidPath(const Path & path);
|
||||
|
||||
Substitutes querySubstitutes(const Path & srcPath);
|
||||
Substitutes querySubstitutes(const Path & path);
|
||||
|
||||
bool hasSubstitutes(const Path & path);
|
||||
|
||||
Hash queryPathHash(const Path & path);
|
||||
|
||||
void queryReferences(const Path & storePath,
|
||||
PathSet & references);
|
||||
void queryReferences(const Path & path, PathSet & references);
|
||||
|
||||
void queryReferrers(const Path & storePath,
|
||||
PathSet & referrers);
|
||||
void queryReferrers(const Path & path, PathSet & referrers);
|
||||
|
||||
Path addToStore(const Path & srcPath);
|
||||
|
||||
|
@ -47,7 +47,7 @@ public:
|
|||
|
||||
void buildDerivations(const PathSet & drvPaths);
|
||||
|
||||
void ensurePath(const Path & storePath);
|
||||
void ensurePath(const Path & path);
|
||||
|
||||
private:
|
||||
Pipe toChild;
|
||||
|
|
|
@ -6,6 +6,12 @@
|
|||
namespace nix {
|
||||
|
||||
|
||||
bool StoreAPI::hasSubstitutes(const Path & path)
|
||||
{
|
||||
return !querySubstitutes(path).empty();
|
||||
}
|
||||
|
||||
|
||||
bool isInStore(const Path & path)
|
||||
{
|
||||
return path[0] == '/'
|
||||
|
|
|
@ -43,7 +43,11 @@ public:
|
|||
virtual bool isValidPath(const Path & path) = 0;
|
||||
|
||||
/* Return the substitutes for the given path. */
|
||||
virtual Substitutes querySubstitutes(const Path & srcPath) = 0;
|
||||
virtual Substitutes querySubstitutes(const Path & path) = 0;
|
||||
|
||||
/* More efficient variant if we just want to know if a path has
|
||||
substitutes. */
|
||||
virtual bool hasSubstitutes(const Path & path);
|
||||
|
||||
/* Queries the hash of a valid path. */
|
||||
virtual Hash queryPathHash(const Path & path) = 0;
|
||||
|
@ -121,7 +125,6 @@ extern boost::shared_ptr<StoreAPI> store;
|
|||
boost::shared_ptr<StoreAPI> openStore(bool reserveSpace = true);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -10,8 +10,15 @@ typedef enum {
|
|||
wopQuit,
|
||||
wopIsValidPath,
|
||||
wopQuerySubstitutes,
|
||||
wopHasSubstitutes,
|
||||
wopQueryPathHash,
|
||||
wopQueryReferences,
|
||||
wopQueryReferrers,
|
||||
wopAddToStore,
|
||||
wopAddToStoreFixed,
|
||||
wopAddTextToStore,
|
||||
wopBuildDerivations,
|
||||
wopEnsurePath,
|
||||
} WorkerOp;
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue