aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthew Bauer <mjbauer95@gmail.com>2020-06-19 18:06:19 -0400
committerMatthew Bauer <mjbauer95@gmail.com>2020-06-19 18:06:19 -0400
commitf2a6cee334255ced72a70f527cf3c283b4586e42 (patch)
treeb7d7ea2e6a9462cc03e12374a588d75441b48eb7 /src
parente8e1f5282ff213be010cbe45772b9e725c01f285 (diff)
Update worker protocol to support sending storepath maps
We need to also send the ca to daemon in addition to the path.
Diffstat (limited to 'src')
-rw-r--r--src/libstore/daemon.cc11
-rw-r--r--src/libstore/remote-store.cc32
-rw-r--r--src/libstore/worker-protocol.hh6
3 files changed, 40 insertions, 9 deletions
diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc
index f7dc16948..c613ab47d 100644
--- a/src/libstore/daemon.cc
+++ b/src/libstore/daemon.cc
@@ -609,12 +609,15 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
}
case wopQuerySubstitutablePathInfos: {
- auto paths = readStorePaths<StorePathSet>(*store, from);
- logger->startWork();
SubstitutablePathInfos infos;
StorePathCAMap pathsMap = {};
- for (auto & path : paths)
- pathsMap.emplace(path, std::nullopt);
+ if (GET_PROTOCOL_MINOR(clientVersion) < 22) {
+ auto paths = readStorePaths<StorePathSet>(*store, from);
+ for (auto & path : paths)
+ pathsMap.emplace(path, std::nullopt);
+ } else
+ pathsMap = readStorePathCAMap(*store, from);
+ logger->startWork();
store->querySubstitutablePathInfos(pathsMap, infos);
logger->stopWork();
to << infos.size();
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 4538ccd4f..f6158685c 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -38,6 +38,27 @@ void writeStorePaths(const Store & store, Sink & out, const StorePathSet & paths
out << store.printStorePath(i);
}
+std::map<StorePath, std::optional<std::string>> readStorePathCAMap(const Store & store, Source & from)
+{
+ StorePathCAMap paths;
+ auto count = readNum<size_t>(from);
+ while (count--) {
+ auto path = readString(from);
+ auto ca = readString(from);
+ paths.insert_or_assign(store.parseStorePath(path), !ca.empty() ? std::optional(ca) : std::nullopt);
+ }
+ return paths;
+}
+
+void writeStorePathCAMap(const Store & store, Sink & out, const StorePathCAMap & paths)
+{
+ out << paths.size();
+ for (auto & i : paths) {
+ out << store.printStorePath(i.first);
+ out << (i.second ? *i.second : "");
+ }
+}
+
/* TODO: Separate these store impls into different files, give them better names */
RemoteStore::RemoteStore(const Params & params)
@@ -334,10 +355,13 @@ void RemoteStore::querySubstitutablePathInfos(const StorePathCAMap & pathsMap, S
} else {
conn->to << wopQuerySubstitutablePathInfos;
- StorePathSet paths;
- for (auto & path : pathsMap)
- paths.insert(path.first);
- writeStorePaths(*this, conn->to, paths);
+ if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 22) {
+ StorePathSet paths;
+ for (auto & path : pathsMap)
+ paths.insert(path.first);
+ writeStorePaths(*this, conn->to, paths);
+ } else
+ writeStorePathCAMap(*this, conn->to, pathsMap);
conn.processStderr();
size_t count = readNum<size_t>(conn->from);
for (size_t n = 0; n < count; n++) {
diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh
index ac42457fc..d2944674f 100644
--- a/src/libstore/worker-protocol.hh
+++ b/src/libstore/worker-protocol.hh
@@ -6,7 +6,7 @@ namespace nix {
#define WORKER_MAGIC_1 0x6e697863
#define WORKER_MAGIC_2 0x6478696f
-#define PROTOCOL_VERSION 0x115
+#define PROTOCOL_VERSION 0x116
#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)
@@ -69,5 +69,9 @@ template<class T> T readStorePaths(const Store & store, Source & from);
void writeStorePaths(const Store & store, Sink & out, const StorePathSet & paths);
+std::map<StorePath, std::optional<std::string>> readStorePathCAMap(const Store & store, Source & from);
+
+void writeStorePathCAMap(const Store & store, Sink & out, const StorePathCAMap & paths);
+
}