tvl-depot/third_party/nix/src/libstore/remote-store.hh
Vincent Ambo 33e8b0f975 chore(tvix): Thread a std::ostream through Store::buildPaths
This part of the store API needs to carry a handle to the log sink
from now on, so that it can be passed in as appropriate from the gRPC
handlers.

In all places where there is no such handler available at the moment,
the discarding log sink has been inserted. This can be used as a
convenient grep target in the future.

Change-Id: I26628e30b4c6437dccdf8f722ca2e8ed827dfc19
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1797
Tested-by: BuildkiteCI
Reviewed-by: kanepyork <rikingcoding@gmail.com>
Reviewed-by: glittershark <grfn@gws.fyi>
2020-08-20 11:48:40 +00:00

140 lines
4 KiB
C++

#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