gracefully handle old daemon versions
Add a fallback path in `queryPartialDerivationOutputMap` for daemons that don't support it. Also upstreams a couple methods from `SSHStore` to `RemoteStore` as this is needed to handle the fallback path.
This commit is contained in:
parent
a59e77d9e5
commit
057c6203b5
|
@ -1,5 +1,6 @@
|
||||||
#include "serialise.hh"
|
#include "serialise.hh"
|
||||||
#include "util.hh"
|
#include "util.hh"
|
||||||
|
#include "remote-fs-accessor.hh"
|
||||||
#include "remote-store.hh"
|
#include "remote-store.hh"
|
||||||
#include "worker-protocol.hh"
|
#include "worker-protocol.hh"
|
||||||
#include "archive.hh"
|
#include "archive.hh"
|
||||||
|
@ -479,10 +480,26 @@ StorePathSet RemoteStore::queryDerivationOutputs(const StorePath & path)
|
||||||
|
|
||||||
std::map<std::string, std::optional<StorePath>> RemoteStore::queryPartialDerivationOutputMap(const StorePath & path)
|
std::map<std::string, std::optional<StorePath>> RemoteStore::queryPartialDerivationOutputMap(const StorePath & path)
|
||||||
{
|
{
|
||||||
|
if (GET_PROTOCOL_MINOR(getProtocol()) >= 0x16) {
|
||||||
auto conn(getConnection());
|
auto conn(getConnection());
|
||||||
conn->to << wopQueryDerivationOutputMap << printStorePath(path);
|
conn->to << wopQueryDerivationOutputMap << printStorePath(path);
|
||||||
conn.processStderr();
|
conn.processStderr();
|
||||||
return worker_proto::read(*this, conn->from, Phantom<std::map<std::string, std::optional<StorePath>>> {});
|
return worker_proto::read(*this, conn->from, Phantom<std::map<std::string, std::optional<StorePath>>> {});
|
||||||
|
} else {
|
||||||
|
// Fallback for old daemon versions.
|
||||||
|
// For floating-CA derivations (and their co-dependencies) this is an
|
||||||
|
// under-approximation as it only returns the paths that can be inferred
|
||||||
|
// from the derivation itself (and not the ones that are known because
|
||||||
|
// the have been built), but as old stores don't handle floating-CA
|
||||||
|
// derivations this shouldn't matter
|
||||||
|
auto derivation = readDerivation(path);
|
||||||
|
auto outputsWithOptPaths = derivation.outputsAndOptPaths(*this);
|
||||||
|
std::map<std::string, std::optional<StorePath>> ret;
|
||||||
|
for (auto & [outputName, outputAndPath] : outputsWithOptPaths) {
|
||||||
|
ret.emplace(outputName, outputAndPath.second);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -871,6 +888,18 @@ RemoteStore::Connection::~Connection()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RemoteStore::narFromPath(const StorePath & path, Sink & sink)
|
||||||
|
{
|
||||||
|
auto conn(connections->get());
|
||||||
|
conn->to << wopNarFromPath << printStorePath(path);
|
||||||
|
conn->processStderr();
|
||||||
|
copyNAR(conn->from, sink);
|
||||||
|
}
|
||||||
|
|
||||||
|
ref<FSAccessor> RemoteStore::getFSAccessor()
|
||||||
|
{
|
||||||
|
return make_ref<RemoteFSAccessor>(ref<Store>(shared_from_this()));
|
||||||
|
}
|
||||||
|
|
||||||
static Logger::Fields readFields(Source & from)
|
static Logger::Fields readFields(Source & from)
|
||||||
{
|
{
|
||||||
|
|
|
@ -131,6 +131,10 @@ protected:
|
||||||
|
|
||||||
friend struct ConnectionHandle;
|
friend struct ConnectionHandle;
|
||||||
|
|
||||||
|
virtual ref<FSAccessor> getFSAccessor() override;
|
||||||
|
|
||||||
|
virtual void narFromPath(const StorePath & path, Sink & sink) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::atomic_bool failed{false};
|
std::atomic_bool failed{false};
|
||||||
|
@ -149,6 +153,12 @@ public:
|
||||||
bool sameMachine() override
|
bool sameMachine() override
|
||||||
{ return true; }
|
{ return true; }
|
||||||
|
|
||||||
|
ref<FSAccessor> getFSAccessor() override
|
||||||
|
{ return LocalFSStore::getFSAccessor(); }
|
||||||
|
|
||||||
|
void narFromPath(const StorePath & path, Sink & sink) override
|
||||||
|
{ LocalFSStore::narFromPath(path, sink); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
ref<RemoteStore::Connection> openConnection() override;
|
ref<RemoteStore::Connection> openConnection() override;
|
||||||
|
|
|
@ -40,10 +40,6 @@ public:
|
||||||
bool sameMachine() override
|
bool sameMachine() override
|
||||||
{ return false; }
|
{ return false; }
|
||||||
|
|
||||||
void narFromPath(const StorePath & path, Sink & sink) override;
|
|
||||||
|
|
||||||
ref<FSAccessor> getFSAccessor() override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
struct Connection : RemoteStore::Connection
|
struct Connection : RemoteStore::Connection
|
||||||
|
@ -68,19 +64,6 @@ private:
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
void SSHStore::narFromPath(const StorePath & path, Sink & sink)
|
|
||||||
{
|
|
||||||
auto conn(connections->get());
|
|
||||||
conn->to << wopNarFromPath << printStorePath(path);
|
|
||||||
conn->processStderr();
|
|
||||||
copyNAR(conn->from, sink);
|
|
||||||
}
|
|
||||||
|
|
||||||
ref<FSAccessor> SSHStore::getFSAccessor()
|
|
||||||
{
|
|
||||||
return make_ref<RemoteFSAccessor>(ref<Store>(shared_from_this()));
|
|
||||||
}
|
|
||||||
|
|
||||||
ref<RemoteStore::Connection> SSHStore::openConnection()
|
ref<RemoteStore::Connection> SSHStore::openConnection()
|
||||||
{
|
{
|
||||||
auto conn = make_ref<Connection>();
|
auto conn = make_ref<Connection>();
|
||||||
|
|
Loading…
Reference in a new issue