diff options
Diffstat (limited to 'src/zenserver/projectstore/projectstore.cpp')
| -rw-r--r-- | src/zenserver/projectstore/projectstore.cpp | 21 |
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))); } } |