diff options
| author | Dan Engelbrecht <[email protected]> | 2022-04-01 08:41:51 +0200 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2022-04-01 09:07:21 +0200 |
| commit | ac573e90a5698c64451a99beb1a14d00540aa835 (patch) | |
| tree | f246b21daef1b8ce99abe275cbda96a481531467 | |
| parent | call Initialize before replay on caslog (diff) | |
| download | zen-ac573e90a5698c64451a99beb1a14d00540aa835.tar.xz zen-ac573e90a5698c64451a99beb1a14d00540aa835.zip | |
reserve space for log entries before replay
| -rw-r--r-- | zenstore/caslog.cpp | 13 | ||||
| -rw-r--r-- | zenstore/compactcas.cpp | 5 | ||||
| -rw-r--r-- | zenstore/include/zenstore/caslog.h | 1 |
3 files changed, 19 insertions, 0 deletions
diff --git a/zenstore/caslog.cpp b/zenstore/caslog.cpp index 906c97348..3737e9f45 100644 --- a/zenstore/caslog.cpp +++ b/zenstore/caslog.cpp @@ -120,6 +120,19 @@ CasLogFile::GetLogSize() return m_File.FileSize(); } +uint64_t +CasLogFile::GetLogCount() +{ + uint64_t LogFileSize = m_File.FileSize(); + if (LogFileSize < sizeof(FileHeader)) + { + return 0; + } + const uint64_t LogBaseOffset = sizeof(FileHeader); + const size_t LogEntryCount = (LogFileSize - LogBaseOffset) / m_RecordSize; + return LogEntryCount; +} + void CasLogFile::Replay(std::function<void(const void*)>&& Handler) { diff --git a/zenstore/compactcas.cpp b/zenstore/compactcas.cpp index 1dd1a3906..1ade002d8 100644 --- a/zenstore/compactcas.cpp +++ b/zenstore/compactcas.cpp @@ -282,6 +282,7 @@ namespace { CasLog.Open(SlogPath, CasLogFile::EMode::kRead); if (CasLog.Initialize()) { + Entries.reserve(CasLog.GetLogCount()); CasLog.Replay([&](const CasDiskIndexEntry& Record) { Entries.push_back(Record); }); } } @@ -359,6 +360,7 @@ namespace { }); if (LegacyCasLog.Initialize()) { + LegacyDiskIndex.reserve(LegacyCasLog.GetLogCount()); LegacyCasLog.Replay([&](const LegacyCasDiskIndexEntry& Record) { std::string InvalidEntryReason; if (Record.Flags & LegacyCasDiskIndexEntry::kTombstone) @@ -1410,9 +1412,11 @@ CasContainerStrategy::MakeIndexSnapshot() { TCasLogFile<CasDiskIndexEntry> OldCasLog; OldCasLog.Open(STmplogPath, CasLogFile::EMode::kRead); + Records.reserve(OldCasLog.GetLogCount()); OldCasLog.Replay([&](const CasDiskIndexEntry& Record) { Records.push_back(Record); }); } { + Records.reserve(Records.size() + m_CasLog.GetLogCount()); m_CasLog.Replay([&](const CasDiskIndexEntry& Record) { Records.push_back(Record); }); } @@ -2316,6 +2320,7 @@ TEST_CASE("compactcas.legacyconversion") { TCasLogFile<CasDiskIndexEntry> CasLog; CasLog.Open(SlogPath, CasLogFile::EMode::kRead); + LogEntries.reserve(CasLog.GetLogCount()); CasLog.Replay([&](const CasDiskIndexEntry& Record) { LogEntries.push_back(Record); }); } TCasLogFile<LegacyCasDiskIndexEntry> LegacyCasLog; diff --git a/zenstore/include/zenstore/caslog.h b/zenstore/include/zenstore/caslog.h index 5b6cc24a0..318fab03d 100644 --- a/zenstore/include/zenstore/caslog.h +++ b/zenstore/include/zenstore/caslog.h @@ -28,6 +28,7 @@ public: void Flush(); void Close(); uint64_t GetLogSize(); + uint64_t GetLogCount(); private: struct FileHeader |