diff options
Diffstat (limited to 'zenstore/caslog.cpp')
| -rw-r--r-- | zenstore/caslog.cpp | 18 |
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 |