Files
lix/lix/libstore/worker-protocol.cc
T
eldritch horrors 5f42f66afa libstore: rpc-ish-ify remaining RemoteStore methods
oops, forgot a few

Change-Id: Ic9ed34c29d26e94109d5f69eb90f334f26170ec3
2025-06-17 14:34:05 +02:00

199 lines
6.2 KiB
C++

#include "lix/libutil/serialise.hh"
#include "lix/libstore/path-with-outputs.hh"
#include "lix/libstore/store-api.hh"
#include "lix/libstore/build-result.hh"
#include "lix/libstore/worker-protocol.hh"
#include "lix/libstore/worker-protocol-impl.hh"
#include "lix/libutil/archive.hh"
#include "lix/libstore/path-info.hh"
#include <optional>
namespace nix {
/* protocol-specific definitions */
std::optional<TrustedFlag> WorkerProto::Serialise<std::optional<TrustedFlag>>::read(WorkerProto::ReadConn conn)
{
auto temp = readNum<uint8_t>(conn.from);
switch (temp) {
case 0:
return std::nullopt;
case 1:
return { Trusted };
case 2:
return { NotTrusted };
default:
throw Error("Invalid trusted status from remote");
}
}
WireFormatGenerator WorkerProto::Serialise<std::optional<TrustedFlag>>::write(WorkerProto::WriteConn conn, const std::optional<TrustedFlag> & optTrusted)
{
if (!optTrusted)
co_yield (uint8_t)0;
else {
switch (*optTrusted) {
case Trusted:
co_yield (uint8_t)1;
break;
case NotTrusted:
co_yield (uint8_t)2;
break;
default:
assert(false);
};
}
}
DerivedPath WorkerProto::Serialise<DerivedPath>::read(WorkerProto::ReadConn conn)
{
auto s = readString(conn.from);
return DerivedPath::parseLegacy(conn.store, s);
}
WireFormatGenerator WorkerProto::Serialise<DerivedPath>::write(WorkerProto::WriteConn conn, const DerivedPath & req)
{
co_yield req.to_string_legacy(conn.store);
}
KeyedBuildResult WorkerProto::Serialise<KeyedBuildResult>::read(WorkerProto::ReadConn conn)
{
auto path = WorkerProto::Serialise<DerivedPath>::read(conn);
auto br = WorkerProto::Serialise<BuildResult>::read(conn);
return KeyedBuildResult {
std::move(br),
/* .path = */ std::move(path),
};
}
WireFormatGenerator WorkerProto::Serialise<KeyedBuildResult>::write(WorkerProto::WriteConn conn, const KeyedBuildResult & res)
{
co_yield WorkerProto::write(conn, res.path);
co_yield WorkerProto::write(conn, static_cast<const BuildResult &>(res));
}
BuildResult WorkerProto::Serialise<BuildResult>::read(WorkerProto::ReadConn conn)
{
BuildResult res;
res.status = (BuildResult::Status) readInt(conn.from);
conn.from >> res.errorMsg;
conn.from
>> res.timesBuilt
>> res.isNonDeterministic
>> res.startTime
>> res.stopTime;
auto builtOutputs = WorkerProto::Serialise<DrvOutputs>::read(conn);
for (auto && [output, realisation] : builtOutputs)
res.builtOutputs.insert_or_assign(
std::move(output.outputName),
std::move(realisation));
return res;
}
WireFormatGenerator WorkerProto::Serialise<BuildResult>::write(WorkerProto::WriteConn conn, const BuildResult & res)
{
co_yield res.status;
co_yield res.errorMsg;
co_yield res.timesBuilt;
co_yield res.isNonDeterministic;
co_yield res.startTime;
co_yield res.stopTime;
DrvOutputs builtOutputs;
for (auto & [output, realisation] : res.builtOutputs)
builtOutputs.insert_or_assign(realisation.id, realisation);
co_yield WorkerProto::write(conn, builtOutputs);
}
ValidPathInfo WorkerProto::Serialise<ValidPathInfo>::read(ReadConn conn)
{
auto path = WorkerProto::Serialise<StorePath>::read(conn);
return ValidPathInfo {
std::move(path),
WorkerProto::Serialise<UnkeyedValidPathInfo>::read(conn),
};
}
WireFormatGenerator WorkerProto::Serialise<ValidPathInfo>::write(WriteConn conn, const ValidPathInfo & pathInfo)
{
co_yield WorkerProto::write(conn, pathInfo.path);
co_yield WorkerProto::write(conn, static_cast<const UnkeyedValidPathInfo &>(pathInfo));
}
UnkeyedValidPathInfo WorkerProto::Serialise<UnkeyedValidPathInfo>::read(ReadConn conn)
{
auto deriver = readString(conn.from);
auto narHash = Hash::parseAny(readString(conn.from), HashType::SHA256);
UnkeyedValidPathInfo info(narHash);
if (deriver != "") info.deriver = conn.store.parseStorePath(deriver);
info.references = WorkerProto::Serialise<StorePathSet>::read(conn);
conn.from >> info.registrationTime >> info.narSize;
conn.from >> info.ultimate;
info.sigs = readStrings<StringSet>(conn.from);
info.ca = ContentAddress::parseOpt(readString(conn.from));
return info;
}
WireFormatGenerator WorkerProto::Serialise<UnkeyedValidPathInfo>::write(WriteConn conn, const UnkeyedValidPathInfo & pathInfo)
{
co_yield (pathInfo.deriver ? conn.store.printStorePath(*pathInfo.deriver) : "");
co_yield pathInfo.narHash.to_string(Base::Base16, false);
co_yield WorkerProto::write(conn, pathInfo.references);
co_yield pathInfo.registrationTime;
co_yield pathInfo.narSize;
co_yield pathInfo.ultimate;
co_yield pathInfo.sigs;
co_yield renderContentAddress(pathInfo.ca);
}
std::optional<UnkeyedValidPathInfo>
WorkerProto::Serialise<std::optional<UnkeyedValidPathInfo>>::read(ReadConn conn)
{
bool valid;
conn.from >> valid;
if (valid) {
return WorkerProto::Serialise<UnkeyedValidPathInfo>::read(conn);
} else {
return std::nullopt;
}
}
WireFormatGenerator WorkerProto::Serialise<std::optional<UnkeyedValidPathInfo>>::write(
WriteConn conn, const std::optional<UnkeyedValidPathInfo> & pathInfo
)
{
co_yield pathInfo.has_value();
if (pathInfo.has_value()) {
co_yield WorkerProto::write(conn, *pathInfo);
}
}
SubstitutablePathInfo WorkerProto::Serialise<SubstitutablePathInfo>::read(ReadConn conn)
{
SubstitutablePathInfo info;
auto deriver = readString(conn.from);
if (deriver != "")
info.deriver = conn.store.parseStorePath(deriver);
info.references = WorkerProto::Serialise<StorePathSet>::read(conn);
info.downloadSize = readLongLong(conn.from);
info.narSize = readLongLong(conn.from);
return info;
}
WireFormatGenerator WorkerProto::Serialise<SubstitutablePathInfo>::write(WriteConn conn, const SubstitutablePathInfo & info)
{
co_yield (info.deriver ? conn.store.printStorePath(*info.deriver) : "");
co_yield WorkerProto::write(conn, info.references);
co_yield info.downloadSize;
co_yield info.narSize;
}
}