RemoteStore::addToStore(): Send NAR rather than string containing NAR
This allows the NAR to be streamed in the future (though we're not doing that yet).
This commit is contained in:
parent
374908726b
commit
f61f67ddee
5 changed files with 21 additions and 37 deletions
|
@ -61,27 +61,6 @@ void Store::exportPath(const Path & path, Sink & sink)
|
|||
hashAndWriteSink << exportMagic << path << info->references << info->deriver << 0;
|
||||
}
|
||||
|
||||
struct TeeSource : Source
|
||||
{
|
||||
Source & readSource;
|
||||
ref<std::string> data;
|
||||
TeeSource(Source & readSource)
|
||||
: readSource(readSource)
|
||||
, data(make_ref<std::string>())
|
||||
{
|
||||
}
|
||||
size_t read(unsigned char * data, size_t len)
|
||||
{
|
||||
size_t n = readSource.read(data, len);
|
||||
this->data->append((char *) data, n);
|
||||
return n;
|
||||
}
|
||||
};
|
||||
|
||||
struct NopSink : ParseSink
|
||||
{
|
||||
};
|
||||
|
||||
Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor, bool dontCheckSigs)
|
||||
{
|
||||
Paths res;
|
||||
|
@ -92,7 +71,7 @@ Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor,
|
|||
|
||||
/* Extract the NAR from the source. */
|
||||
TeeSource tee(source);
|
||||
NopSink sink;
|
||||
ParseSink sink;
|
||||
parseDump(sink, tee);
|
||||
|
||||
uint32_t magic = readInt(source);
|
||||
|
|
|
@ -169,9 +169,9 @@ struct LegacySSHStore : public Store
|
|||
|
||||
/* FIXME: inefficient. */
|
||||
ParseSink parseSink; /* null sink; just parse the NAR */
|
||||
SavingSourceAdapter savedNAR(conn->from);
|
||||
TeeSource savedNAR(conn->from);
|
||||
parseDump(parseSink, savedNAR);
|
||||
sink(savedNAR.s);
|
||||
sink(*savedNAR.data);
|
||||
}
|
||||
|
||||
/* Unsupported methods. */
|
||||
|
|
|
@ -378,8 +378,9 @@ void RemoteStore::addToStore(const ValidPathInfo & info, const ref<std::string>
|
|||
conn->to << wopAddToStoreNar
|
||||
<< info.path << info.deriver << printHash(info.narHash)
|
||||
<< info.references << info.registrationTime << info.narSize
|
||||
<< info.ultimate << info.sigs << info.ca << *nar << repair << dontCheckSigs;
|
||||
// FIXME: don't send nar as a string
|
||||
<< info.ultimate << info.sigs << info.ca
|
||||
<< repair << dontCheckSigs;
|
||||
conn->to(*nar);
|
||||
conn->processStderr();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -140,15 +140,16 @@ struct StringSource : Source
|
|||
|
||||
|
||||
/* Adapter class of a Source that saves all data read to `s'. */
|
||||
struct SavingSourceAdapter : Source
|
||||
struct TeeSource : Source
|
||||
{
|
||||
Source & orig;
|
||||
string s;
|
||||
SavingSourceAdapter(Source & orig) : orig(orig) { }
|
||||
ref<std::string> data;
|
||||
TeeSource(Source & orig)
|
||||
: orig(orig), data(make_ref<std::string>()) { }
|
||||
size_t read(unsigned char * data, size_t len)
|
||||
{
|
||||
size_t n = orig.read(data, len);
|
||||
s.append((const char *) data, n);
|
||||
this->data->append((const char *) data, n);
|
||||
return n;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -283,7 +283,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
|
|||
}
|
||||
HashType hashAlgo = parseHashType(s);
|
||||
|
||||
SavingSourceAdapter savedNAR(from);
|
||||
TeeSource savedNAR(from);
|
||||
RetrieveRegularNARSink savedRegular;
|
||||
|
||||
if (recursive) {
|
||||
|
@ -297,7 +297,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
|
|||
|
||||
startWork();
|
||||
if (!savedRegular.regular) throw Error("regular file expected");
|
||||
Path path = store->addToStoreFromDump(recursive ? savedNAR.s : savedRegular.s, baseName, recursive, hashAlgo);
|
||||
Path path = store->addToStoreFromDump(recursive ? *savedNAR.data : savedRegular.s, baseName, recursive, hashAlgo);
|
||||
stopWork();
|
||||
|
||||
to << path;
|
||||
|
@ -569,6 +569,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
|
|||
}
|
||||
|
||||
case wopAddToStoreNar: {
|
||||
bool repair, dontCheckSigs;
|
||||
ValidPathInfo info;
|
||||
info.path = readStorePath(*store, from);
|
||||
from >> info.deriver;
|
||||
|
@ -578,14 +579,16 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
|
|||
info.references = readStorePaths<PathSet>(*store, from);
|
||||
from >> info.registrationTime >> info.narSize >> info.ultimate;
|
||||
info.sigs = readStrings<StringSet>(from);
|
||||
from >> info.ca;
|
||||
auto nar = make_ref<std::string>(readString(from));
|
||||
bool repair, dontCheckSigs;
|
||||
from >> repair >> dontCheckSigs;
|
||||
from >> info.ca >> repair >> dontCheckSigs;
|
||||
if (!trusted && dontCheckSigs)
|
||||
dontCheckSigs = false;
|
||||
|
||||
TeeSource tee(from);
|
||||
ParseSink sink;
|
||||
parseDump(sink, tee);
|
||||
|
||||
startWork();
|
||||
store->addToStore(info, nar, repair, dontCheckSigs, nullptr);
|
||||
store->addToStore(info, tee.data, repair, dontCheckSigs, nullptr);
|
||||
stopWork();
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue