aboutsummaryrefslogtreecommitdiff
path: root/zenstore/caslog.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-02-23 14:54:22 +0100
committerGitHub <[email protected]>2023-02-23 05:54:22 -0800
commitd361aa896e2e74ae4a790c4668c78c830f9b5d1c (patch)
treec76518eaab8d4b6b0ba185bdec0fe07639729ea8 /zenstore/caslog.cpp
parentjunit test reporting (#239) (diff)
downloadzen-d361aa896e2e74ae4a790c4668c78c830f9b5d1c.tar.xz
zen-d361aa896e2e74ae4a790c4668c78c830f9b5d1c.zip
store cache rawhash and rawsize for unstructured cache values (#234)
* refactored MemoryCacheBucket to allow for storing RawHash/RawSize. * remove redundant conversions in AccessTime * reduce max count for memory cache bucket to 32-bit value * refactored DiskCacheBucket to allow for storing RawHash/RawSize. * Use CompressedBuffer::ValidateCompressedHeader when applicable * Make sure we rewrite the snapshot if we read an legacy existing index/log * changelog
Diffstat (limited to 'zenstore/caslog.cpp')
-rw-r--r--zenstore/caslog.cpp44
1 files changed, 43 insertions, 1 deletions
diff --git a/zenstore/caslog.cpp b/zenstore/caslog.cpp
index 9c5258bce..2a978ae12 100644
--- a/zenstore/caslog.cpp
+++ b/zenstore/caslog.cpp
@@ -38,6 +38,42 @@ CasLogFile::~CasLogFile()
{
}
+bool
+CasLogFile::IsValid(std::filesystem::path FileName, size_t RecordSize)
+{
+ if (!std::filesystem::is_regular_file(FileName))
+ {
+ return false;
+ }
+ BasicFile File;
+
+ std::error_code Ec;
+ File.Open(FileName, BasicFile::Mode::kRead, Ec);
+ if (Ec)
+ {
+ return false;
+ }
+
+ FileHeader Header;
+ if (File.FileSize() < sizeof(Header))
+ {
+ return false;
+ }
+
+ // Validate header and log contents and prepare for appending/replay
+ File.Read(&Header, sizeof Header, 0);
+
+ if ((0 != memcmp(Header.Magic, FileHeader::MagicSequence, sizeof Header.Magic)) || (Header.Checksum != Header.ComputeChecksum()))
+ {
+ return false;
+ }
+ if (Header.RecordSize != RecordSize)
+ {
+ return false;
+ }
+ return true;
+}
+
void
CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, Mode Mode)
{
@@ -82,7 +118,6 @@ CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, Mode Mode)
}
else
{
- // Validate header and log contents and prepare for appending/replay
FileHeader Header;
m_File.Read(&Header, sizeof Header, 0);
@@ -90,6 +125,13 @@ CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, Mode Mode)
{
throw std::runtime_error(fmt::format("Mangled log header (invalid header magic) in '{}'", FileName));
}
+ if (Header.RecordSize != RecordSize)
+ {
+ throw std::runtime_error(fmt::format("Mangled log header (mismatch in record size, expected {}, found {}) in '{}'",
+ RecordSize,
+ Header.RecordSize,
+ FileName));
+ }
AppendOffset = m_File.FileSize();