diff options
| author | Dan Engelbrecht <[email protected]> | 2024-04-26 10:12:03 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-04-26 10:12:03 +0200 |
| commit | ef1b4234c851131cf5a6d249684c14c5c27d2878 (patch) | |
| tree | afd972c077b2585c2dc336b79eb1d31d02372295 /src/zenserver/projectstore | |
| parent | fix oplog import during gcv2 (#62) (diff) | |
| download | zen-ef1b4234c851131cf5a6d249684c14c5c27d2878.tar.xz zen-ef1b4234c851131cf5a6d249684c14c5c27d2878.zip | |
use direct file access for large file hash (#63)
- Improvement: Refactor `IoHash::HashBuffer` and `BLAKE3::HashBuffer` to not use memory mapped files. Performs better and saves ~10% of oplog export time on CI
Diffstat (limited to 'src/zenserver/projectstore')
| -rw-r--r-- | src/zenserver/projectstore/remoteprojectstore.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/zenserver/projectstore/remoteprojectstore.cpp b/src/zenserver/projectstore/remoteprojectstore.cpp index 0aa8df362..42c93f7cd 100644 --- a/src/zenserver/projectstore/remoteprojectstore.cpp +++ b/src/zenserver/projectstore/remoteprojectstore.cpp @@ -296,12 +296,28 @@ WriteToTempFile(CompressedBuffer&& CompressedBuffer, std::filesystem::path Path) uint64_t Offset = 0; { CompositeBuffer Compressed = std::move(CompressedBuffer).GetCompressed(); - BasicFileWriter BlockWriter(BlockFile, 64u * 1024u); for (const SharedBuffer& Segment : Compressed.GetSegments()) { - size_t SegmentSize = Segment.GetSize(); - BlockWriter.Write(Segment.GetData(), SegmentSize, Offset); - Offset += SegmentSize; + size_t SegmentSize = Segment.GetSize(); + static const uint64_t BufferingSize = 256u * 1024u; + + IoBufferFileReference FileRef; + if (SegmentSize >= (BufferingSize + BufferingSize / 2) && Segment.GetFileReference(FileRef)) + { + ScanFile(FileRef.FileHandle, + FileRef.FileChunkOffset, + FileRef.FileChunkSize, + BufferingSize, + [&BlockFile, &Offset](const void* Data, size_t Size) { + BlockFile.Write(Data, Size, Offset); + Offset += Size; + }); + } + else + { + BlockFile.Write(Segment.GetData(), SegmentSize, Offset); + Offset += SegmentSize; + } } } void* FileHandle = BlockFile.Detach(); |