Merge branch 'ca/json-realisations-in-worker-protocol'

This commit is contained in:
regnat 2021-05-19 11:48:31 +02:00
commit 4077d55775
3 changed files with 36 additions and 14 deletions

View file

@ -885,10 +885,15 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
case wopRegisterDrvOutput: { case wopRegisterDrvOutput: {
logger->startWork(); logger->startWork();
auto outputId = DrvOutput::parse(readString(from)); if (GET_PROTOCOL_MINOR(clientVersion) < 31) {
auto outputPath = StorePath(readString(from)); auto outputId = DrvOutput::parse(readString(from));
store->registerDrvOutput(Realisation{ auto outputPath = StorePath(readString(from));
.id = outputId, .outPath = outputPath}); store->registerDrvOutput(Realisation{
.id = outputId, .outPath = outputPath});
} else {
auto realisation = worker_proto::read(*store, from, Phantom<Realisation>());
store->registerDrvOutput(realisation);
}
logger->stopWork(); logger->stopWork();
break; break;
} }
@ -898,9 +903,15 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
auto outputId = DrvOutput::parse(readString(from)); auto outputId = DrvOutput::parse(readString(from));
auto info = store->queryRealisation(outputId); auto info = store->queryRealisation(outputId);
logger->stopWork(); logger->stopWork();
std::set<StorePath> outPaths; if (GET_PROTOCOL_MINOR(clientVersion) < 31) {
if (info) outPaths.insert(info->outPath); std::set<StorePath> outPaths;
worker_proto::write(*store, to, outPaths); if (info) outPaths.insert(info->outPath);
worker_proto::write(*store, to, outPaths);
} else {
std::set<Realisation> realisations;
if (info) realisations.insert(*info);
worker_proto::write(*store, to, realisations);
}
break; break;
} }

View file

@ -653,8 +653,12 @@ void RemoteStore::registerDrvOutput(const Realisation & info)
{ {
auto conn(getConnection()); auto conn(getConnection());
conn->to << wopRegisterDrvOutput; conn->to << wopRegisterDrvOutput;
conn->to << info.id.to_string(); if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 31) {
conn->to << std::string(info.outPath.to_string()); conn->to << info.id.to_string();
conn->to << std::string(info.outPath.to_string());
} else {
worker_proto::write(*this, conn->to, info);
}
conn.processStderr(); conn.processStderr();
} }
@ -664,10 +668,17 @@ std::optional<const Realisation> RemoteStore::queryRealisation(const DrvOutput &
conn->to << wopQueryRealisation; conn->to << wopQueryRealisation;
conn->to << id.to_string(); conn->to << id.to_string();
conn.processStderr(); conn.processStderr();
auto outPaths = worker_proto::read(*this, conn->from, Phantom<std::set<StorePath>>{}); if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 31) {
if (outPaths.empty()) auto outPaths = worker_proto::read(*this, conn->from, Phantom<std::set<StorePath>>{});
return std::nullopt; if (outPaths.empty())
return {Realisation{.id = id, .outPath = *outPaths.begin()}}; return std::nullopt;
return {Realisation{.id = id, .outPath = *outPaths.begin()}};
} else {
auto realisations = worker_proto::read(*this, conn->from, Phantom<std::set<Realisation>>{});
if (realisations.empty())
return std::nullopt;
return *realisations.begin();
}
} }
static void writeDerivedPaths(RemoteStore & store, ConnectionHandle & conn, const std::vector<DerivedPath> & reqs) static void writeDerivedPaths(RemoteStore & store, ConnectionHandle & conn, const std::vector<DerivedPath> & reqs)

View file

@ -9,7 +9,7 @@ namespace nix {
#define WORKER_MAGIC_1 0x6e697863 #define WORKER_MAGIC_1 0x6e697863
#define WORKER_MAGIC_2 0x6478696f #define WORKER_MAGIC_2 0x6478696f
#define PROTOCOL_VERSION (1 << 8 | 30) #define PROTOCOL_VERSION (1 << 8 | 31)
#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00) #define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff) #define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)