aboutsummaryrefslogtreecommitdiff
path: root/zenstore/caslog.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-03-24 22:41:46 +0100
committerDan Engelbrecht <[email protected]>2022-03-31 11:29:27 +0200
commit52bf08afc4b9da9ccdd73089c8ebfc7bda859bd3 (patch)
tree87fdb172c98fd05b5c64398cce6b1c6be6db257e /zenstore/caslog.cpp
parentclean up paths (diff)
downloadzen-52bf08afc4b9da9ccdd73089c8ebfc7bda859bd3.tar.xz
zen-52bf08afc4b9da9ccdd73089c8ebfc7bda859bd3.zip
Migration now works in larger disk IO chunks
BasicFile and CasLogFile now has new explicit modes instead of create true/false
Diffstat (limited to 'zenstore/caslog.cpp')
-rw-r--r--zenstore/caslog.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/zenstore/caslog.cpp b/zenstore/caslog.cpp
index 909605af9..906c97348 100644
--- a/zenstore/caslog.cpp
+++ b/zenstore/caslog.cpp
@@ -39,13 +39,23 @@ CasLogFile::~CasLogFile()
}
void
-CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, bool IsCreate)
+CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, EMode Mode)
{
m_RecordSize = RecordSize;
- std::error_code Ec;
- m_File.Open(FileName, IsCreate, Ec);
+ std::error_code Ec;
+ BasicFile::EMode FileMode = BasicFile::EMode::kRead;
+ switch (Mode)
+ {
+ case EMode::kWrite:
+ FileMode = BasicFile::EMode::kWrite;
+ break;
+ case EMode::kTruncate:
+ FileMode = BasicFile::EMode::kTruncate;
+ break;
+ }
+ m_File.Open(FileName, FileMode, Ec);
if (Ec)
{
throw std::system_error(Ec, fmt::format("Failed to open log file '{}'", FileName));
@@ -53,8 +63,12 @@ CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, bool IsCreat
uint64_t AppendOffset = 0;
- if (IsCreate || (m_File.FileSize() < sizeof(FileHeader)))
+ if ((Mode == EMode::kTruncate) || (m_File.FileSize() < sizeof(FileHeader)))
{
+ if (Mode == EMode::kRead)
+ {
+ throw std::runtime_error(fmt::format("Mangled log header (file to small) in '{}'", FileName));
+ }
// Initialize log by writing header
FileHeader Header = {.RecordSize = gsl::narrow<uint32_t>(RecordSize), .LogId = Oid::NewOid(), .ValidatedTail = 0};
memcpy(Header.Magic, FileHeader::MagicSequence, sizeof Header.Magic);