aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-08-21 13:07:22 +0200
committerGitHub <[email protected]>2023-08-21 13:07:22 +0200
commitca5b35dcbde3e2da484572c821c4899763b0e0f0 (patch)
tree2d6d7a15f6c7900cf7f3c0fe4510086e4fa572a4 /src/zenserver
parentoplog mirror support (#367) (diff)
downloadzen-ca5b35dcbde3e2da484572c821c4899763b0e0f0.tar.xz
zen-ca5b35dcbde3e2da484572c821c4899763b0e0f0.zip
buffered file reading for oplog (#366)
* add BasicFileBuffer for buffered read of BasicFile * Use BasicFileBuffer when reading oplog * changelog
Diffstat (limited to 'src/zenserver')
-rw-r--r--src/zenserver/projectstore/projectstore.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp
index d20466161..421a6486f 100644
--- a/src/zenserver/projectstore/projectstore.cpp
+++ b/src/zenserver/projectstore/projectstore.cpp
@@ -272,7 +272,9 @@ struct ProjectStore::OplogStorage : public RefCounted
uint64_t InvalidEntries = 0;
- IoBuffer OpBuffer;
+ BasicFileBuffer OpBlobsBuffer(m_OpBlobs, 65536);
+ IoBuffer OpBuffer(512);
+
m_Oplog.Replay(
[&](const OplogEntry& LogEntry) {
if (LogEntry.OpCoreSize == 0)
@@ -288,8 +290,7 @@ struct ProjectStore::OplogStorage : public RefCounted
}
const uint64_t OpFileOffset = LogEntry.OpCoreOffset * m_OpsAlign;
-
- m_OpBlobs.Read((void*)OpBuffer.Data(), LogEntry.OpCoreSize, OpFileOffset);
+ OpBlobsBuffer.Read((void*)OpBuffer.Data(), LogEntry.OpCoreSize, OpFileOffset);
// Verify checksum, ignore op data if incorrect
const auto OpCoreHash = uint32_t(XXH3_64bits(OpBuffer.Data(), LogEntry.OpCoreSize) & 0xffffFFFF);
@@ -323,10 +324,20 @@ struct ProjectStore::OplogStorage : public RefCounted
void ReplayLog(const std::span<OplogEntryAddress> Entries, std::function<void(CbObject)>&& Handler)
{
+ ZEN_TRACE_CPU("Store::OplogStorage::ReplayLog");
+
+ BasicFileBuffer OpBlobsBuffer(m_OpBlobs, 65536);
+ IoBuffer OpBuffer(512);
+
for (const OplogEntryAddress& Entry : Entries)
{
- CbObject Op = GetOp(Entry);
- Handler(Op);
+ const uint64_t OpFileOffset = Entry.Offset * m_OpsAlign;
+ if (OpBuffer.Size() < Entry.Size)
+ {
+ OpBuffer = IoBuffer(Entry.Size);
+ }
+ OpBlobsBuffer.Read((void*)OpBuffer.Data(), Entry.Size, OpFileOffset);
+ Handler(CbObject(SharedBuffer(OpBuffer)));
}
}