aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2025-03-05 10:55:23 +0100
committerStefan Boberg <[email protected]>2025-03-05 10:55:23 +0100
commitf6a1bcdd2fb0fd572566cc53397fa48394b01c04 (patch)
treec565aeb23e4d79eb23367930552e06b62917605e /src
parentadded tracing support for zen CLI (diff)
downloadzen-f6a1bcdd2fb0fd572566cc53397fa48394b01c04.tar.xz
zen-f6a1bcdd2fb0fd572566cc53397fa48394b01c04.zip
ZEN_TRACE_CPU annotations for builds command
Diffstat (limited to 'src')
-rw-r--r--src/zen/cmds/builds_cmd.cpp90
-rw-r--r--src/zenutil/chunkedcontent.cpp79
-rw-r--r--src/zenutil/jupiter/jupiterbuildstorage.cpp31
3 files changed, 160 insertions, 40 deletions
diff --git a/src/zen/cmds/builds_cmd.cpp b/src/zen/cmds/builds_cmd.cpp
index 219d01240..0036192e4 100644
--- a/src/zen/cmds/builds_cmd.cpp
+++ b/src/zen/cmds/builds_cmd.cpp
@@ -12,6 +12,7 @@
#include <zencore/logging.h>
#include <zencore/scopeguard.h>
#include <zencore/string.h>
+#include <zencore/trace.h>
#include <zencore/uid.h>
#include <zenhttp/formatters.h>
#include <zenhttp/httpclient.h>
@@ -176,6 +177,8 @@ namespace {
void CleanDirectory(const std::filesystem::path& Path, std::span<const std::string_view> ExcludeDirectories)
{
+ ZEN_TRACE_CPU("CleanDirectory");
+
DirectoryContent LocalDirectoryContent;
GetDirectoryContent(Path, DirectoryContentFlags::IncludeDirs | DirectoryContentFlags::IncludeFiles, LocalDirectoryContent);
for (const std::filesystem::path& LocalFilePath : LocalDirectoryContent.Files)
@@ -348,6 +351,8 @@ namespace {
std::function<bool(std::string_view RelativePath, uint64_t Size, uint32_t Attributes)>&& IsAcceptedFile,
ChunkingController& ChunkController)
{
+ ZEN_TRACE_CPU("ScanAndChunkFolder");
+
FolderContent Content = GetFolderContent(
GetFolderContentStats,
Path,
@@ -502,6 +507,8 @@ namespace {
const std::span<const uint32_t>& LooseChunkIndexes,
const std::span<const ChunkBlockDescription>& BlockDescriptions)
{
+ ZEN_TRACE_CPU("CalculateAbsoluteChunkOrders");
+
#if EXTRA_VERIFY
std::vector<IoHash> TmpAbsoluteChunkHashes;
TmpAbsoluteChunkHashes.reserve(LocalChunkHashes.size());
@@ -568,6 +575,8 @@ namespace {
std::vector<uint64_t>& OutLocalChunkRawSizes,
std::vector<uint32_t>& OutLocalChunkOrders)
{
+ ZEN_TRACE_CPU("CalculateLocalChunkOrders");
+
std::vector<IoHash> AbsoluteChunkHashes;
std::vector<uint64_t> AbsoluteChunkRawSizes;
AbsoluteChunkHashes.insert(AbsoluteChunkHashes.end(), LooseChunkHashes.begin(), LooseChunkHashes.end());
@@ -951,6 +960,8 @@ namespace {
const uint64_t BlockSize = 256u * 1024u;
CompositeBuffer GetRange(uint64_t Offset, uint64_t Size)
{
+ ZEN_TRACE_CPU("BufferedOpenFile::GetRange");
+
ZEN_ASSERT((CacheBlockIndex == (uint64_t)-1) || Cache);
auto _ = MakeGuard([&]() { ZEN_ASSERT((CacheBlockIndex == (uint64_t)-1) || Cache); });
@@ -1018,6 +1029,8 @@ namespace {
CompositeBuffer GetRange(uint32_t SequenceIndex, uint64_t Offset, uint64_t Size)
{
+ ZEN_TRACE_CPU("ReadFileCache::GetRange");
+
auto CacheIt = std::find_if(m_OpenFiles.begin(), m_OpenFiles.end(), [SequenceIndex](const auto& Lhs) {
return Lhs.first == SequenceIndex;
});
@@ -1065,6 +1078,8 @@ namespace {
CompositeBuffer ValidateBlob(IoBuffer&& Payload, const IoHash& BlobHash, uint64_t& OutCompressedSize, uint64_t& OutDecompressedSize)
{
+ ZEN_TRACE_CPU("ValidateBlob");
+
if (Payload.GetContentType() != ZenContentType::kCompressedBinary)
{
throw std::runtime_error(fmt::format("Blob {} ({} bytes) has unexpected content type '{}'",
@@ -3026,6 +3041,8 @@ namespace {
void VerifyFolder(const ChunkedFolderContent& Content, const std::filesystem::path& Path, bool VerifyFileHash)
{
+ ZEN_TRACE_CPU("VerifyFolder");
+
ProgressBar ProgressBar(UsePlainProgress);
std::atomic<uint64_t> FilesVerified(0);
std::atomic<uint64_t> FilesFailed(0);
@@ -3072,6 +3089,8 @@ namespace {
[&, PathIndex](std::atomic<bool>&) {
if (!AbortFlag)
{
+ ZEN_TRACE_CPU("VerifyFile_work");
+
// TODO: Convert ScheduleWork body to function
const std::filesystem::path TargetPath = (Path / Content.Paths[PathIndex]).make_preferred();
@@ -3287,6 +3306,8 @@ namespace {
uint32_t& OutChunksComplete,
uint64_t& OutBytesWritten)
{
+ ZEN_TRACE_CPU("WriteBlockToDisk");
+
std::vector<CompositeBuffer> ChunkBuffers;
struct WriteOpData
{
@@ -3377,6 +3398,8 @@ namespace {
}
if (!AbortFlag)
{
+ ZEN_TRACE_CPU("WriteBlockToDisk_VerifyHash");
+
// Write tracking, updating this must be done without any files open (WriteFileCache)
for (const WriteOpData& WriteOp : WriteOps)
{
@@ -3388,7 +3411,7 @@ namespace {
IoBufferBuilder::MakeFromFile(GetTempChunkedSequenceFileName(CacheFolderPath, SequenceRawHash)));
if (VerifyChunkHash != SequenceRawHash)
{
- throw std::runtime_error(fmt::format("Written hunk sequence {} hash does not match expected hash {}",
+ throw std::runtime_error(fmt::format("Written chunk sequence {} hash does not match expected hash {}",
VerifyChunkHash,
SequenceRawHash));
}
@@ -3407,6 +3430,8 @@ namespace {
SharedBuffer Decompress(const CompositeBuffer& CompressedChunk, const IoHash& ChunkHash, const uint64_t ChunkRawSize)
{
+ ZEN_TRACE_CPU("Decompress");
+
IoHash RawHash;
uint64_t RawSize;
CompressedBuffer Compressed = CompressedBuffer::FromCompressed(CompressedChunk, RawHash, RawSize);
@@ -3445,6 +3470,8 @@ namespace {
WriteFileCache& OpenFileCache,
uint64_t& OutBytesWritten)
{
+ ZEN_TRACE_CPU("WriteChunkToDisk");
+
for (const ChunkedContentLookup::ChunkSequenceLocation* TargetPtr : ChunkTargets)
{
const auto& Target = *TargetPtr;
@@ -3484,6 +3511,8 @@ namespace {
std::atomic<uint32_t>& ChunksComplete,
std::atomic<uint64_t>& MultipartAttachmentCount)
{
+ ZEN_TRACE_CPU("DownloadLargeBlob");
+
struct WorkloadData
{
TemporaryFile TempFile;
@@ -3539,6 +3568,8 @@ namespace {
&WriteToDiskBytes,
SequenceIndexChunksLeftToWriteCounters,
ChunkTargetPtrs](std::atomic<bool>&) {
+ ZEN_TRACE_CPU("DownloadLargeBlob_Work");
+
if (!AbortFlag)
{
uint64_t CompressedSize = Workload->TempFile.FileSize();
@@ -3590,6 +3621,8 @@ namespace {
const uint32_t RemoteSequenceIndex = Location->SequenceIndex;
if (SequenceIndexChunksLeftToWriteCounters[RemoteSequenceIndex].fetch_sub(1) == 1)
{
+ ZEN_TRACE_CPU("VerifyChunkHash");
+
const IoHash& SequenceRawHash =
RemoteContent.ChunkedContent.SequenceRawHashes[RemoteSequenceIndex];
const IoHash VerifyChunkHash = IoHash::HashBuffer(IoBufferBuilder::MakeFromFile(
@@ -3601,6 +3634,8 @@ namespace {
VerifyChunkHash,
SequenceRawHash));
}
+
+ ZEN_TRACE_CPU("VerifyChunkHashes_rename");
std::filesystem::rename(GetTempChunkedSequenceFileName(CacheFolderPath, SequenceRawHash),
GetFinalChunkedSequenceFileName(CacheFolderPath, SequenceRawHash));
}
@@ -3642,6 +3677,8 @@ namespace {
bool WipeTargetFolder,
FolderContent& OutLocalFolderState)
{
+ ZEN_TRACE_CPU("UpdateFolder");
+
ZEN_UNUSED(WipeTargetFolder);
std::atomic<uint64_t> DownloadedBlocks = 0;
std::atomic<uint64_t> BlockBytes = 0;
@@ -3791,6 +3828,8 @@ namespace {
std::atomic<uint32_t> ChunkCountWritten = 0;
{
+ ZEN_TRACE_CPU("HandleChunks");
+
FilteredRate FilteredDownloadedBytesPerSecond;
FilteredRate FilteredWrittenBytesPerSecond;
@@ -3832,6 +3871,8 @@ namespace {
Work.ScheduleWork(
NetworkPool,
[&, ChunkHash, RemoteChunkIndex, ChunkTargetPtrs](std::atomic<bool>&) {
+ ZEN_TRACE_CPU("UpdateFolder_LooseChunk");
+
if (!AbortFlag)
{
FilteredDownloadedBytesPerSecond.Start();
@@ -3877,6 +3918,8 @@ namespace {
WritePool,
[&, ChunkHash, RemoteChunkIndex, ChunkTargetPtrs, CompressedPart = std::move(Payload)](
std::atomic<bool>&) {
+ ZEN_TRACE_CPU("UpdateFolder_WriteBlob");
+
if (!AbortFlag)
{
FilteredWrittenBytesPerSecond.Start();
@@ -3907,6 +3950,8 @@ namespace {
if (SequenceIndexChunksLeftToWriteCounters[RemoteSequenceIndex].fetch_sub(
1) == 1)
{
+ ZEN_TRACE_CPU("UpdateFolder_VerifyHash");
+
const IoHash& SequenceRawHash =
RemoteContent.ChunkedContent.SequenceRawHashes[RemoteSequenceIndex];
const IoHash VerifyChunkHash =
@@ -3915,11 +3960,14 @@ namespace {
SequenceRawHash)));
if (VerifyChunkHash != SequenceRawHash)
{
- throw std::runtime_error(fmt::format(
- "Written hunk sequence {} hash does not match expected hash {}",
- VerifyChunkHash,
- SequenceRawHash));
+ throw std::runtime_error(
+ fmt::format("Written chunk sequence {} hash does not match "
+ "expected hash {}",
+ VerifyChunkHash,
+ SequenceRawHash));
}
+
+ ZEN_TRACE_CPU("UpdateFolder_rename");
std::filesystem::rename(
GetTempChunkedSequenceFileName(CacheFolderPath, SequenceRawHash),
GetFinalChunkedSequenceFileName(CacheFolderPath, SequenceRawHash));
@@ -3953,6 +4001,8 @@ namespace {
[&, CopyDataIndex](std::atomic<bool>&) {
if (!AbortFlag)
{
+ ZEN_TRACE_CPU("UpdateFolder_Copy");
+
FilteredWrittenBytesPerSecond.Start();
const CacheCopyData& CopyData = CacheCopyDatas[CopyDataIndex];
const uint32_t LocalPathIndex = LocalLookup.SequenceIndexFirstPathIndex[CopyData.LocalSequenceIndex];
@@ -4045,6 +4095,8 @@ namespace {
// Write tracking, updating this must be done without any files open (WriteFileCache)
for (const WriteOp& Op : WriteOps)
{
+ ZEN_TRACE_CPU("UpdateFolder_Copy_VerifyHash");
+
const uint32_t RemoteSequenceIndex = Op.Target->SequenceIndex;
if (SequenceIndexChunksLeftToWriteCounters[RemoteSequenceIndex].fetch_sub(1) == 1)
{
@@ -4055,10 +4107,12 @@ namespace {
if (VerifyChunkHash != SequenceRawHash)
{
throw std::runtime_error(
- fmt::format("Written hunk sequence {} hash does not match expected hash {}",
+ fmt::format("Written chunk sequence {} hash does not match expected hash {}",
VerifyChunkHash,
SequenceRawHash));
}
+
+ ZEN_TRACE_CPU("UpdateFolder_Copy_rename");
std::filesystem::rename(GetTempChunkedSequenceFileName(CacheFolderPath, SequenceRawHash),
GetFinalChunkedSequenceFileName(CacheFolderPath, SequenceRawHash));
}
@@ -4108,6 +4162,8 @@ namespace {
[&, BlockIndex](std::atomic<bool>&) {
if (!AbortFlag)
{
+ ZEN_TRACE_CPU("UpdateFolder_HandleBlocks_Read");
+
FilteredDownloadedBytesPerSecond.Start();
IoBuffer BlockBuffer = Storage.GetBuildBlob(BuildId, BlockDescriptions[BlockIndex].BlockHash);
if (!BlockBuffer)
@@ -4128,6 +4184,8 @@ namespace {
[&, BlockIndex, BlockBuffer = std::move(Payload)](std::atomic<bool>&) {
if (!AbortFlag)
{
+ ZEN_TRACE_CPU("UpdateFolder_HandleBlocks_Write");
+
FilteredWrittenBytesPerSecond.Start();
IoHash BlockRawHash;
uint64_t BlockRawSize;
@@ -4195,6 +4253,8 @@ namespace {
}
}
+ ZEN_TRACE_CPU("HandleChunks_Wait");
+
Work.Wait(UsePlainProgress ? 5000 : 200, [&](bool IsAborted, std::ptrdiff_t PendingWork) {
ZEN_UNUSED(IsAborted, PendingWork);
ZEN_ASSERT(ChunkCountToWrite >= ChunkCountWritten.load());
@@ -4258,12 +4318,16 @@ namespace {
if (WipeTargetFolder)
{
+ ZEN_TRACE_CPU("UpdateFolder_WipeTarget");
+
// Clean target folder
ZEN_CONSOLE("Wiping {}", Path);
CleanDirectory(Path, DefaultExcludeFolders);
}
else
{
+ ZEN_TRACE_CPU("UpdateFolder_RemoveUnused");
+
// Remove unused tracked files
tsl::robin_map<std::string, uint32_t> RemotePathToRemoteIndex;
RemotePathToRemoteIndex.reserve(RemoteContent.Paths.size());
@@ -4315,6 +4379,8 @@ namespace {
break;
}
+ ZEN_TRACE_CPU("UpdateFolder_FinalizeTree");
+
size_t TargetCount = 1;
const IoHash& RawHash = Targets[TargetOffset].first;
while (Targets[TargetOffset + TargetCount].first == RawHash)
@@ -4327,6 +4393,8 @@ namespace {
[&, BaseTargetOffset = TargetOffset, TargetCount](std::atomic<bool>&) {
if (!AbortFlag)
{
+ ZEN_TRACE_CPU("FinalizeTree_Work");
+
size_t TargetOffset = BaseTargetOffset;
const IoHash& RawHash = Targets[TargetOffset].first;
const uint32_t FirstTargetPathIndex = Targets[TargetOffset].second;
@@ -4348,6 +4416,8 @@ namespace {
}
else
{
+ ZEN_TRACE_CPU("FinalizeTree_MoveIntoPlace");
+
const std::filesystem::path CacheFilePath = GetFinalChunkedSequenceFileName(CacheFolderPath, RawHash);
ZEN_ASSERT_SLOW(std::filesystem::exists(CacheFilePath));
CreateDirectories(FirstTargetFilePath.parent_path());
@@ -4369,6 +4439,8 @@ namespace {
TargetsComplete++;
while (TargetOffset < (BaseTargetOffset + TargetCount))
{
+ ZEN_TRACE_CPU("FinalizeTree_Copy");
+
ZEN_ASSERT(Targets[TargetOffset].first == RawHash);
ZEN_ASSERT_SLOW(std::filesystem::exists(FirstTargetFilePath));
const uint32_t ExtraTargetPathIndex = Targets[TargetOffset].second;
@@ -4402,6 +4474,8 @@ namespace {
TargetOffset += TargetCount;
}
+ ZEN_TRACE_CPU("FinalizeTree_Wait");
+
Work.Wait(UsePlainProgress ? 5000 : 200, [&](bool IsAborted, std::ptrdiff_t PendingWork) {
ZEN_UNUSED(IsAborted, PendingWork);
std::string Details = fmt::format("{}/{} files", TargetsComplete.load(), Targets.size());
@@ -4515,6 +4589,8 @@ namespace {
std::vector<ChunkBlockDescription>& OutBlockDescriptions,
std::vector<IoHash>& OutLooseChunkHashes)
{
+ ZEN_TRACE_CPU("GetRemoteContent");
+
Stopwatch GetBuildPartTimer;
CbObject BuildPartManifest = Storage.GetBuildPart(BuildId, BuildParts[0].first);
ZEN_CONSOLE("GetBuildPart {} ('{}') took {}. Payload size: {}",
@@ -4961,6 +5037,8 @@ namespace {
bool WipeTargetFolder,
bool PostDownloadVerify)
{
+ ZEN_TRACE_CPU("DownloadFolder");
+
Stopwatch DownloadTimer;
const std::filesystem::path ZenTempFolder = Path / ZenTempFolderName;
diff --git a/src/zenutil/chunkedcontent.cpp b/src/zenutil/chunkedcontent.cpp
index 1552ea823..4ca89d996 100644
--- a/src/zenutil/chunkedcontent.cpp
+++ b/src/zenutil/chunkedcontent.cpp
@@ -7,6 +7,7 @@
#include <zencore/logging.h>
#include <zencore/scopeguard.h>
#include <zencore/timer.h>
+#include <zencore/trace.h>
#include <zenutil/chunkedfile.h>
#include <zenutil/chunkingcontroller.h>
@@ -23,13 +24,13 @@ namespace zen {
using namespace std::literals;
namespace {
- void AddCunkSequence(ChunkingStatistics& Stats,
- ChunkedContentData& InOutChunkedContent,
- tsl::robin_map<IoHash, uint32_t, IoHash::Hasher>& ChunkHashToChunkIndex,
- const IoHash& RawHash,
- std::span<const uint32_t> ChunkSequence,
- std::span<const IoHash> ChunkHashes,
- std::span<const uint64_t> ChunkRawSizes)
+ void AddChunkSequence(ChunkingStatistics& Stats,
+ ChunkedContentData& InOutChunkedContent,
+ tsl::robin_map<IoHash, uint32_t, IoHash::Hasher>& ChunkHashToChunkIndex,
+ const IoHash& RawHash,
+ std::span<const uint32_t> ChunkSequence,
+ std::span<const IoHash> ChunkHashes,
+ std::span<const uint64_t> ChunkRawSizes)
{
ZEN_ASSERT(ChunkHashes.size() == ChunkRawSizes.size());
InOutChunkedContent.ChunkCounts.push_back(gsl::narrow<uint32_t>(ChunkSequence.size()));
@@ -58,11 +59,11 @@ namespace {
Stats.UniqueSequencesFound++;
}
- void AddCunkSequence(ChunkingStatistics& Stats,
- ChunkedContentData& InOutChunkedContent,
- tsl::robin_map<IoHash, uint32_t, IoHash::Hasher>& ChunkHashToChunkIndex,
- const IoHash& RawHash,
- const uint64_t RawSize)
+ void AddChunkSequence(ChunkingStatistics& Stats,
+ ChunkedContentData& InOutChunkedContent,
+ tsl::robin_map<IoHash, uint32_t, IoHash::Hasher>& ChunkHashToChunkIndex,
+ const IoHash& RawHash,
+ const uint64_t RawSize)
{
InOutChunkedContent.ChunkCounts.push_back(1);
@@ -120,13 +121,13 @@ namespace {
{
ChunkSizes.push_back(Source.Size);
}
- AddCunkSequence(Stats,
- OutChunkedContent.ChunkedContent,
- ChunkHashToChunkIndex,
- Chunked.Info.RawHash,
- Chunked.Info.ChunkSequence,
- Chunked.Info.ChunkHashes,
- ChunkSizes);
+ AddChunkSequence(Stats,
+ OutChunkedContent.ChunkedContent,
+ ChunkHashToChunkIndex,
+ Chunked.Info.RawHash,
+ Chunked.Info.ChunkSequence,
+ Chunked.Info.ChunkHashes,
+ ChunkSizes);
Stats.UniqueSequencesFound++;
}
});
@@ -143,7 +144,7 @@ namespace {
{
RawHashToSequenceRawHashIndex.insert(
{Hash, gsl::narrow<uint32_t>(OutChunkedContent.ChunkedContent.SequenceRawHashes.size())});
- AddCunkSequence(Stats, OutChunkedContent.ChunkedContent, ChunkHashToChunkIndex, Hash, RawSize);
+ AddChunkSequence(Stats, OutChunkedContent.ChunkedContent, ChunkHashToChunkIndex, Hash, RawSize);
Stats.UniqueSequencesFound++;
}
});
@@ -360,6 +361,8 @@ GetFolderContent(GetFolderContentStatistics& Stats,
std::function<void(bool IsAborted, std::ptrdiff_t PendingWork)>&& UpdateCallback,
std::atomic<bool>& AbortFlag)
{
+ ZEN_TRACE_CPU("GetFolderContent");
+
Stopwatch Timer;
auto _ = MakeGuard([&Stats, &Timer]() { Stats.ElapsedWallTimeUS = Timer.GetElapsedTimeUs(); });
@@ -528,6 +531,8 @@ LoadChunkedFolderContentToCompactBinary(CbObjectView Input)
ChunkedFolderContent
MergeChunkedFolderContents(const ChunkedFolderContent& Base, std::span<const ChunkedFolderContent> Overlays)
{
+ ZEN_TRACE_CPU("MergeChunkedFolderContents");
+
ZEN_ASSERT(!Overlays.empty());
ChunkedFolderContent Result;
@@ -605,13 +610,13 @@ MergeChunkedFolderContents(const ChunkedFolderContent& Base, std::span<const Chu
ChunkingStatistics Stats;
std::span<const uint32_t> OriginalChunkOrder =
std::span<const uint32_t>(OverlayContent.ChunkedContent.ChunkOrders).subspan(OrderIndexOffset, ChunkCount);
- AddCunkSequence(Stats,
- Result.ChunkedContent,
- ChunkHashToChunkIndex,
- RawHash,
- OriginalChunkOrder,
- OverlayContent.ChunkedContent.ChunkHashes,
- OverlayContent.ChunkedContent.ChunkRawSizes);
+ AddChunkSequence(Stats,
+ Result.ChunkedContent,
+ ChunkHashToChunkIndex,
+ RawHash,
+ OriginalChunkOrder,
+ OverlayContent.ChunkedContent.ChunkHashes,
+ OverlayContent.ChunkedContent.ChunkRawSizes);
Stats.UniqueSequencesFound++;
}
}
@@ -636,6 +641,8 @@ MergeChunkedFolderContents(const ChunkedFolderContent& Base, std::span<const Chu
ChunkedFolderContent
DeletePathsFromChunkedContent(const ChunkedFolderContent& BaseContent, std::span<const std::filesystem::path> DeletedPaths)
{
+ ZEN_TRACE_CPU("DeletePathsFromChunkedContent");
+
ZEN_ASSERT(DeletedPaths.size() <= BaseContent.Paths.size());
ChunkedFolderContent Result = {.Platform = BaseContent.Platform};
if (DeletedPaths.size() < BaseContent.Paths.size())
@@ -673,13 +680,13 @@ DeletePathsFromChunkedContent(const ChunkedFolderContent& BaseContent, std::span
ChunkingStatistics Stats;
std::span<const uint32_t> OriginalChunkOrder =
std::span<const uint32_t>(BaseContent.ChunkedContent.ChunkOrders).subspan(OrderIndexOffset, ChunkCount);
- AddCunkSequence(Stats,
- Result.ChunkedContent,
- ChunkHashToChunkIndex,
- RawHash,
- OriginalChunkOrder,
- BaseContent.ChunkedContent.ChunkHashes,
- BaseContent.ChunkedContent.ChunkRawSizes);
+ AddChunkSequence(Stats,
+ Result.ChunkedContent,
+ ChunkHashToChunkIndex,
+ RawHash,
+ OriginalChunkOrder,
+ BaseContent.ChunkedContent.ChunkHashes,
+ BaseContent.ChunkedContent.ChunkRawSizes);
Stats.UniqueSequencesFound++;
}
}
@@ -699,6 +706,8 @@ ChunkFolderContent(ChunkingStatistics& Stats,
std::function<void(bool IsAborted, std::ptrdiff_t PendingWork)>&& UpdateCallback,
std::atomic<bool>& AbortFlag)
{
+ ZEN_TRACE_CPU("ChunkFolderContent");
+
Stopwatch Timer;
auto _ = MakeGuard([&Stats, &Timer]() { Stats.ElapsedWallTimeUS = Timer.GetElapsedTimeUs(); });
@@ -775,6 +784,8 @@ ChunkFolderContent(ChunkingStatistics& Stats,
ChunkedContentLookup
BuildChunkedContentLookup(const ChunkedFolderContent& Content)
{
+ ZEN_TRACE_CPU("BuildChunkedContentLookup");
+
struct ChunkLocationReference
{
uint32_t ChunkIndex;
diff --git a/src/zenutil/jupiter/jupiterbuildstorage.cpp b/src/zenutil/jupiter/jupiterbuildstorage.cpp
index 481e9146f..309885b05 100644
--- a/src/zenutil/jupiter/jupiterbuildstorage.cpp
+++ b/src/zenutil/jupiter/jupiterbuildstorage.cpp
@@ -6,6 +6,7 @@
#include <zencore/fmtutils.h>
#include <zencore/scopeguard.h>
#include <zencore/timer.h>
+#include <zencore/trace.h>
#include <zenutil/jupiter/jupitersession.h>
ZEN_THIRD_PARTY_INCLUDES_START
@@ -36,6 +37,8 @@ public:
virtual CbObject ListBuilds(CbObject Query) override
{
+ ZEN_TRACE_CPU("Jupiter::ListBuilds");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
IoBuffer Payload = Query.GetBuffer().AsIoBuffer();
@@ -51,6 +54,8 @@ public:
virtual CbObject PutBuild(const Oid& BuildId, const CbObject& MetaData) override
{
+ ZEN_TRACE_CPU("Jupiter::PutBuild");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
IoBuffer Payload = MetaData.GetBuffer().AsIoBuffer();
@@ -66,6 +71,8 @@ public:
virtual CbObject GetBuild(const Oid& BuildId) override
{
+ ZEN_TRACE_CPU("Jupiter::GetBuild");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
JupiterResult GetBuildResult = m_Session.GetBuild(m_Namespace, m_Bucket, BuildId);
@@ -79,6 +86,8 @@ public:
virtual void FinalizeBuild(const Oid& BuildId) override
{
+ ZEN_TRACE_CPU("Jupiter::FinalizeBuild");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
JupiterResult FinalizeBuildResult = m_Session.FinalizeBuild(m_Namespace, m_Bucket, BuildId);
@@ -95,6 +104,8 @@ public:
std::string_view PartName,
const CbObject& MetaData) override
{
+ ZEN_TRACE_CPU("Jupiter::PutBuildPart");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
IoBuffer Payload = MetaData.GetBuffer().AsIoBuffer();
@@ -110,6 +121,8 @@ public:
virtual CbObject GetBuildPart(const Oid& BuildId, const Oid& BuildPartId) override
{
+ ZEN_TRACE_CPU("Jupiter::GetBuildPart");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
JupiterResult GetBuildPartResult = m_Session.GetBuildPart(m_Namespace, m_Bucket, BuildId, BuildPartId);
@@ -126,6 +139,8 @@ public:
virtual std::vector<IoHash> FinalizeBuildPart(const Oid& BuildId, const Oid& BuildPartId, const IoHash& PartHash) override
{
+ ZEN_TRACE_CPU("Jupiter::FinalizeBuildPart");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
FinalizeBuildPartResult FinalizePartResult = m_Session.FinalizeBuildPart(m_Namespace, m_Bucket, BuildId, BuildPartId, PartHash);
@@ -143,6 +158,8 @@ public:
ZenContentType ContentType,
const CompositeBuffer& Payload) override
{
+ ZEN_TRACE_CPU("Jupiter::PutBuildBlob");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
JupiterResult PutBlobResult = m_Session.PutBuildBlob(m_Namespace, m_Bucket, BuildId, RawHash, ContentType, Payload);
@@ -160,6 +177,8 @@ public:
std::function<IoBuffer(uint64_t Offset, uint64_t Size)>&& Transmitter,
std::function<void(uint64_t, bool)>&& OnSentBytes) override
{
+ ZEN_TRACE_CPU("Jupiter::PutLargeBuildBlob");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
std::vector<std::function<JupiterResult(bool&)>> WorkItems;
@@ -200,6 +219,8 @@ public:
virtual IoBuffer GetBuildBlob(const Oid& BuildId, const IoHash& RawHash) override
{
+ ZEN_TRACE_CPU("Jupiter::GetBuildBlob");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
JupiterResult GetBuildBlobResult = m_Session.GetBuildBlob(m_Namespace, m_Bucket, BuildId, RawHash, m_TempFolderPath);
@@ -218,6 +239,8 @@ public:
uint64_t ChunkSize,
std::function<void(uint64_t Offset, const IoBuffer& Chunk, uint64_t BytesRemaining)>&& Receiver) override
{
+ ZEN_TRACE_CPU("Jupiter::GetLargeBuildBlob");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
std::vector<std::function<JupiterResult()>> WorkItems;
@@ -249,6 +272,8 @@ public:
virtual void PutBlockMetadata(const Oid& BuildId, const IoHash& BlockRawHash, const CbObject& MetaData) override
{
+ ZEN_TRACE_CPU("Jupiter::PutBlockMetadata");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
IoBuffer Payload = MetaData.GetBuffer().AsIoBuffer();
@@ -264,6 +289,8 @@ public:
virtual std::vector<ChunkBlockDescription> FindBlocks(const Oid& BuildId) override
{
+ ZEN_TRACE_CPU("Jupiter::FindBlocks");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
JupiterResult FindResult = m_Session.FindBlocks(m_Namespace, m_Bucket, BuildId);
@@ -277,6 +304,8 @@ public:
virtual std::vector<ChunkBlockDescription> GetBlockMetadata(const Oid& BuildId, std::span<const IoHash> BlockHashes) override
{
+ ZEN_TRACE_CPU("Jupiter::GetBlockMetadata");
+
Stopwatch ExecutionTimer;
auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
CbObjectWriter Request;
@@ -365,6 +394,8 @@ CreateJupiterBuildStorage(LoggerRef InLog,
std::string_view Bucket,
const std::filesystem::path& TempFolderPath)
{
+ ZEN_TRACE_CPU("CreateJupiterBuildStorage");
+
return std::make_unique<JupiterBuildStorage>(InLog, InHttpClient, Stats, Namespace, Bucket, TempFolderPath);
}