aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/projectstore
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-04-26 10:12:03 +0200
committerGitHub Enterprise <[email protected]>2024-04-26 10:12:03 +0200
commitef1b4234c851131cf5a6d249684c14c5c27d2878 (patch)
treeafd972c077b2585c2dc336b79eb1d31d02372295 /src/zenserver/projectstore
parentfix oplog import during gcv2 (#62) (diff)
downloadzen-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.cpp24
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();