#pragma once #include #include #include "store-api.hh" namespace nix { class Pipe; class Pid; struct FdSink; struct FdSource; template class Pool; struct ConnectionHandle; /* FIXME: RemoteStore is a misnomer - should be something like DaemonStore. */ class RemoteStore : public virtual Store { public: const Setting maxConnections{(Store*) this, 1, "max-connections", "maximum number of concurrent connections to the Nix daemon"}; const Setting maxConnectionAge{(Store*) this, std::numeric_limits::max(), "max-connection-age", "number of seconds to reuse a connection"}; RemoteStore(const Params & params); /* Implementations of abstract store API methods. */ bool isValidPathUncached(const Path & path) override; PathSet queryValidPaths(const PathSet & paths, SubstituteFlag maybeSubstitute = NoSubstitute) override; PathSet queryAllValidPaths() override; void queryPathInfoUncached(const Path & path, Callback> callback) override; void queryReferrers(const Path & path, PathSet & referrers) override; PathSet queryValidDerivers(const Path & path) override; PathSet queryDerivationOutputs(const Path & path) override; StringSet queryDerivationOutputNames(const Path & path) override; Path queryPathFromHashPart(const string & hashPart) override; PathSet querySubstitutablePaths(const PathSet & paths) override; void querySubstitutablePathInfos(const PathSet & paths, SubstitutablePathInfos & infos) override; void addToStore(const ValidPathInfo & info, Source & nar, RepairFlag repair, CheckSigsFlag checkSigs, std::shared_ptr accessor) override; Path addToStore(const string & name, const Path & srcPath, bool recursive = true, HashType hashAlgo = htSHA256, PathFilter & filter = defaultPathFilter, RepairFlag repair = NoRepair) override; Path addTextToStore(const string & name, const string & s, const PathSet & references, RepairFlag repair) override; void buildPaths(const PathSet & paths, BuildMode buildMode) override; BuildResult buildDerivation(const Path & drvPath, const BasicDerivation & drv, BuildMode buildMode) override; void ensurePath(const Path & path) override; void addTempRoot(const Path & path) override; void addIndirectRoot(const Path & path) override; void syncWithGC() override; Roots findRoots() override; void collectGarbage(const GCOptions & options, GCResults & results) override; void optimiseStore() override; bool verifyStore(bool checkContents, RepairFlag repair) override; void addSignatures(const Path & storePath, const StringSet & sigs) override; void queryMissing(const PathSet & targets, PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown, unsigned long long & downloadSize, unsigned long long & narSize) override; void connect() override; void flushBadConnections(); protected: struct Connection { AutoCloseFD fd; FdSink to; FdSource from; unsigned int daemonVersion; std::chrono::time_point startTime; virtual ~Connection(); std::exception_ptr processStderr(Sink * sink = 0, Source * source = 0); }; ref openConnectionWrapper(); virtual ref openConnection() = 0; void initConnection(Connection & conn); ref> connections; virtual void setOptions(Connection & conn); ConnectionHandle getConnection(); friend struct ConnectionHandle; private: std::atomic_bool failed{false}; }; class UDSRemoteStore : public LocalFSStore, public RemoteStore { public: UDSRemoteStore(const Params & params); UDSRemoteStore(std::string path, const Params & params); std::string getUri() override; private: ref openConnection() override; std::experimental::optional path; }; }