aboutsummaryrefslogtreecommitdiff
path: root/zenstore/compactcas.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-03-17 15:49:30 +0100
committerDan Engelbrecht <[email protected]>2022-03-31 11:28:32 +0200
commit651155df465cf003c7700e1ef157e41fe7c0d649 (patch)
tree5699f1263ecece0f587b79d9e6476535c297fb76 /zenstore/compactcas.cpp
parentFix BasicFile::SetFileSize for Mac/Linux (diff)
downloadzen-651155df465cf003c7700e1ef157e41fe7c0d649.tar.xz
zen-651155df465cf003c7700e1ef157e41fe7c0d649.zip
Add header to cas index file
Diffstat (limited to 'zenstore/compactcas.cpp')
-rw-r--r--zenstore/compactcas.cpp48
1 files changed, 40 insertions, 8 deletions
diff --git a/zenstore/compactcas.cpp b/zenstore/compactcas.cpp
index 684a91233..2dcc9aa7c 100644
--- a/zenstore/compactcas.cpp
+++ b/zenstore/compactcas.cpp
@@ -23,6 +23,20 @@
namespace zen {
+struct CasDiskIndexHeader
+{
+ static constexpr uint32_t ExpectedMagic = 0x75696478; // 'uidx';
+ static constexpr uint32_t CurrentVersion = 1;
+ uint32_t Magic = ExpectedMagic;
+ uint32_t Version = CurrentVersion;
+ uint32_t PayloadAlignement;
+ uint32_t Reserved0 = 0;
+ uint64_t MaxBlockSize;
+ uint64_t EntryCount;
+};
+
+static_assert(sizeof(CasDiskIndexHeader) == 32);
+
namespace {
uint64_t AlignPositon(uint64_t Offset, uint64_t Alignment) { return (Offset + Alignment - 1) & ~(Alignment - 1); }
@@ -742,7 +756,11 @@ CasContainerStrategy::MakeIndexSnapshot()
BasicFile SmallObjectIndex;
SmallObjectIndex.Open(SidxPath, true);
- SmallObjectIndex.Write(Entries.data(), Entries.size() * sizeof(CasDiskIndexEntry), 0);
+ CasDiskIndexHeader Header = {.PayloadAlignement = gsl::narrow<uint32_t>(m_PayloadAlignment),
+ .MaxBlockSize = m_MaxBlockSize,
+ .EntryCount = Entries.size()};
+ SmallObjectIndex.Write(&Header, sizeof(CasDiskIndexEntry), 0);
+ SmallObjectIndex.Write(Entries.data(), Entries.size() * sizeof(CasDiskIndexEntry), sizeof(CasDiskIndexEntry));
SmallObjectIndex.Close();
}
catch (std::exception& Err)
@@ -980,15 +998,29 @@ CasContainerStrategy::OpenContainer(bool IsNewStore)
{
BasicFile SmallObjectIndex;
SmallObjectIndex.Open(SidxPath, false);
- uint64_t Size = SmallObjectIndex.FileSize();
- uint64_t EntryCount = Size / sizeof(CasDiskIndexEntry);
- std::vector<CasDiskIndexEntry> Entries{EntryCount};
- SmallObjectIndex.Read(Entries.data(), Size, 0);
- for (const auto& Entry : Entries)
+ uint64_t Size = SmallObjectIndex.FileSize();
+ if (SmallObjectIndex.FileSize() >= sizeof(CasDiskIndexHeader))
{
- m_LocationMap[Entry.Key] = Entry.Location;
+ uint64_t ExpectedEntryCount = (Size - sizeof(sizeof(CasDiskIndexHeader))) / sizeof(CasDiskIndexEntry);
+ CasDiskIndexHeader Header;
+ SmallObjectIndex.Read(&Header, sizeof(Header), 0);
+ if (Header.Magic == CasDiskIndexHeader::ExpectedMagic &&
+ Header.Version == CasDiskIndexHeader::CurrentVersion &&
+ Header.MaxBlockSize > 0 &&
+ Header.PayloadAlignement > 0 &&
+ Header.EntryCount == ExpectedEntryCount)
+ {
+ std::vector<CasDiskIndexEntry> Entries{Header.EntryCount};
+ SmallObjectIndex.Read(Entries.data(), Header.EntryCount * sizeof(CasDiskIndexEntry), sizeof(CasDiskIndexHeader));
+ SmallObjectIndex.Close();
+ for (const auto& Entry : Entries)
+ {
+ m_LocationMap[Entry.Key] = Entry.Location;
+ }
+ m_MaxBlockSize = Header.MaxBlockSize;
+ m_PayloadAlignment = Header.PayloadAlignement;
+ }
}
- SmallObjectIndex.Close();
}
m_CasLog.Open(SlogPath, false);