1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#pragma once
#include <absl/strings/string_view.h>
#include "libproto/worker.grpc.pb.h"
#include "libproto/worker.pb.h"
#include "libstore/remote-store.hh"
#include "libstore/store-api.hh"
namespace nix::store {
// TODO(grfn): Currently, since the RPCStore is only used for the connection to
// the nix daemon over a unix socket, it inherits from the LocalFSStore since it
// shares a filesystem with the daemon. This will not always be the case, at
// which point we should tease these two things apart.
class RpcStore : public LocalFSStore, public virtual Store {
public:
RpcStore(const Params& params,
std::unique_ptr<nix::proto::WorkerService::Stub> stub)
: Store(params), LocalFSStore(params), stub_(std::move(stub)) {}
RpcStore(std::string uri, const Params& params,
std::unique_ptr<nix::proto::WorkerService::Stub> stub)
: Store(params),
LocalFSStore(params),
uri_(uri),
stub_(std::move(stub)) {}
std::string getUri() override {
if (uri_.has_value()) {
return uri_.value();
} else {
return "daemon";
}
};
virtual PathSet queryAllValidPaths() override;
virtual void queryReferrers(const Path& path, PathSet& referrers) override;
virtual PathSet queryValidDerivers(const Path& path) override;
virtual PathSet queryDerivationOutputs(const Path& path) override;
virtual StringSet queryDerivationOutputNames(const Path& path) override;
virtual Path queryPathFromHashPart(const std::string& hashPart) override;
virtual PathSet querySubstitutablePaths(const PathSet& paths) override;
virtual void querySubstitutablePathInfos(
const PathSet& paths, SubstitutablePathInfos& infos) override;
virtual bool wantMassQuery() override { return true; }
virtual void addToStore(const ValidPathInfo& info, Source& narSource,
RepairFlag repair = NoRepair,
CheckSigsFlag checkSigs = CheckSigs,
std::shared_ptr<FSAccessor> accessor = 0) override;
virtual Path addToStore(const std::string& name, const Path& srcPath,
bool recursive = true, HashType hashAlgo = htSHA256,
PathFilter& filter = defaultPathFilter,
RepairFlag repair = NoRepair) override;
virtual Path addTextToStore(const std::string& name, const std::string& s,
const PathSet& references,
RepairFlag repair = NoRepair) override;
absl::Status buildPaths(std::ostream& log_sink, const PathSet& paths,
BuildMode build_mode) override;
virtual BuildResult buildDerivation(std::ostream& log_sink,
const Path& drvPath,
const BasicDerivation& drv,
BuildMode buildMode) override;
virtual void ensurePath(const Path& path) override;
virtual void addTempRoot(const Path& path) override;
virtual void addIndirectRoot(const Path& path) override;
virtual void syncWithGC() override;
virtual Roots findRoots(bool censor) override;
virtual void collectGarbage(const GCOptions& options,
GCResults& results) override;
virtual void optimiseStore() override;
virtual bool verifyStore(bool checkContents,
RepairFlag repair = NoRepair) override;
virtual void addSignatures(const Path& storePath,
const StringSet& sigs) override;
virtual void queryMissing(const PathSet& targets, PathSet& willBuild,
PathSet& willSubstitute, PathSet& unknown,
unsigned long long& downloadSize,
unsigned long long& narSize) override;
virtual std::shared_ptr<std::string> getBuildLog(const Path& path) override;
void connect() override{};
virtual unsigned int getProtocol() override;
protected:
virtual bool isValidPathUncached(const Path& path) override;
virtual PathSet queryValidPaths(
const PathSet& paths,
SubstituteFlag maybeSubstitute = NoSubstitute) override;
virtual void queryPathInfoUncached(
const Path& path,
Callback<std::shared_ptr<ValidPathInfo>> callback) noexcept override;
private:
std::optional<std::string> uri_;
std::unique_ptr<nix::proto::WorkerService::Stub> stub_;
void const SuccessOrThrow(const grpc::Status& status,
const absl::string_view& call = "") const;
};
} // namespace nix::store
|