diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc index c89b5f5b3..6d64644d1 100644 --- a/src/libstore/daemon.cc +++ b/src/libstore/daemon.cc @@ -296,17 +296,6 @@ static void performOp(TunnelLogger * logger, ref store, break; } - case WorkerProto::Op::HasSubstitutes: { - auto path = store->parseStorePath(readString(from)); - logger->startWork(); - StorePathSet paths; // FIXME - paths.insert(path); - auto res = store->querySubstitutablePaths(paths); - logger->stopWork(); - to << (res.count(path) != 0); - break; - } - case WorkerProto::Op::QuerySubstitutablePaths: { auto paths = WorkerProto::Serialise::read(*store, rconn); logger->startWork(); @@ -316,36 +305,74 @@ static void performOp(TunnelLogger * logger, ref store, break; } - case WorkerProto::Op::QueryPathHash: { - auto path = store->parseStorePath(readString(from)); - logger->startWork(); - auto hash = store->queryPathInfo(path)->narHash; - logger->stopWork(); - to << hash.to_string(Base16, false); + case WorkerProto::Op::HasSubstitutes: { + throw UnimplementedError("HasSubstitutes is not supported in Lix. This is not used if the declared server protocol is > 1.12 (Nix 1.0, 2012)"); + break; + } + + case WorkerProto::Op::QueryPathHash: { + throw UnimplementedError("QueryPathHash is not supported in Lix, client usages were removed in 2016 in e0204f8d462041387651af388074491fd0bf36d6"); + break; + } + + case WorkerProto::Op::QueryReferences: { + throw UnimplementedError("QueryReferences is not supported in Lix, client usages were removed in 2016 in e0204f8d462041387651af388074491fd0bf36d6"); + break; + } + + case WorkerProto::Op::QueryDeriver: { + throw UnimplementedError("QueryDeriver is not supported in Lix, client usages were removed in 2016 in e0204f8d462041387651af388074491fd0bf36d6"); + break; + } + + case WorkerProto::Op::ExportPath: { + throw UnimplementedError("ExportPath is not supported in Lix, client usage were removed in 2017 in 27dc76c1a5dbe654465245ff5f6bc22e2c8902da"); + break; + } + + case WorkerProto::Op::ImportPaths: { + throw UnimplementedError("ImportPaths is not supported in Lix. This is not used if the declared server protocol is >= 1.18 (Nix 2.0, 2016)"); break; } - case WorkerProto::Op::QueryReferences: case WorkerProto::Op::QueryReferrers: case WorkerProto::Op::QueryValidDerivers: case WorkerProto::Op::QueryDerivationOutputs: { auto path = store->parseStorePath(readString(from)); logger->startWork(); StorePathSet paths; - if (op == WorkerProto::Op::QueryReferences) - for (auto & i : store->queryPathInfo(path)->references) - paths.insert(i); - else if (op == WorkerProto::Op::QueryReferrers) - store->queryReferrers(path, paths); - else if (op == WorkerProto::Op::QueryValidDerivers) - paths = store->queryValidDerivers(path); - else paths = store->queryDerivationOutputs(path); + + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wswitch-enum" + switch (op) { + case WorkerProto::Op::QueryReferrers: { + store->queryReferrers(path, paths); + break; + } + case WorkerProto::Op::QueryValidDerivers: { + paths = store->queryValidDerivers(path); + break; + } + case WorkerProto::Op::QueryDerivationOutputs: { + // Only sent if server presents proto version <= 1.21 + REMOVE_AFTER_DROPPING_PROTO_MINOR(21); + paths = store->queryDerivationOutputs(path); + break; + } + default: + abort(); + break; + } + #pragma GCC diagnostic pop + logger->stopWork(); WorkerProto::write(*store, wconn, paths); break; } case WorkerProto::Op::QueryDerivationOutputNames: { + // Unused in CppNix >= 2.4 (removed in 045b07200c77bf1fe19c0a986aafb531e7e1ba54) + REMOVE_AFTER_DROPPING_PROTO_MINOR(31); auto path = store->parseStorePath(readString(from)); logger->startWork(); auto names = store->readDerivation(path).outputNames(); @@ -363,15 +390,6 @@ static void performOp(TunnelLogger * logger, ref store, break; } - case WorkerProto::Op::QueryDeriver: { - auto path = store->parseStorePath(readString(from)); - logger->startWork(); - auto info = store->queryPathInfo(path); - logger->stopWork(); - to << (info->deriver ? store->printStorePath(*info->deriver) : ""); - break; - } - case WorkerProto::Op::QueryPathFromHashPart: { auto hashPart = readString(from); logger->startWork(); @@ -493,29 +511,6 @@ static void performOp(TunnelLogger * logger, ref store, break; } - case WorkerProto::Op::ExportPath: { - auto path = store->parseStorePath(readString(from)); - readInt(from); // obsolete - logger->startWork(); - TunnelSink sink(to); - store->exportPath(path, sink); - logger->stopWork(); - to << 1; - break; - } - - case WorkerProto::Op::ImportPaths: { - logger->startWork(); - TunnelSource source(from, to); - auto paths = store->importPaths(source, - trusted ? NoCheckSigs : CheckSigs); - logger->stopWork(); - Strings paths2; - for (auto & i : paths) paths2.push_back(store->printStorePath(i)); - to << paths2; - break; - } - case WorkerProto::Op::BuildPaths: { auto drvs = WorkerProto::Serialise::read(*store, rconn); BuildMode mode = buildModeFromInteger(readInt(from)); @@ -666,8 +661,10 @@ static void performOp(TunnelLogger * logger, ref store, break; } - // Obsolete. + // Obsolete since 9947f1646a26b339fff2e02b77798e9841fac7f0 (included in CppNix 2.5.0). case WorkerProto::Op::SyncWithGC: { + // CppNix 2.5.0 is 32 + REMOVE_AFTER_DROPPING_PROTO_MINOR(31); logger->startWork(); logger->stopWork(); to << 1; diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 575078289..b2f8a285d 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -307,6 +307,7 @@ StorePathSet RemoteStore::queryDerivationOutputs(const StorePath & path) if (GET_PROTOCOL_MINOR(getProtocol()) >= 22) { return Store::queryDerivationOutputs(path); } + REMOVE_AFTER_DROPPING_PROTO_MINOR(21); auto conn(getConnection()); conn->to << WorkerProto::Op::QueryDerivationOutputs << printStorePath(path); conn.processStderr(); @@ -336,6 +337,7 @@ std::map> RemoteStore::queryPartialDerivat return outputs; } } else { + REMOVE_AFTER_DROPPING_PROTO_MINOR(21); auto & evalStore = evalStore_ ? *evalStore_ : *this; // Fallback for old daemon versions. // For floating-CA derivations (and their co-dependencies) this is an @@ -530,6 +532,7 @@ void RemoteStore::registerDrvOutput(const Realisation & info) auto conn(getConnection()); conn->to << WorkerProto::Op::RegisterDrvOutput; if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 31) { + REMOVE_AFTER_DROPPING_PROTO_MINOR(30); conn->to << info.id.to_string(); conn->to << std::string(info.outPath.to_string()); } else { @@ -617,6 +620,7 @@ std::vector RemoteStore::buildPathsWithResults( conn.processStderr(); return WorkerProto::Serialise>::read(*this, *conn); } else { + REMOVE_AFTER_DROPPING_PROTO_MINOR(33); // Avoid deadlock. conn_.reset(); diff --git a/src/libstore/serve-protocol.hh b/src/libstore/serve-protocol.hh index 3f82c8177..742320933 100644 --- a/src/libstore/serve-protocol.hh +++ b/src/libstore/serve-protocol.hh @@ -8,6 +8,11 @@ namespace nix { #define SERVE_MAGIC_1 0x390c9deb #define SERVE_MAGIC_2 0x5452eecb +// This must remain at 2.7 (Nix 2.18) forever in Lix, since the protocol +// versioning is monotonic, so if we ever change it in the future, it will +// break compatibility with any potential CppNix-originated protocol changes. +// +// Lix intends to replace this protocol entirely. #define SERVE_PROTOCOL_VERSION (2 << 8 | 7) #define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00) #define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff) diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh index 5f24c189f..36acf2a8d 100644 --- a/src/libstore/worker-protocol.hh +++ b/src/libstore/worker-protocol.hh @@ -23,6 +23,10 @@ namespace nix { #define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff) +#define REMOVE_AFTER_DROPPING_PROTO_MINOR(protoMinor) \ + static_assert(MIN_SUPPORTED_MINOR_WORKER_PROTO_VERSION <= (protoMinor)) + + #define STDERR_NEXT 0x6f6c6d67 #define STDERR_READ 0x64617461 // data needed from source #define STDERR_WRITE 0x64617416 // data for sink @@ -136,30 +140,30 @@ struct WorkerProto enum struct WorkerProto::Op : uint64_t { IsValidPath = 1, - HasSubstitutes = 3, - QueryPathHash = 4, // obsolete - QueryReferences = 5, // obsolete + HasSubstitutes = 3, // obsolete since 2012, stubbed to error + QueryPathHash = 4, // obsolete since 2016, stubbed to error + QueryReferences = 5, // obsolete since 2016, stubbed to error QueryReferrers = 6, AddToStore = 7, - AddTextToStore = 8, // obsolete since 1.25, Nix 3.0. Use WorkerProto::Op::AddToStore + AddTextToStore = 8, // obsolete since protocol 1.25, CppNix 2.4. Use WorkerProto::Op::AddToStore BuildPaths = 9, EnsurePath = 10, AddTempRoot = 11, AddIndirectRoot = 12, - SyncWithGC = 13, + SyncWithGC = 13, // obsolete since CppNix 2.5.0 FindRoots = 14, - ExportPath = 16, // obsolete - QueryDeriver = 18, // obsolete + ExportPath = 16, // obsolete since 2017, stubbed to error + QueryDeriver = 18, // obsolete since 2016, stubbed to error SetOptions = 19, CollectGarbage = 20, QuerySubstitutablePathInfo = 21, - QueryDerivationOutputs = 22, // obsolete + QueryDerivationOutputs = 22, // obsolete since protocol 1.21, CppNix 2.4 QueryAllValidPaths = 23, - QueryFailedPaths = 24, - ClearFailedPaths = 25, + QueryFailedPaths = 24, // obsolete, removed + ClearFailedPaths = 25, // obsolete, removed QueryPathInfo = 26, - ImportPaths = 27, // obsolete - QueryDerivationOutputNames = 28, // obsolete + ImportPaths = 27, // obsolete since 2016 + QueryDerivationOutputNames = 28, // obsolete since CppNix 2.4 QueryPathFromHashPart = 29, QuerySubstitutablePathInfos = 30, QueryValidPaths = 31,