Skip to content

Commit 2dc9f2a

Browse files
authored
Merge pull request #14272 from NixOS/use-store-path-serializer
Daemon protocol: Use the WorkerProto serializer for store paths
2 parents a7991d5 + d782c5e commit 2dc9f2a

File tree

2 files changed

+53
-48
lines changed

2 files changed

+53
-48
lines changed

src/libstore/daemon.cc

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ static void performOp(
312312
switch (op) {
313313

314314
case WorkerProto::Op::IsValidPath: {
315-
auto path = store->parseStorePath(readString(conn.from));
315+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
316316
logger->startWork();
317317
bool result = store->isValidPath(path);
318318
logger->stopWork();
@@ -339,7 +339,7 @@ static void performOp(
339339
}
340340

341341
case WorkerProto::Op::HasSubstitutes: {
342-
auto path = store->parseStorePath(readString(conn.from));
342+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
343343
logger->startWork();
344344
StorePathSet paths; // FIXME
345345
paths.insert(path);
@@ -359,7 +359,7 @@ static void performOp(
359359
}
360360

361361
case WorkerProto::Op::QueryPathHash: {
362-
auto path = store->parseStorePath(readString(conn.from));
362+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
363363
logger->startWork();
364364
auto hash = store->queryPathInfo(path)->narHash;
365365
logger->stopWork();
@@ -371,7 +371,7 @@ static void performOp(
371371
case WorkerProto::Op::QueryReferrers:
372372
case WorkerProto::Op::QueryValidDerivers:
373373
case WorkerProto::Op::QueryDerivationOutputs: {
374-
auto path = store->parseStorePath(readString(conn.from));
374+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
375375
logger->startWork();
376376
StorePathSet paths;
377377
if (op == WorkerProto::Op::QueryReferences)
@@ -389,7 +389,7 @@ static void performOp(
389389
}
390390

391391
case WorkerProto::Op::QueryDerivationOutputNames: {
392-
auto path = store->parseStorePath(readString(conn.from));
392+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
393393
logger->startWork();
394394
auto names = store->readDerivation(path).outputNames();
395395
logger->stopWork();
@@ -398,7 +398,7 @@ static void performOp(
398398
}
399399

400400
case WorkerProto::Op::QueryDerivationOutputMap: {
401-
auto path = store->parseStorePath(readString(conn.from));
401+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
402402
logger->startWork();
403403
auto outputs = store->queryPartialDerivationOutputMap(path);
404404
logger->stopWork();
@@ -407,11 +407,11 @@ static void performOp(
407407
}
408408

409409
case WorkerProto::Op::QueryDeriver: {
410-
auto path = store->parseStorePath(readString(conn.from));
410+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
411411
logger->startWork();
412412
auto info = store->queryPathInfo(path);
413413
logger->stopWork();
414-
conn.to << (info->deriver ? store->printStorePath(*info->deriver) : "");
414+
WorkerProto::write(*store, conn, info->deriver);
415415
break;
416416
}
417417

@@ -420,7 +420,7 @@ static void performOp(
420420
logger->startWork();
421421
auto path = store->queryPathFromHashPart(hashPart);
422422
logger->stopWork();
423-
conn.to << (path ? store->printStorePath(*path) : "");
423+
WorkerProto::write(*store, conn, path);
424424
break;
425425
}
426426

@@ -505,7 +505,7 @@ static void performOp(
505505
store->addToStoreFromDump(*dumpSource, baseName, FileSerialisationMethod::NixArchive, method, hashAlgo);
506506
logger->stopWork();
507507

508-
conn.to << store->printStorePath(path);
508+
WorkerProto::write(*store, wconn, path);
509509
}
510510
break;
511511
}
@@ -542,7 +542,7 @@ static void performOp(
542542
NoRepair);
543543
});
544544
logger->stopWork();
545-
conn.to << store->printStorePath(path);
545+
WorkerProto::write(*store, wconn, path);
546546
break;
547547
}
548548

@@ -591,7 +591,7 @@ static void performOp(
591591
}
592592

593593
case WorkerProto::Op::BuildDerivation: {
594-
auto drvPath = store->parseStorePath(readString(conn.from));
594+
auto drvPath = WorkerProto::Serialise<StorePath>::read(*store, rconn);
595595
BasicDerivation drv;
596596
/*
597597
* Note: unlike wopEnsurePath, this operation reads a
@@ -668,7 +668,7 @@ static void performOp(
668668
}
669669

670670
case WorkerProto::Op::EnsurePath: {
671-
auto path = store->parseStorePath(readString(conn.from));
671+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
672672
logger->startWork();
673673
store->ensurePath(path);
674674
logger->stopWork();
@@ -677,7 +677,7 @@ static void performOp(
677677
}
678678

679679
case WorkerProto::Op::AddTempRoot: {
680-
auto path = store->parseStorePath(readString(conn.from));
680+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
681681
logger->startWork();
682682
store->addTempRoot(path);
683683
logger->stopWork();
@@ -733,8 +733,10 @@ static void performOp(
733733
conn.to << size;
734734

735735
for (auto & [target, links] : roots)
736-
for (auto & link : links)
737-
conn.to << link << store->printStorePath(target);
736+
for (auto & link : links) {
737+
conn.to << link;
738+
WorkerProto::write(*store, wconn, target);
739+
}
738740

739741
break;
740742
}
@@ -799,7 +801,7 @@ static void performOp(
799801
}
800802

801803
case WorkerProto::Op::QuerySubstitutablePathInfo: {
802-
auto path = store->parseStorePath(readString(conn.from));
804+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
803805
logger->startWork();
804806
SubstitutablePathInfos infos;
805807
store->querySubstitutablePathInfos({{path, std::nullopt}}, infos);
@@ -808,7 +810,8 @@ static void performOp(
808810
if (i == infos.end())
809811
conn.to << 0;
810812
else {
811-
conn.to << 1 << (i->second.deriver ? store->printStorePath(*i->second.deriver) : "");
813+
conn.to << 1;
814+
WorkerProto::write(*store, wconn, i->second.deriver);
812815
WorkerProto::write(*store, wconn, i->second.references);
813816
conn.to << i->second.downloadSize << i->second.narSize;
814817
}
@@ -829,8 +832,8 @@ static void performOp(
829832
logger->stopWork();
830833
conn.to << infos.size();
831834
for (auto & i : infos) {
832-
conn.to << store->printStorePath(i.first)
833-
<< (i.second.deriver ? store->printStorePath(*i.second.deriver) : "");
835+
WorkerProto::write(*store, wconn, i.first);
836+
WorkerProto::write(*store, wconn, i.second.deriver);
834837
WorkerProto::write(*store, wconn, i.second.references);
835838
conn.to << i.second.downloadSize << i.second.narSize;
836839
}
@@ -846,7 +849,7 @@ static void performOp(
846849
}
847850

848851
case WorkerProto::Op::QueryPathInfo: {
849-
auto path = store->parseStorePath(readString(conn.from));
852+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
850853
std::shared_ptr<const ValidPathInfo> info;
851854
logger->startWork();
852855
info = store->queryPathInfo(path);
@@ -880,7 +883,7 @@ static void performOp(
880883
}
881884

882885
case WorkerProto::Op::AddSignatures: {
883-
auto path = store->parseStorePath(readString(conn.from));
886+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
884887
StringSet sigs = readStrings<StringSet>(conn.from);
885888
logger->startWork();
886889
store->addSignatures(path, sigs);
@@ -890,7 +893,7 @@ static void performOp(
890893
}
891894

892895
case WorkerProto::Op::NarFromPath: {
893-
auto path = store->parseStorePath(readString(conn.from));
896+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
894897
logger->startWork();
895898
logger->stopWork();
896899
dumpPath(store->toRealPath(path), conn.to);
@@ -899,12 +902,11 @@ static void performOp(
899902

900903
case WorkerProto::Op::AddToStoreNar: {
901904
bool repair, dontCheckSigs;
902-
auto path = store->parseStorePath(readString(conn.from));
903-
auto deriver = readString(conn.from);
905+
auto path = WorkerProto::Serialise<StorePath>::read(*store, rconn);
906+
auto deriver = WorkerProto::Serialise<std::optional<StorePath>>::read(*store, rconn);
904907
auto narHash = Hash::parseAny(readString(conn.from), HashAlgorithm::SHA256);
905908
ValidPathInfo info{path, narHash};
906-
if (deriver != "")
907-
info.deriver = store->parseStorePath(deriver);
909+
info.deriver = std::move(deriver);
908910
info.references = WorkerProto::Serialise<StorePathSet>::read(*store, rconn);
909911
conn.from >> info.registrationTime >> info.narSize >> info.ultimate;
910912
info.sigs = readStrings<StringSet>(conn.from);

src/libstore/remote-store.cc

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ void RemoteStore::setOptions()
159159
bool RemoteStore::isValidPathUncached(const StorePath & path)
160160
{
161161
auto conn(getConnection());
162-
conn->to << WorkerProto::Op::IsValidPath << printStorePath(path);
162+
conn->to << WorkerProto::Op::IsValidPath;
163+
WorkerProto::write(*this, *conn, path);
163164
conn.processStderr();
164165
return readInt(conn->from);
165166
}
@@ -205,10 +206,8 @@ void RemoteStore::querySubstitutablePathInfos(const StorePathCAMap & pathsMap, S
205206
conn.processStderr();
206207
size_t count = readNum<size_t>(conn->from);
207208
for (size_t n = 0; n < count; n++) {
208-
SubstitutablePathInfo & info(infos[parseStorePath(readString(conn->from))]);
209-
auto deriver = readString(conn->from);
210-
if (deriver != "")
211-
info.deriver = parseStorePath(deriver);
209+
SubstitutablePathInfo & info(infos[WorkerProto::Serialise<StorePath>::read(*this, *conn)]);
210+
info.deriver = WorkerProto::Serialise<std::optional<StorePath>>::read(*this, *conn);
212211
info.references = WorkerProto::Serialise<StorePathSet>::read(*this, *conn);
213212
info.downloadSize = readLongLong(conn->from);
214213
info.narSize = readLongLong(conn->from);
@@ -235,7 +234,8 @@ void RemoteStore::queryPathInfoUncached(
235234
void RemoteStore::queryReferrers(const StorePath & path, StorePathSet & referrers)
236235
{
237236
auto conn(getConnection());
238-
conn->to << WorkerProto::Op::QueryReferrers << printStorePath(path);
237+
conn->to << WorkerProto::Op::QueryReferrers;
238+
WorkerProto::write(*this, *conn, path);
239239
conn.processStderr();
240240
for (auto & i : WorkerProto::Serialise<StorePathSet>::read(*this, *conn))
241241
referrers.insert(i);
@@ -244,7 +244,8 @@ void RemoteStore::queryReferrers(const StorePath & path, StorePathSet & referrer
244244
StorePathSet RemoteStore::queryValidDerivers(const StorePath & path)
245245
{
246246
auto conn(getConnection());
247-
conn->to << WorkerProto::Op::QueryValidDerivers << printStorePath(path);
247+
conn->to << WorkerProto::Op::QueryValidDerivers;
248+
WorkerProto::write(*this, *conn, path);
248249
conn.processStderr();
249250
return WorkerProto::Serialise<StorePathSet>::read(*this, *conn);
250251
}
@@ -255,7 +256,8 @@ StorePathSet RemoteStore::queryDerivationOutputs(const StorePath & path)
255256
return Store::queryDerivationOutputs(path);
256257
}
257258
auto conn(getConnection());
258-
conn->to << WorkerProto::Op::QueryDerivationOutputs << printStorePath(path);
259+
conn->to << WorkerProto::Op::QueryDerivationOutputs;
260+
WorkerProto::write(*this, *conn, path);
259261
conn.processStderr();
260262
return WorkerProto::Serialise<StorePathSet>::read(*this, *conn);
261263
}
@@ -266,7 +268,8 @@ RemoteStore::queryPartialDerivationOutputMap(const StorePath & path, Store * eva
266268
if (GET_PROTOCOL_MINOR(getProtocol()) >= 0x16) {
267269
if (!evalStore_) {
268270
auto conn(getConnection());
269-
conn->to << WorkerProto::Op::QueryDerivationOutputMap << printStorePath(path);
271+
conn->to << WorkerProto::Op::QueryDerivationOutputMap;
272+
WorkerProto::write(*this, *conn, path);
270273
conn.processStderr();
271274
return WorkerProto::Serialise<std::map<std::string, std::optional<StorePath>>>::read(*this, *conn);
272275
} else {
@@ -299,10 +302,7 @@ std::optional<StorePath> RemoteStore::queryPathFromHashPart(const std::string &
299302
auto conn(getConnection());
300303
conn->to << WorkerProto::Op::QueryPathFromHashPart << hashPart;
301304
conn.processStderr();
302-
Path path = readString(conn->from);
303-
if (path.empty())
304-
return {};
305-
return parseStorePath(path);
305+
return WorkerProto::Serialise<std::optional<StorePath>>::read(*this, *conn);
306306
}
307307

308308
ref<const ValidPathInfo> RemoteStore::addCAToStore(
@@ -384,7 +384,7 @@ ref<const ValidPathInfo> RemoteStore::addCAToStore(
384384
break;
385385
}
386386
}
387-
auto path = parseStorePath(readString(conn->from));
387+
auto path = WorkerProto::Serialise<StorePath>::read(*this, *conn);
388388
// Release our connection to prevent a deadlock in queryPathInfo().
389389
conn_.reset();
390390
return queryPathInfo(path);
@@ -426,9 +426,10 @@ void RemoteStore::addToStore(const ValidPathInfo & info, Source & source, Repair
426426
{
427427
auto conn(getConnection());
428428

429-
conn->to << WorkerProto::Op::AddToStoreNar << printStorePath(info.path)
430-
<< (info.deriver ? printStorePath(*info.deriver) : "")
431-
<< info.narHash.to_string(HashFormat::Base16, false);
429+
conn->to << WorkerProto::Op::AddToStoreNar;
430+
WorkerProto::write(*this, *conn, info.path);
431+
WorkerProto::write(*this, *conn, info.deriver);
432+
conn->to << info.narHash.to_string(HashFormat::Base16, false);
432433
WorkerProto::write(*this, *conn, info.references);
433434
conn->to << info.registrationTime << info.narSize << info.ultimate << info.sigs << renderContentAddress(info.ca)
434435
<< repair << !checkSigs;
@@ -663,7 +664,8 @@ BuildResult RemoteStore::buildDerivation(const StorePath & drvPath, const BasicD
663664
void RemoteStore::ensurePath(const StorePath & path)
664665
{
665666
auto conn(getConnection());
666-
conn->to << WorkerProto::Op::EnsurePath << printStorePath(path);
667+
conn->to << WorkerProto::Op::EnsurePath;
668+
WorkerProto::write(*this, *conn, path);
667669
conn.processStderr();
668670
readInt(conn->from);
669671
}
@@ -683,8 +685,7 @@ Roots RemoteStore::findRoots(bool censor)
683685
Roots result;
684686
while (count--) {
685687
Path link = readString(conn->from);
686-
auto target = parseStorePath(readString(conn->from));
687-
result[std::move(target)].emplace(link);
688+
result[WorkerProto::Serialise<StorePath>::read(*this, *conn)].emplace(link);
688689
}
689690
return result;
690691
}
@@ -728,7 +729,9 @@ bool RemoteStore::verifyStore(bool checkContents, RepairFlag repair)
728729
void RemoteStore::addSignatures(const StorePath & storePath, const StringSet & sigs)
729730
{
730731
auto conn(getConnection());
731-
conn->to << WorkerProto::Op::AddSignatures << printStorePath(storePath) << sigs;
732+
conn->to << WorkerProto::Op::AddSignatures;
733+
WorkerProto::write(*this, *conn, storePath);
734+
conn->to << sigs;
732735
conn.processStderr();
733736
readInt(conn->from);
734737
}

0 commit comments

Comments
 (0)