diff options
| author | Stefan Boberg <[email protected]> | 2021-10-21 21:13:13 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-10-21 21:13:13 +0200 |
| commit | cb1a2f52e37d9d92a908a8761a7f69d6d33cc4b1 (patch) | |
| tree | a96e89cfc076d8e8a2f1ceca5d3985cdd3ba0c37 /zenstore/caslog.cpp | |
| parent | Removed accidentally committed test code (diff) | |
| download | zen-cb1a2f52e37d9d92a908a8761a7f69d6d33cc4b1.tar.xz zen-cb1a2f52e37d9d92a908a8761a7f69d6d33cc4b1.zip | |
filecas: Added commit log, chunk gc
Diffstat (limited to 'zenstore/caslog.cpp')
| -rw-r--r-- | zenstore/caslog.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/zenstore/caslog.cpp b/zenstore/caslog.cpp index 2bac6affd..af03e0391 100644 --- a/zenstore/caslog.cpp +++ b/zenstore/caslog.cpp @@ -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,11 +76,17 @@ 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(); + + // 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; } @@ -125,6 +131,8 @@ CasLogFile::Replay(std::function<void(const void*)>&& Handler) { Handler(ReadBuffer.data() + (i * m_RecordSize)); } + + m_AppendOffset = LogBaseOffset + (LogFileSize * LogEntryCount); } void |