aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-04-01 08:41:51 +0200
committerDan Engelbrecht <[email protected]>2022-04-01 09:07:21 +0200
commitac573e90a5698c64451a99beb1a14d00540aa835 (patch)
treef246b21daef1b8ce99abe275cbda96a481531467
parentcall Initialize before replay on caslog (diff)
downloadzen-ac573e90a5698c64451a99beb1a14d00540aa835.tar.xz
zen-ac573e90a5698c64451a99beb1a14d00540aa835.zip
reserve space for log entries before replay
-rw-r--r--zenstore/caslog.cpp13
-rw-r--r--zenstore/compactcas.cpp5
-rw-r--r--zenstore/include/zenstore/caslog.h1
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