diff options
| author | Dan Engelbrecht <[email protected]> | 2024-04-30 10:11:25 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-04-30 10:11:25 +0200 |
| commit | c7a0ddf9f26fdd647574e4031a66362234298e7a (patch) | |
| tree | 5e3eba1856dc160ca0beb2bc5edaf1ea490a0a6f /src/zenserver | |
| parent | miscellaneous minor bugfixes (#66) (diff) | |
| download | zen-c7a0ddf9f26fdd647574e4031a66362234298e7a.tar.xz zen-c7a0ddf9f26fdd647574e4031a66362234298e7a.zip | |
fix get project files loop (#68)
- Bugfix: Remove extra loop causing GetProjectFiles for project store to find all chunks once for each chunk found
- Bugfix: Don't capture ChunkIndex variable in CasImpl::IterateChunks by reference as it causes crash
- Improvement: Make FileCasStrategy::IterateChunks (optionally) multithreaded (improves GetProjectFiles performance)
Diffstat (limited to 'src/zenserver')
| -rw-r--r-- | src/zenserver/projectstore/projectstore.cpp | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp index 1e53dfd94..afb2c100c 100644 --- a/src/zenserver/projectstore/projectstore.cpp +++ b/src/zenserver/projectstore/projectstore.cpp @@ -938,7 +938,7 @@ ProjectStore::Oplog::IterateChunks(std::span<Oid> ChunkIds, { break; } - OptionalWorkerPool->ScheduleWork([&]() { + OptionalWorkerPool->ScheduleWork([&WorkLatch, ChunkIndex, &FileChunkIndexes, &FileChunkPaths, &AsyncCallback, &Result]() { auto _ = MakeGuard([&WorkLatch]() { WorkLatch.CountDown(); }); if (Result.load() == false) { @@ -2730,30 +2730,27 @@ ProjectStore::GetProjectFiles(const std::string_view ProjectId, RawSizes.resize(Ids.size(), 0u); } - for (size_t Index = 0; Index < Ids.size(); Index++) - { - FoundLog->IterateChunks( - Ids, - [&](size_t Index, const IoBuffer& Payload) { - uint64_t Size = Payload.GetSize(); - if (WantsRawSizeField) - { - uint64_t RawSize = Size; - if (Payload.GetContentType() == ZenContentType::kCompressedBinary) - { - IoHash __; - (void)CompressedBuffer::FromCompressed(SharedBuffer(Payload), __, RawSize); - } - RawSizes[Index] = RawSize; - } - if (WantsSizeField) + FoundLog->IterateChunks( + Ids, + [&](size_t Index, const IoBuffer& Payload) { + uint64_t Size = Payload.GetSize(); + if (WantsRawSizeField) + { + uint64_t RawSize = Size; + if (Payload.GetContentType() == ZenContentType::kCompressedBinary) { - Sizes[Index] = Size; + IoHash __; + (void)CompressedBuffer::FromCompressed(SharedBuffer(Payload), __, RawSize); } - return true; - }, - &GetSmallWorkerPool()); - } + RawSizes[Index] = RawSize; + } + if (WantsSizeField) + { + Sizes[Index] = Size; + } + return true; + }, + &GetSmallWorkerPool()); } CbObjectWriter Response; |