aboutsummaryrefslogtreecommitdiff
path: root/zenstore/caslog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'zenstore/caslog.cpp')
-rw-r--r--zenstore/caslog.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/zenstore/caslog.cpp b/zenstore/caslog.cpp
index 2bac6affd..38d0f818e 100644
--- a/zenstore/caslog.cpp
+++ b/zenstore/caslog.cpp
@@ -46,7 +46,7 @@ CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, bool IsCreat
m_RecordSize = RecordSize;
std::error_code Ec;
- m_File.Open(FileName, IsCreate);
+ m_File.Open(FileName, IsCreate, Ec);
if (Ec)
{
@@ -55,7 +55,7 @@ CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, bool IsCreat
uint64_t AppendOffset = 0;
- if (IsCreate)
+ if (IsCreate || (m_File.FileSize() < sizeof(FileHeader)))
{
// Initialize log by writing header
FileHeader Header = {.RecordSize = gsl::narrow<uint32_t>(RecordSize), .LogId = Oid::NewOid(), .ValidatedTail = 0};
@@ -76,12 +76,18 @@ CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, bool IsCreat
if ((0 != memcmp(Header.Magic, FileHeader::MagicSequence, sizeof Header.Magic)) || (Header.Checksum != Header.ComputeChecksum()))
{
- // TODO: provide more context!
- throw std::runtime_error("Mangled log header");
+ throw std::runtime_error("Mangled log header (invalid header magic) in '{}'"_format(FileName));
}
AppendOffset = m_File.FileSize();
- m_Header = Header;
+
+ // Adjust the offset to ensure we end up on a good boundary, in case there is some garbage appended
+
+ AppendOffset -= sizeof Header;
+ AppendOffset -= AppendOffset % RecordSize;
+ AppendOffset += sizeof Header;
+
+ m_Header = Header;
}
m_AppendOffset = AppendOffset;
@@ -125,6 +131,8 @@ CasLogFile::Replay(std::function<void(const void*)>&& Handler)
{
Handler(ReadBuffer.data() + (i * m_RecordSize));
}
+
+ m_AppendOffset = LogBaseOffset + (LogFileSize * LogEntryCount);
}
void