diff options
| author | Dan Engelbrecht <[email protected]> | 2023-08-21 13:07:22 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-08-21 13:07:22 +0200 |
| commit | ca5b35dcbde3e2da484572c821c4899763b0e0f0 (patch) | |
| tree | 2d6d7a15f6c7900cf7f3c0fe4510086e4fa572a4 /src/zenserver | |
| parent | oplog mirror support (#367) (diff) | |
| download | zen-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.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))); } } |