aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil/cache
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2023-12-14 13:09:22 +0100
committerGitHub <[email protected]>2023-12-14 13:09:22 +0100
commitff0e3b4fbef6a981a74a3d3e75b80ce208714dc3 (patch)
tree565bf05898eccd74c8381d79d902c29ba72abe41 /src/zenutil/cache
parent0.2.37 (diff)
downloadzen-ff0e3b4fbef6a981a74a3d3e75b80ce208714dc3.tar.xz
zen-ff0e3b4fbef6a981a74a3d3e75b80ce208714dc3.zip
implement cache recording segment split by age (#611)
- also fixes weird DateTime/TimeSpan comparison operator
Diffstat (limited to 'src/zenutil/cache')
-rw-r--r--src/zenutil/cache/rpcrecording.cpp39
1 files changed, 27 insertions, 12 deletions
diff --git a/src/zenutil/cache/rpcrecording.cpp b/src/zenutil/cache/rpcrecording.cpp
index 054ac0e56..00cecb8f7 100644
--- a/src/zenutil/cache/rpcrecording.cpp
+++ b/src/zenutil/cache/rpcrecording.cpp
@@ -2,6 +2,7 @@
#include <zencore/compactbinarybuilder.h>
#include <zencore/filesystem.h>
+#include <zencore/fmtutils.h>
#include <zencore/logging.h>
#include <zencore/system.h>
#include <zenutil/basicfile.h>
@@ -264,7 +265,7 @@ struct RecordedRequest
static_assert(sizeof(RecordedRequest) == 24);
const uint64_t RecordedRequestBlockSize = 1 * 1024 * 1024 * 1024; // 1GiB
-const uint64_t StandaloneFileSizeThreshold = 1 * 1024 * 1024ull; // 1MiB
+const uint64_t StandaloneFileSizeThreshold = 16 * 1024 * 1024ull; // 16MiB
const uint64_t SegmentRequestCount = 10 * 1000 * 1000;
const uint64_t LooseFileThreshold = 5000; // Somewhat arbitrary, but we try to keep the
// number of files in a directory below this level
@@ -321,6 +322,7 @@ struct RecordedRequestsWriter
RecordedRequestsSegmentWriter& EnsureCurrentSegment();
void CommitCurrentSegment(RwLock::ExclusiveLockScope&);
void EndWrite();
+ void WriteRecordingMetadata();
uint64_t WriteRequest(const RecordedRequestInfo& RequestInfo, const IoBuffer& RequestBuffer);
private:
@@ -547,6 +549,7 @@ RecordedRequestsSegmentReader::BeginRead(const std::filesystem::path& BasePath,
}
return m_Entries.size();
}
+
void
RecordedRequestsSegmentReader::EndRead()
{
@@ -600,6 +603,8 @@ RecordedRequestsWriter::EnsureCurrentSegment()
{
bool StartNewSegment = false;
+ TimeSpan SegmentAge(DateTime::NowTicks() - m_CurrentWriter->GetStartTime().GetTicks());
+
if (m_CurrentWriter->GetRequestCount() >= SegmentRequestCount)
{
ZEN_DEBUG("starting new RPC recording segment due to request count >= {}", SegmentRequestCount);
@@ -615,6 +620,12 @@ RecordedRequestsWriter::EnsureCurrentSegment()
ZEN_DEBUG("starting new RPC recording segment due to footprint >= {} bytes", SegmentByteThreshold);
StartNewSegment = true;
}
+ else if (SegmentAge >= SegmentTimeThreshold)
+ {
+ ZEN_DEBUG("starting new RPC recording segment due to age >= {}",
+ NiceTimeSpanMs(SegmentTimeThreshold.GetTicks() / TimeSpan::TicksPerMillisecond));
+ StartNewSegment = true;
+ }
if (StartNewSegment)
{
@@ -654,8 +665,22 @@ RecordedRequestsWriter::EndWrite()
CommitCurrentSegment(_);
- // Emit some metadata alongside the recording
+ WriteRecordingMetadata();
+}
+uint64_t
+RecordedRequestsWriter::WriteRequest(const RecordedRequestInfo& RequestInfo, const IoBuffer& RequestBuffer)
+{
+ RecordedRequestsSegmentWriter& Writer = EnsureCurrentSegment();
+
+ const uint64_t SegmentLocalIndex = Writer.WriteRequest(RequestInfo, RequestBuffer);
+
+ return Writer.GetBaseRequestIndex() + SegmentLocalIndex;
+}
+
+void
+RecordedRequestsWriter::WriteRecordingMetadata()
+{
try
{
DateTime EndTime = DateTime::Now();
@@ -702,16 +727,6 @@ RecordedRequestsWriter::EndWrite()
}
}
-uint64_t
-RecordedRequestsWriter::WriteRequest(const RecordedRequestInfo& RequestInfo, const IoBuffer& RequestBuffer)
-{
- RecordedRequestsSegmentWriter& Writer = EnsureCurrentSegment();
-
- const uint64_t SegmentLocalIndex = Writer.WriteRequest(RequestInfo, RequestBuffer);
-
- return Writer.GetBaseRequestIndex() + SegmentLocalIndex;
-}
-
//////////////////////////////////////////////////////////////////////////
uint64_t