aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil/cache
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2025-06-27 14:57:14 +0200
committerStefan Boberg <[email protected]>2025-06-27 14:57:14 +0200
commitd5d44045e969edade3c2c3d2fa1b115ac9f03b21 (patch)
tree5d08cf26cbd0a9056d064a339539a2749fdf84fc /src/zenutil/cache
parentminor: output schema sketch (diff)
downloadzen-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.cpp41
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;