Use nix::serv_proto::BasicConnection
in build_remote.cc
- Use the type itself This lays the foundation for being able to dedup the protocol code. - Use `BasicConnection::handshake`, replacing ours. - Use `BasicConnection::queryValidPaths` - Use `BasicConnection::putBuildDerivationRequest`
This commit is contained in:
parent
db7aa01b8d
commit
4ac31c89df
@ -8,6 +8,7 @@
|
|||||||
#include "build-result.hh"
|
#include "build-result.hh"
|
||||||
#include "path.hh"
|
#include "path.hh"
|
||||||
#include "serve-protocol.hh"
|
#include "serve-protocol.hh"
|
||||||
|
#include "serve-protocol-impl.hh"
|
||||||
#include "state.hh"
|
#include "state.hh"
|
||||||
#include "current-process.hh"
|
#include "current-process.hh"
|
||||||
#include "processes.hh"
|
#include "processes.hh"
|
||||||
@ -123,13 +124,10 @@ static void copyClosureTo(
|
|||||||
garbage-collect paths that are already there. Optionally, ask
|
garbage-collect paths that are already there. Optionally, ask
|
||||||
the remote host to substitute missing paths. */
|
the remote host to substitute missing paths. */
|
||||||
// FIXME: substitute output pollutes our build log
|
// FIXME: substitute output pollutes our build log
|
||||||
conn.to << ServeProto::Command::QueryValidPaths << 1 << useSubstitutes;
|
|
||||||
ServeProto::write(destStore, conn, closure);
|
|
||||||
conn.to.flush();
|
|
||||||
|
|
||||||
/* Get back the set of paths that are already valid on the remote
|
/* Get back the set of paths that are already valid on the remote
|
||||||
host. */
|
host. */
|
||||||
auto present = ServeProto::Serialise<StorePathSet>::read(destStore, conn);
|
auto present = conn.queryValidPaths(
|
||||||
|
destStore, true, closure, useSubstitutes);
|
||||||
|
|
||||||
if (present.size() == closure.size()) return;
|
if (present.size() == closure.size()) return;
|
||||||
|
|
||||||
@ -195,33 +193,6 @@ static std::pair<Path, AutoCloseFD> openLogFile(const std::string & logDir, cons
|
|||||||
return {std::move(logFile), std::move(logFD)};
|
return {std::move(logFile), std::move(logFD)};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param conn is not fully initialized; it is this functions job to set
|
|
||||||
* the `remoteVersion` field after the handshake is completed.
|
|
||||||
* Therefore, no `ServeProto::Serialize` functions can be used until
|
|
||||||
* that field is set.
|
|
||||||
*/
|
|
||||||
static void handshake(Machine::Connection & conn, unsigned int repeats)
|
|
||||||
{
|
|
||||||
constexpr ServeProto::Version our_version = 0x206;
|
|
||||||
|
|
||||||
conn.to << SERVE_MAGIC_1 << our_version;
|
|
||||||
conn.to.flush();
|
|
||||||
|
|
||||||
unsigned int magic = readInt(conn.from);
|
|
||||||
if (magic != SERVE_MAGIC_2)
|
|
||||||
throw Error("protocol mismatch with ‘nix-store --serve’ on ‘%1%’", conn.machine->sshName);
|
|
||||||
conn.remoteVersion = readInt(conn.from);
|
|
||||||
// Now `conn` is initialized.
|
|
||||||
if (GET_PROTOCOL_MAJOR(conn.remoteVersion) != 0x200)
|
|
||||||
throw Error("unsupported ‘nix-store --serve’ protocol version on ‘%1%’", conn.machine->sshName);
|
|
||||||
if (GET_PROTOCOL_MINOR(conn.remoteVersion) < 3 && repeats > 0)
|
|
||||||
throw Error("machine ‘%1%’ does not support repeating a build; please upgrade it to Nix 1.12", conn.machine->sshName);
|
|
||||||
|
|
||||||
// Do not attempt to speak a newer version of the protocol
|
|
||||||
conn.remoteVersion = std::min(conn.remoteVersion, our_version);
|
|
||||||
}
|
|
||||||
|
|
||||||
static BasicDerivation sendInputs(
|
static BasicDerivation sendInputs(
|
||||||
State & state,
|
State & state,
|
||||||
Step & step,
|
Step & step,
|
||||||
@ -291,10 +262,7 @@ static BuildResult performBuild(
|
|||||||
counter & nrStepsBuilding
|
counter & nrStepsBuilding
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
conn.to << ServeProto::Command::BuildDerivation << localStore.printStorePath(drvPath);
|
conn.putBuildDerivationRequest(localStore, drvPath, drv, options);
|
||||||
writeDerivation(conn.to, localStore, drv);
|
|
||||||
ServeProto::write(localStore, conn, options);
|
|
||||||
conn.to.flush();
|
|
||||||
|
|
||||||
BuildResult result;
|
BuildResult result;
|
||||||
|
|
||||||
@ -498,9 +466,13 @@ void State::buildRemote(ref<Store> destStore,
|
|||||||
});
|
});
|
||||||
|
|
||||||
Machine::Connection conn {
|
Machine::Connection conn {
|
||||||
.from = child.from.get(),
|
{
|
||||||
.to = child.to.get(),
|
.to = child.to.get(),
|
||||||
.machine = machine,
|
.from = child.from.get(),
|
||||||
|
/* Handshake. */
|
||||||
|
.remoteVersion = 0xdadbeef, // FIXME avoid dummy initialize
|
||||||
|
},
|
||||||
|
/*.machine =*/ machine,
|
||||||
};
|
};
|
||||||
|
|
||||||
Finally updateStats([&]() {
|
Finally updateStats([&]() {
|
||||||
@ -508,14 +480,26 @@ void State::buildRemote(ref<Store> destStore,
|
|||||||
bytesSent += conn.to.written;
|
bytesSent += conn.to.written;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
constexpr ServeProto::Version our_version = 0x206;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
build_remote::handshake(conn, buildOptions.nrRepeats);
|
conn.remoteVersion = decltype(conn)::handshake(
|
||||||
|
conn.to,
|
||||||
|
conn.from,
|
||||||
|
our_version,
|
||||||
|
machine->sshName);
|
||||||
} catch (EndOfFile & e) {
|
} catch (EndOfFile & e) {
|
||||||
child.pid.wait();
|
child.pid.wait();
|
||||||
std::string s = chomp(readFile(result.logFile));
|
std::string s = chomp(readFile(result.logFile));
|
||||||
throw Error("cannot connect to ‘%1%’: %2%", machine->sshName, s);
|
throw Error("cannot connect to ‘%1%’: %2%", machine->sshName, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do not attempt to speak a newer version of the protocol.
|
||||||
|
//
|
||||||
|
// Per https://github.com/NixOS/nix/issues/9584 should be handled as
|
||||||
|
// part of `handshake` in upstream nix.
|
||||||
|
conn.remoteVersion = std::min(conn.remoteVersion, our_version);
|
||||||
|
|
||||||
{
|
{
|
||||||
auto info(machine->state->connectInfo.lock());
|
auto info(machine->state->connectInfo.lock());
|
||||||
info->consecutiveFailures = 0;
|
info->consecutiveFailures = 0;
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "sync.hh"
|
#include "sync.hh"
|
||||||
#include "nar-extractor.hh"
|
#include "nar-extractor.hh"
|
||||||
#include "serve-protocol.hh"
|
#include "serve-protocol.hh"
|
||||||
|
#include "serve-protocol-impl.hh"
|
||||||
|
|
||||||
|
|
||||||
typedef unsigned int BuildID;
|
typedef unsigned int BuildID;
|
||||||
@ -302,29 +303,9 @@ struct Machine
|
|||||||
}
|
}
|
||||||
|
|
||||||
// A connection to a machine
|
// A connection to a machine
|
||||||
struct Connection {
|
struct Connection : nix::ServeProto::BasicClientConnection {
|
||||||
nix::FdSource from;
|
|
||||||
nix::FdSink to;
|
|
||||||
nix::ServeProto::Version remoteVersion;
|
|
||||||
|
|
||||||
// Backpointer to the machine
|
// Backpointer to the machine
|
||||||
ptr machine;
|
ptr machine;
|
||||||
|
|
||||||
operator nix::ServeProto::ReadConn ()
|
|
||||||
{
|
|
||||||
return {
|
|
||||||
.from = from,
|
|
||||||
.version = remoteVersion,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
operator nix::ServeProto::WriteConn ()
|
|
||||||
{
|
|
||||||
return {
|
|
||||||
.to = to,
|
|
||||||
.version = remoteVersion,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user