#pragma once #include #include #include "store-api.hh" #include "local-fs-store.hh" namespace nix { class Pipe; class Pid; struct FdSink; struct FdSource; template class Pool; struct ConnectionHandle; struct RemoteStoreConfig : virtual StoreConfig { using StoreConfig::StoreConfig; const Setting maxConnections{(StoreConfig*) this, 1, "max-connections", "maximum number of concurrent connections to the Nix daemon"}; const Setting maxConnectionAge{(StoreConfig*) this, std::numeric_limits::max(), "max-connection-age", "number of seconds to reuse a connection"}; }; /* FIXME: RemoteStore is a misnomer - should be something like DaemonStore. */ class RemoteStore : public virtual Store, public virtual RemoteStoreConfig { public: virtual bool sameMachine() = 0; RemoteStore(const Params & params); /* Implementations of abstract store API methods. */ bool isValidPathUncached(const StorePath & path) override; StorePathSet queryValidPaths(const StorePathSet & paths, SubstituteFlag maybeSubstitute = NoSubstitute) override; StorePathSet queryAllValidPaths() override; void queryPathInfoUncached(const StorePath & path, Callback> callback) noexcept override; void queryReferrers(const StorePath & path, StorePathSet & referrers) override; StorePathSet queryValidDerivers(const StorePath & path) override; StorePathSet queryDerivationOutputs(const StorePath & path) override; std::map> queryPartialDerivationOutputMap(const StorePath & path) override; std::optional queryPathFromHashPart(const std::string & hashPart) override; StorePathSet querySubstitutablePaths(const StorePathSet & paths) override; void querySubstitutablePathInfos(const StorePathCAMap & paths, SubstitutablePathInfos & infos) override; /* Add a content-addressable store path. `dump` will be drained. */ ref addCAToStore( Source & dump, const string & name, ContentAddressMethod caMethod, const StorePathSet & references, RepairFlag repair); /* Add a content-addressable store path. Does not support references. `dump` will be drained. */ StorePath addToStoreFromDump(Source & dump, const string & name, FileIngestionMethod method = FileIngestionMethod::Recursive, HashType hashAlgo = htSHA256, RepairFlag repair = NoRepair) override; void addToStore(const ValidPathInfo & info, Source & nar, RepairFlag repair, CheckSigsFlag checkSigs) override; StorePath addTextToStore(const string & name, const string & s, const StorePathSet & references, RepairFlag repair) override; void buildPaths(const std::vector & paths, BuildMode buildMode) override; BuildResult buildDerivation(const StorePath & drvPath, const BasicDerivation & drv, BuildMode buildMode) override; void ensurePath(const StorePath & path) override; void addTempRoot(const StorePath & path) override; void addIndirectRoot(const Path & path) override; void syncWithGC() override; Roots findRoots(bool censor) override; void collectGarbage(const GCOptions & options, GCResults & results) override; void optimiseStore() override; bool verifyStore(bool checkContents, RepairFlag repair) override; void addSignatures(const StorePath & storePath, const StringSet & sigs) override; void queryMissing(const std::vector & targets, StorePathSet & willBuild, StorePathSet & willSubstitute, StorePathSet & unknown, uint64_t & downloadSize, uint64_t & narSize) override; void connect() override; unsigned int getProtocol() override; void flushBadConnections(); 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, bool flush = true); }; ref openConnectionWrapper(); protected: virtual ref openConnection() = 0; void initConnection(Connection & conn); ref> connections; virtual void setOptions(Connection & conn); ConnectionHandle getConnection(); friend struct ConnectionHandle; virtual ref getFSAccessor() override; virtual void narFromPath(const StorePath & path, Sink & sink) override; ref readValidPathInfo(ConnectionHandle & conn, const StorePath & path); private: std::atomic_bool failed{false}; }; struct UDSRemoteStoreConfig : virtual LocalFSStoreConfig, virtual RemoteStoreConfig { UDSRemoteStoreConfig(const Store::Params & params) : StoreConfig(params) , LocalFSStoreConfig(params) , RemoteStoreConfig(params) { } UDSRemoteStoreConfig() : UDSRemoteStoreConfig(Store::Params({})) { } const std::string name() override { return "Local Daemon Store"; } }; class UDSRemoteStore : public LocalFSStore, public RemoteStore, public virtual UDSRemoteStoreConfig { public: UDSRemoteStore(const Params & params); UDSRemoteStore(const std::string scheme, std::string path, const Params & params); std::string getUri() override; static std::set uriSchemes() { return {"unix"}; } bool sameMachine() override { return true; } ref getFSAccessor() override { return LocalFSStore::getFSAccessor(); } void narFromPath(const StorePath & path, Sink & sink) override { LocalFSStore::narFromPath(path, sink); } private: ref openConnection() override; std::optional path; }; }