aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2008-12-11 14:30:25 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2008-12-11 14:30:25 +0000
commit07cdfb09fb74cf8e1c3c70c070ad20b5d1119fcf (patch)
treee17b07dfb5eb9861fe2df2f9f7c5247c4244bc8d
parenta0766eca270390c2181c7f31f27f93629b19f4a5 (diff)
* Open the connection to the daemon lazily (on demand) so that
read-only operations (like nix-env -qa) work properly when the daemon isn't running.
-rw-r--r--src/libstore/remote-store.cc37
-rw-r--r--src/libstore/remote-store.hh3
-rw-r--r--src/libutil/serialise.hh4
3 files changed, 38 insertions, 6 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index d83d501ee..585e6bd9c 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -37,6 +37,15 @@ PathSet readStorePaths(Source & from)
RemoteStore::RemoteStore()
{
+ initialised = false;
+}
+
+
+void RemoteStore::openConnection()
+{
+ if (initialised) return;
+ initialised = true;
+
string remoteMode = getEnv("NIX_REMOTE");
if (remoteMode == "slave")
@@ -64,8 +73,8 @@ RemoteStore::RemoteStore()
throw Error("Nix daemon protocol version not supported");
writeInt(PROTOCOL_VERSION, to);
processStderr();
-
- } catch (Error & e) {
+ }
+ catch (Error & e) {
throw Error(format("cannot start worker (%1%)")
% e.msg());
}
@@ -194,6 +203,7 @@ void RemoteStore::setOptions()
bool RemoteStore::isValidPath(const Path & path)
{
+ openConnection();
writeInt(wopIsValidPath, to);
writeString(path, to);
processStderr();
@@ -204,12 +214,14 @@ bool RemoteStore::isValidPath(const Path & path)
PathSet RemoteStore::queryValidPaths()
{
+ openConnection();
throw Error("not implemented");
}
bool RemoteStore::hasSubstitutes(const Path & path)
{
+ openConnection();
writeInt(wopHasSubstitutes, to);
writeString(path, to);
processStderr();
@@ -221,6 +233,7 @@ bool RemoteStore::hasSubstitutes(const Path & path)
bool RemoteStore::querySubstitutablePathInfo(const Path & path,
SubstitutablePathInfo & info)
{
+ openConnection();
if (GET_PROTOCOL_MINOR(daemonVersion) < 3) return false;
writeInt(wopQuerySubstitutablePathInfo, to);
writeString(path, to);
@@ -237,6 +250,7 @@ bool RemoteStore::querySubstitutablePathInfo(const Path & path,
Hash RemoteStore::queryPathHash(const Path & path)
{
+ openConnection();
writeInt(wopQueryPathHash, to);
writeString(path, to);
processStderr();
@@ -248,6 +262,7 @@ Hash RemoteStore::queryPathHash(const Path & path)
void RemoteStore::queryReferences(const Path & path,
PathSet & references)
{
+ openConnection();
writeInt(wopQueryReferences, to);
writeString(path, to);
processStderr();
@@ -259,6 +274,7 @@ void RemoteStore::queryReferences(const Path & path,
void RemoteStore::queryReferrers(const Path & path,
PathSet & referrers)
{
+ openConnection();
writeInt(wopQueryReferrers, to);
writeString(path, to);
processStderr();
@@ -269,6 +285,7 @@ void RemoteStore::queryReferrers(const Path & path,
Path RemoteStore::queryDeriver(const Path & path)
{
+ openConnection();
writeInt(wopQueryDeriver, to);
writeString(path, to);
processStderr();
@@ -281,6 +298,8 @@ Path RemoteStore::queryDeriver(const Path & path)
Path RemoteStore::addToStore(const Path & _srcPath,
bool recursive, HashType hashAlgo, PathFilter & filter)
{
+ openConnection();
+
Path srcPath(absPath(_srcPath));
writeInt(wopAddToStore, to);
@@ -298,6 +317,7 @@ Path RemoteStore::addToStore(const Path & _srcPath,
Path RemoteStore::addTextToStore(const string & name, const string & s,
const PathSet & references)
{
+ openConnection();
writeInt(wopAddTextToStore, to);
writeString(name, to);
writeString(s, to);
@@ -311,6 +331,7 @@ Path RemoteStore::addTextToStore(const string & name, const string & s,
void RemoteStore::exportPath(const Path & path, bool sign,
Sink & sink)
{
+ openConnection();
writeInt(wopExportPath, to);
writeString(path, to);
writeInt(sign ? 1 : 0, to);
@@ -321,10 +342,10 @@ void RemoteStore::exportPath(const Path & path, bool sign,
Path RemoteStore::importPath(bool requireSignature, Source & source)
{
+ openConnection();
writeInt(wopImportPath, to);
/* We ignore requireSignature, since the worker forces it to true
- anyway. */
-
+ anyway. */
processStderr(0, &source);
return readStorePath(from);
}
@@ -332,6 +353,7 @@ Path RemoteStore::importPath(bool requireSignature, Source & source)
void RemoteStore::buildDerivations(const PathSet & drvPaths)
{
+ openConnection();
writeInt(wopBuildDerivations, to);
writeStringSet(drvPaths, to);
processStderr();
@@ -341,6 +363,7 @@ void RemoteStore::buildDerivations(const PathSet & drvPaths)
void RemoteStore::ensurePath(const Path & path)
{
+ openConnection();
writeInt(wopEnsurePath, to);
writeString(path, to);
processStderr();
@@ -350,6 +373,7 @@ void RemoteStore::ensurePath(const Path & path)
void RemoteStore::addTempRoot(const Path & path)
{
+ openConnection();
writeInt(wopAddTempRoot, to);
writeString(path, to);
processStderr();
@@ -359,6 +383,7 @@ void RemoteStore::addTempRoot(const Path & path)
void RemoteStore::addIndirectRoot(const Path & path)
{
+ openConnection();
writeInt(wopAddIndirectRoot, to);
writeString(path, to);
processStderr();
@@ -368,6 +393,7 @@ void RemoteStore::addIndirectRoot(const Path & path)
void RemoteStore::syncWithGC()
{
+ openConnection();
writeInt(wopSyncWithGC, to);
processStderr();
readInt(from);
@@ -376,6 +402,7 @@ void RemoteStore::syncWithGC()
Roots RemoteStore::findRoots()
{
+ openConnection();
writeInt(wopFindRoots, to);
processStderr();
unsigned int count = readInt(from);
@@ -391,6 +418,8 @@ Roots RemoteStore::findRoots()
void RemoteStore::collectGarbage(const GCOptions & options, GCResults & results)
{
+ openConnection();
+
writeInt(wopCollectGarbage, to);
writeInt(options.action, to);
writeStringSet(options.pathsToDelete, to);
diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh
index 717da7377..3d55d23d9 100644
--- a/src/libstore/remote-store.hh
+++ b/src/libstore/remote-store.hh
@@ -74,6 +74,9 @@ private:
FdSource from;
Pid child;
unsigned int daemonVersion;
+ bool initialised;
+
+ void openConnection();
void processStderr(Sink * sink = 0, Source * source = 0);
diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh
index 5746c3c2f..6a74c4cf6 100644
--- a/src/libutil/serialise.hh
+++ b/src/libutil/serialise.hh
@@ -35,7 +35,7 @@ struct FdSink : Sink
FdSink()
{
- fd = 0;
+ fd = -1;
}
FdSink(int fd)
@@ -54,7 +54,7 @@ struct FdSource : Source
FdSource()
{
- fd = 0;
+ fd = -1;
}
FdSource(int fd)