From c7c59cdc5a70bfd6e5f66f3b032ea3f8f6b4d12a Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Mon, 20 Apr 2026 07:27:35 +0200 Subject: builds cmd refactor (#975) - Bugfix: `builds download` partial-block fetch decisions now account for build storage host latency - Bugfix: Transfer rate displays in `builds` commands now smooth correctly - Split `buildstorageoperations.cpp` (8.5k lines) into per-operation TUs: buildinspect, buildprimecache, buildstorageresolve, buildupdatefolder, builduploadfolder, buildvalidatebuildpart; stats moved to buildstoragestats.h. - FilteredRate extracted to zenutil. - BuildsCommand shared state consolidated into a BuildsConfiguration struct; subcommands inherit from BuildsSubCmdBase holding a `const BuildsConfiguration&` instead of a `BuildsCommand&`. - `ProgressBar` renamed to `ConsoleProgressBar`; mode enum (`ConsoleProgressMode`) lifted to namespace scope; `PushLogOperation`/`PopLogOperation`/`ForceLinebreak` promoted to virtuals on `ProgressBase`. - Free-function wrappers (`UploadFolder`, `DownloadFolder`, `ValidateBuildPart`) added around the existing operation classes so callers stop reimplementing setup + stats logging. --- src/zenutil/include/zenutil/filteredrate.h | 37 ++++++++++++++++++++++++++++++ src/zenutil/include/zenutil/progress.h | 3 +++ 2 files changed, 40 insertions(+) create mode 100644 src/zenutil/include/zenutil/filteredrate.h (limited to 'src/zenutil/include') diff --git a/src/zenutil/include/zenutil/filteredrate.h b/src/zenutil/include/zenutil/filteredrate.h new file mode 100644 index 000000000..3349823d0 --- /dev/null +++ b/src/zenutil/include/zenutil/filteredrate.h @@ -0,0 +1,37 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include + +#include +#include + +namespace zen { + +class FilteredRate +{ +public: + FilteredRate() {} + + void Start(); + void Stop(); + void Update(uint64_t Count); + + uint64_t GetCurrent() const; + uint64_t GetElapsedTimeUS() const; + bool IsActive() const; + +private: + Stopwatch Timer; + std::atomic StartTimeUS = (uint64_t)-1; + std::atomic EndTimeUS = (uint64_t)-1; + std::atomic LastTimeUS = (uint64_t)-1; + uint64_t LastCount = 0; + uint64_t LastPerSecond = 0; + uint64_t FilteredPerSecond = 0; +}; + +uint64_t GetBytesPerSecond(uint64_t ElapsedWallTimeUS, uint64_t Count); + +} // namespace zen diff --git a/src/zenutil/include/zenutil/progress.h b/src/zenutil/include/zenutil/progress.h index 6a137ae9c..4103723b3 100644 --- a/src/zenutil/include/zenutil/progress.h +++ b/src/zenutil/include/zenutil/progress.h @@ -16,6 +16,8 @@ public: virtual void SetLogOperationName(std::string_view Name) = 0; virtual void SetLogOperationProgress(uint32_t StepIndex, uint32_t StepCount) = 0; + virtual void PushLogOperation(std::string_view Name) = 0; + virtual void PopLogOperation() = 0; virtual uint32_t GetProgressUpdateDelayMS() const = 0; class ProgressBar @@ -54,6 +56,7 @@ public: virtual ~ProgressBar() = default; virtual void UpdateState(const State& NewState, bool DoLinebreak) = 0; + virtual void ForceLinebreak() = 0; virtual void Finish() = 0; }; -- cgit v1.2.3