aboutsummaryrefslogtreecommitdiff
path: root/zenstore/caslog.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-10-21 21:13:13 +0200
committerStefan Boberg <[email protected]>2021-10-21 21:13:13 +0200
commitcb1a2f52e37d9d92a908a8761a7f69d6d33cc4b1 (patch)
treea96e89cfc076d8e8a2f1ceca5d3985cdd3ba0c37 /zenstore/caslog.cpp
parentRemoved accidentally committed test code (diff)
downloadzen-cb1a2f52e37d9d92a908a8761a7f69d6d33cc4b1.tar.xz
zen-cb1a2f52e37d9d92a908a8761a7f69d6d33cc4b1.zip
filecas: Added commit log, chunk gc
Diffstat (limited to 'zenstore/caslog.cpp')
-rw-r--r--zenstore/caslog.cpp14
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