#pragma once #include <limits> #include <string> #include "libstore/store-api.hh" namespace nix { class Pipe; class Pid; struct FdSink; struct FdSource; template <typename T> class Pool; struct ConnectionHandle; /* FIXME: RemoteStore is a misnomer - should be something like DaemonStore. */ class RemoteStore : public virtual Store { public: const Setting<int> maxConnections{ (Store*)this, 1, "max-connections", "maximum number of concurrent connections to the Nix daemon"}; const Setting<unsigned int> maxConnectionAge{ (Store*)this, std::numeric_limits<unsigned int>::max(), "max-connection-age", "number of seconds to reuse a connection"}; virtual bool sameMachine() = 0; 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<std::shared_ptr<ValidPathInfo>> callback) noexcept 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 std::string& hashPart) override; PathSet querySubstitutablePaths(const PathSet& paths) override; void querySubstitutablePathInfos(const PathSet& paths, SubstitutablePathInfos& infos) override; void addToStore(const ValidPathInfo& info, Source& source, RepairFlag repair, CheckSigsFlag checkSigs, std::shared_ptr<FSAccessor> accessor) override; Path addToStore(const std::string& name, const Path& srcPath, bool recursive = true, HashType hashAlgo = htSHA256, PathFilter& filter = defaultPathFilter, RepairFlag repair = NoRepair) override; Path addTextToStore(const std::string& name, const std::string& s, const PathSet& references, RepairFlag repair) override; absl::Status buildPaths(std::ostream& log_sink, const PathSet& paths, BuildMode build_mode) 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(bool censor) 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; unsigned int getProtocol() override; void flushBadConnections(); protected: struct Connection { AutoCloseFD fd; FdSink to; FdSource from; unsigned int daemonVersion; std::chrono::time_point<std::chrono::steady_clock> startTime; virtual ~Connection(); std::exception_ptr processStderr(Sink* sink = 0, Source* source = 0); }; ref<Connection> openConnectionWrapper(); virtual ref<Connection> openConnection() = 0; void initConnection(Connection& conn); ref<Pool<Connection>> connections; virtual void setOptions(Connection& conn); ConnectionHandle getConnection(); friend struct ConnectionHandle; private: std::atomic_bool failed{false}; }; } // namespace nix