aboutsummaryrefslogtreecommitdiff
path: root/zenserver/projectstore.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-01-26 01:17:22 -0800
committerGitHub <[email protected]>2023-01-26 01:17:22 -0800
commit049991ce460fe65be29ccc3b6bf7bf77a5f225f1 (patch)
tree75f7b9dcdc6f0e72ddaae48708038b8eaf65f5b5 /zenserver/projectstore.cpp
parentBetter error responses/logging in project store request (#217) (diff)
downloadzen-049991ce460fe65be29ccc3b6bf7bf77a5f225f1.tar.xz
zen-049991ce460fe65be29ccc3b6bf7bf77a5f225f1.zip
Retain memory buffer when replaying oplog (#216)
* Retain memory buffer when replaying oplog * changelog
Diffstat (limited to 'zenserver/projectstore.cpp')
-rw-r--r--zenserver/projectstore.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/zenserver/projectstore.cpp b/zenserver/projectstore.cpp
index 1885a6b1c..216a8cbf6 100644
--- a/zenserver/projectstore.cpp
+++ b/zenserver/projectstore.cpp
@@ -152,6 +152,7 @@ struct ProjectStore::OplogStorage : public RefCounted
uint64_t InvalidEntries = 0;
+ IoBuffer OpBuffer;
m_Oplog.Replay(
[&](const OplogEntry& LogEntry) {
if (LogEntry.OpCoreSize == 0)
@@ -161,14 +162,17 @@ struct ProjectStore::OplogStorage : public RefCounted
return;
}
- IoBuffer OpBuffer(LogEntry.OpCoreSize);
+ if (OpBuffer.GetSize() < LogEntry.OpCoreSize)
+ {
+ OpBuffer = IoBuffer(LogEntry.OpCoreSize);
+ }
const uint64_t OpFileOffset = LogEntry.OpCoreOffset * m_OpsAlign;
m_OpBlobs.Read((void*)OpBuffer.Data(), LogEntry.OpCoreSize, OpFileOffset);
// Verify checksum, ignore op data if incorrect
- const auto OpCoreHash = uint32_t(XXH3_64bits(OpBuffer.Data(), OpBuffer.Size()) & 0xffffFFFF);
+ const auto OpCoreHash = uint32_t(XXH3_64bits(OpBuffer.Data(), LogEntry.OpCoreSize) & 0xffffFFFF);
if (OpCoreHash != LogEntry.OpCoreHash)
{
@@ -176,7 +180,7 @@ struct ProjectStore::OplogStorage : public RefCounted
return;
}
- CbObject Op(SharedBuffer::MakeView(OpBuffer.Data(), OpBuffer.Size()));
+ CbObject Op(SharedBuffer::MakeView(OpBuffer.Data(), LogEntry.OpCoreSize));
m_NextOpsOffset =
Max(m_NextOpsOffset.load(std::memory_order_relaxed), RoundUp(OpFileOffset + LogEntry.OpCoreSize, m_OpsAlign));