diff options
| author | Stefan Boberg <[email protected]> | 2025-06-27 14:57:14 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2025-06-27 14:57:14 +0200 |
| commit | d5d44045e969edade3c2c3d2fa1b115ac9f03b21 (patch) | |
| tree | 5d08cf26cbd0a9056d064a339539a2749fdf84fc /src/zenutil/cache | |
| parent | minor: output schema sketch (diff) | |
| download | zen-d5d44045e969edade3c2c3d2fa1b115ac9f03b21.tar.xz zen-d5d44045e969edade3c2c3d2fa1b115ac9f03b21.zip | |
fleshed out RPC recording analysis command, now parses every request
Diffstat (limited to 'src/zenutil/cache')
| -rw-r--r-- | src/zenutil/cache/rpcrecording.cpp | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/src/zenutil/cache/rpcrecording.cpp b/src/zenutil/cache/rpcrecording.cpp index f7a733597..0c788ddf3 100644 --- a/src/zenutil/cache/rpcrecording.cpp +++ b/src/zenutil/cache/rpcrecording.cpp @@ -201,12 +201,13 @@ private: struct SegmentInfo { - uint64_t SegmentIndex; - uint64_t BaseRequestIndex; - uint64_t RequestCount; - uint64_t RequestBytes; - DateTime StartTime{0}; - DateTime EndTime{0}; + uint64_t SegmentIndex; + uint64_t BaseRequestIndex; + uint64_t RequestCount; + uint64_t RequestBytes; + DateTime StartTime{0}; + DateTime EndTime{0}; + std::filesystem::path BasePath; }; bool m_InMemory = false; @@ -787,7 +788,8 @@ RecordedRequestsReader::BeginRead(const std::filesystem::path& BasePath, bool In .RequestCount = Segment["entry_count"sv].AsUInt64(), .RequestBytes = 0, .StartTime = Segment["time_start"sv].AsDateTime(), - .EndTime = Segment["time_end"sv].AsDateTime()}); + .EndTime = Segment["time_end"sv].AsDateTime(), + .BasePath = ZcbPath.parent_path()}); TotalRequestCount += Info.RequestCount; MaxSegmentIndex = Max(MaxSegmentIndex, Info.SegmentIndex); @@ -833,11 +835,11 @@ RecordedRequestsReader::EndRead() RecordedRequestInfo RecordedRequestsReader::ReadRequest(uint64_t RequestIndex, IoBuffer& OutBuffer) const { - auto EnsureSegment = [&](uint64_t SegmentIndex) -> const RecordedRequestsSegmentReader& { + auto EnsureSegment = [&](const SegmentInfo& Segment) -> const RecordedRequestsSegmentReader& { { RwLock::SharedLockScope _(m_SegmentLock); - if (auto SegmentReaderPtr = m_SegmentReaders[SegmentIndex].get()) + if (auto SegmentReaderPtr = m_SegmentReaders[Segment.SegmentIndex].get()) { return *SegmentReaderPtr; } @@ -845,12 +847,12 @@ RecordedRequestsReader::ReadRequest(uint64_t RequestIndex, IoBuffer& OutBuffer) RwLock::ExclusiveLockScope _(m_SegmentLock); - auto& SegmentReaderPtr = m_SegmentReaders[SegmentIndex]; + auto& SegmentReaderPtr = m_SegmentReaders[Segment.SegmentIndex]; if (!SegmentReaderPtr) { RecordedRequestsSegmentReader* NewSegment = new RecordedRequestsSegmentReader; - NewSegment->BeginRead(m_BasePath / MakeSegmentPath(SegmentIndex), m_InMemory); + NewSegment->BeginRead(Segment.BasePath, m_InMemory); SegmentReaderPtr.reset(NewSegment); } @@ -859,11 +861,11 @@ RecordedRequestsReader::ReadRequest(uint64_t RequestIndex, IoBuffer& OutBuffer) // This is pretty slow for large replays, should have an index lookup for this instead - for (auto& Segment : m_KnownSegments) + for (const SegmentInfo& Segment : m_KnownSegments) { if (Segment.RequestCount > RequestIndex) { - return EnsureSegment(Segment.SegmentIndex).ReadRequest(RequestIndex, OutBuffer); + return EnsureSegment(Segment).ReadRequest(RequestIndex, OutBuffer); } else { @@ -899,6 +901,19 @@ public: virtual uint64_t GetRequestCount() const override { return m_RequestCount; } + virtual void IterateRange(uint64_t RequestIndex, + uint64_t EndRequestIndex, + std::function<void(const RecordedRequestInfo& Info, const IoBuffer& RequestBuffer)>&& Func) override + { + while (RequestIndex < EndRequestIndex) + { + IoBuffer Buffer; + RecordedRequestInfo Info = m_RequestReader.ReadRequest(RequestIndex, /* out */ Buffer); + Func(Info, Buffer); + ++RequestIndex; + }; + } + private: std::uint64_t m_RequestCount; RecordedRequestsReader m_RequestReader; |