forked from lix-project/lix
Merge pull request #3935 from obsidiansystems/binary-cache-addToStoreFromDump
Get rid of Hash::dummy from BinaryCacheStore
This commit is contained in:
commit
51c299213b
|
@ -142,17 +142,10 @@ struct FileSource : FdSource
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void BinaryCacheStore::addToStore(const ValidPathInfo & info, Source & narSource,
|
ref<const ValidPathInfo> BinaryCacheStore::addToStoreCommon(
|
||||||
RepairFlag repair, CheckSigsFlag checkSigs)
|
Source & narSource, RepairFlag repair, CheckSigsFlag checkSigs,
|
||||||
|
std::function<ValidPathInfo(HashResult)> mkInfo)
|
||||||
{
|
{
|
||||||
assert(info.narSize);
|
|
||||||
|
|
||||||
if (!repair && isValidPath(info.path)) {
|
|
||||||
// FIXME: copyNAR -> null sink
|
|
||||||
narSource.drain();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto [fdTemp, fnTemp] = createTempFile();
|
auto [fdTemp, fnTemp] = createTempFile();
|
||||||
|
|
||||||
AutoDelete autoDelete(fnTemp);
|
AutoDelete autoDelete(fnTemp);
|
||||||
|
@ -162,13 +155,15 @@ void BinaryCacheStore::addToStore(const ValidPathInfo & info, Source & narSource
|
||||||
/* Read the NAR simultaneously into a CompressionSink+FileSink (to
|
/* Read the NAR simultaneously into a CompressionSink+FileSink (to
|
||||||
write the compressed NAR to disk), into a HashSink (to get the
|
write the compressed NAR to disk), into a HashSink (to get the
|
||||||
NAR hash), and into a NarAccessor (to get the NAR listing). */
|
NAR hash), and into a NarAccessor (to get the NAR listing). */
|
||||||
HashSink fileHashSink(htSHA256);
|
HashSink fileHashSink { htSHA256 };
|
||||||
std::shared_ptr<FSAccessor> narAccessor;
|
std::shared_ptr<FSAccessor> narAccessor;
|
||||||
|
HashSink narHashSink { htSHA256 };
|
||||||
{
|
{
|
||||||
FdSink fileSink(fdTemp.get());
|
FdSink fileSink(fdTemp.get());
|
||||||
TeeSink teeSink(fileSink, fileHashSink);
|
TeeSink teeSinkCompressed { fileSink, fileHashSink };
|
||||||
auto compressionSink = makeCompressionSink(compression, teeSink);
|
auto compressionSink = makeCompressionSink(compression, teeSinkCompressed);
|
||||||
TeeSource teeSource(narSource, *compressionSink);
|
TeeSink teeSinkUncompressed { *compressionSink, narHashSink };
|
||||||
|
TeeSource teeSource { narSource, teeSinkUncompressed };
|
||||||
narAccessor = makeNarAccessor(teeSource);
|
narAccessor = makeNarAccessor(teeSource);
|
||||||
compressionSink->finish();
|
compressionSink->finish();
|
||||||
fileSink.flush();
|
fileSink.flush();
|
||||||
|
@ -176,9 +171,8 @@ void BinaryCacheStore::addToStore(const ValidPathInfo & info, Source & narSource
|
||||||
|
|
||||||
auto now2 = std::chrono::steady_clock::now();
|
auto now2 = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
auto info = mkInfo(narHashSink.finish());
|
||||||
auto narInfo = make_ref<NarInfo>(info);
|
auto narInfo = make_ref<NarInfo>(info);
|
||||||
narInfo->narSize = info.narSize;
|
|
||||||
narInfo->narHash = info.narHash;
|
|
||||||
narInfo->compression = compression;
|
narInfo->compression = compression;
|
||||||
auto [fileHash, fileSize] = fileHashSink.finish();
|
auto [fileHash, fileSize] = fileHashSink.finish();
|
||||||
narInfo->fileHash = fileHash;
|
narInfo->fileHash = fileHash;
|
||||||
|
@ -300,6 +294,41 @@ void BinaryCacheStore::addToStore(const ValidPathInfo & info, Source & narSource
|
||||||
writeNarInfo(narInfo);
|
writeNarInfo(narInfo);
|
||||||
|
|
||||||
stats.narInfoWrite++;
|
stats.narInfoWrite++;
|
||||||
|
|
||||||
|
return narInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BinaryCacheStore::addToStore(const ValidPathInfo & info, Source & narSource,
|
||||||
|
RepairFlag repair, CheckSigsFlag checkSigs)
|
||||||
|
{
|
||||||
|
if (!repair && isValidPath(info.path)) {
|
||||||
|
// FIXME: copyNAR -> null sink
|
||||||
|
narSource.drain();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
addToStoreCommon(narSource, repair, checkSigs, {[&](HashResult nar) {
|
||||||
|
/* FIXME reinstate these, once we can correctly do hash modulo sink as
|
||||||
|
needed. We need to throw here in case we uploaded a corrupted store path. */
|
||||||
|
// assert(info.narHash == nar.first);
|
||||||
|
// assert(info.narSize == nar.second);
|
||||||
|
return info;
|
||||||
|
}});
|
||||||
|
}
|
||||||
|
|
||||||
|
StorePath BinaryCacheStore::addToStoreFromDump(Source & dump, const string & name,
|
||||||
|
FileIngestionMethod method, HashType hashAlgo, RepairFlag repair)
|
||||||
|
{
|
||||||
|
if (method != FileIngestionMethod::Recursive || hashAlgo != htSHA256)
|
||||||
|
unsupported("addToStoreFromDump");
|
||||||
|
return addToStoreCommon(dump, repair, CheckSigs, [&](HashResult nar) {
|
||||||
|
ValidPathInfo info {
|
||||||
|
makeFixedOutputPath(method, nar.first, name),
|
||||||
|
nar.first,
|
||||||
|
};
|
||||||
|
info.narSize = nar.second;
|
||||||
|
return info;
|
||||||
|
})->path;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BinaryCacheStore::isValidPathUncached(const StorePath & storePath)
|
bool BinaryCacheStore::isValidPathUncached(const StorePath & storePath)
|
||||||
|
@ -367,50 +396,52 @@ void BinaryCacheStore::queryPathInfoUncached(const StorePath & storePath,
|
||||||
StorePath BinaryCacheStore::addToStore(const string & name, const Path & srcPath,
|
StorePath BinaryCacheStore::addToStore(const string & name, const Path & srcPath,
|
||||||
FileIngestionMethod method, HashType hashAlgo, PathFilter & filter, RepairFlag repair)
|
FileIngestionMethod method, HashType hashAlgo, PathFilter & filter, RepairFlag repair)
|
||||||
{
|
{
|
||||||
// FIXME: some cut&paste from LocalStore::addToStore().
|
/* FIXME: Make BinaryCacheStore::addToStoreCommon support
|
||||||
|
non-recursive+sha256 so we can just use the default
|
||||||
|
implementation of this method in terms of addToStoreFromDump. */
|
||||||
|
|
||||||
/* Read the whole path into memory. This is not a very scalable
|
HashSink sink { hashAlgo };
|
||||||
method for very large paths, but `copyPath' is mainly used for
|
|
||||||
small files. */
|
|
||||||
StringSink sink;
|
|
||||||
std::optional<Hash> h;
|
|
||||||
if (method == FileIngestionMethod::Recursive) {
|
if (method == FileIngestionMethod::Recursive) {
|
||||||
dumpPath(srcPath, sink, filter);
|
dumpPath(srcPath, sink, filter);
|
||||||
h = hashString(hashAlgo, *sink.s);
|
|
||||||
} else {
|
} else {
|
||||||
auto s = readFile(srcPath);
|
readFile(srcPath, sink);
|
||||||
dumpString(s, sink);
|
|
||||||
h = hashString(hashAlgo, s);
|
|
||||||
}
|
}
|
||||||
|
auto h = sink.finish().first;
|
||||||
|
|
||||||
|
auto source = sinkToSource([&](Sink & sink) {
|
||||||
|
dumpPath(srcPath, sink, filter);
|
||||||
|
});
|
||||||
|
return addToStoreCommon(*source, repair, CheckSigs, [&](HashResult nar) {
|
||||||
ValidPathInfo info {
|
ValidPathInfo info {
|
||||||
makeFixedOutputPath(method, *h, name),
|
makeFixedOutputPath(method, h, name),
|
||||||
Hash::dummy, // Will be fixed in addToStore, which recomputes nar hash
|
nar.first,
|
||||||
};
|
};
|
||||||
|
info.narSize = nar.second;
|
||||||
auto source = StringSource { *sink.s };
|
info.ca = FixedOutputHash {
|
||||||
addToStore(info, source, repair, CheckSigs);
|
.method = method,
|
||||||
|
.hash = h,
|
||||||
return std::move(info.path);
|
};
|
||||||
|
return info;
|
||||||
|
})->path;
|
||||||
}
|
}
|
||||||
|
|
||||||
StorePath BinaryCacheStore::addTextToStore(const string & name, const string & s,
|
StorePath BinaryCacheStore::addTextToStore(const string & name, const string & s,
|
||||||
const StorePathSet & references, RepairFlag repair)
|
const StorePathSet & references, RepairFlag repair)
|
||||||
{
|
{
|
||||||
ValidPathInfo info {
|
auto textHash = hashString(htSHA256, s);
|
||||||
computeStorePathForText(name, s, references),
|
auto path = makeTextPath(name, textHash, references);
|
||||||
Hash::dummy, // Will be fixed in addToStore, which recomputes nar hash
|
|
||||||
};
|
if (!repair && isValidPath(path))
|
||||||
|
return path;
|
||||||
|
|
||||||
|
auto source = StringSource { s };
|
||||||
|
return addToStoreCommon(source, repair, CheckSigs, [&](HashResult nar) {
|
||||||
|
ValidPathInfo info { path, nar.first };
|
||||||
|
info.narSize = nar.second;
|
||||||
|
info.ca = TextHash { textHash };
|
||||||
info.references = references;
|
info.references = references;
|
||||||
|
return info;
|
||||||
if (repair || !isValidPath(info.path)) {
|
})->path;
|
||||||
StringSink sink;
|
|
||||||
dumpString(s, sink);
|
|
||||||
auto source = StringSource { *sink.s };
|
|
||||||
addToStore(info, source, repair, CheckSigs);
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::move(info.path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ref<FSAccessor> BinaryCacheStore::getFSAccessor()
|
ref<FSAccessor> BinaryCacheStore::getFSAccessor()
|
||||||
|
|
|
@ -72,6 +72,10 @@ private:
|
||||||
|
|
||||||
void writeNarInfo(ref<NarInfo> narInfo);
|
void writeNarInfo(ref<NarInfo> narInfo);
|
||||||
|
|
||||||
|
ref<const ValidPathInfo> addToStoreCommon(
|
||||||
|
Source & narSource, RepairFlag repair, CheckSigsFlag checkSigs,
|
||||||
|
std::function<ValidPathInfo(HashResult)> mkInfo);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
bool isValidPathUncached(const StorePath & path) override;
|
bool isValidPathUncached(const StorePath & path) override;
|
||||||
|
@ -85,6 +89,9 @@ public:
|
||||||
void addToStore(const ValidPathInfo & info, Source & narSource,
|
void addToStore(const ValidPathInfo & info, Source & narSource,
|
||||||
RepairFlag repair, CheckSigsFlag checkSigs) override;
|
RepairFlag repair, CheckSigsFlag checkSigs) override;
|
||||||
|
|
||||||
|
StorePath addToStoreFromDump(Source & dump, const string & name,
|
||||||
|
FileIngestionMethod method, HashType hashAlgo, RepairFlag repair) override;
|
||||||
|
|
||||||
StorePath addToStore(const string & name, const Path & srcPath,
|
StorePath addToStore(const string & name, const Path & srcPath,
|
||||||
FileIngestionMethod method, HashType hashAlgo,
|
FileIngestionMethod method, HashType hashAlgo,
|
||||||
PathFilter & filter, RepairFlag repair) override;
|
PathFilter & filter, RepairFlag repair) override;
|
||||||
|
|
|
@ -454,9 +454,7 @@ public:
|
||||||
// FIXME: remove?
|
// FIXME: remove?
|
||||||
virtual StorePath addToStoreFromDump(Source & dump, const string & name,
|
virtual StorePath addToStoreFromDump(Source & dump, const string & name,
|
||||||
FileIngestionMethod method = FileIngestionMethod::Recursive, HashType hashAlgo = htSHA256, RepairFlag repair = NoRepair)
|
FileIngestionMethod method = FileIngestionMethod::Recursive, HashType hashAlgo = htSHA256, RepairFlag repair = NoRepair)
|
||||||
{
|
{ unsupported("addToStoreFromDump"); }
|
||||||
throw Error("addToStoreFromDump() is not supported by this store");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Like addToStore, but the contents written to the output path is
|
/* Like addToStore, but the contents written to the output path is
|
||||||
a regular file containing the given string. */
|
a regular file containing the given string. */
|
||||||
|
|
Loading…
Reference in a new issue