diff options
| author | Dan Engelbrecht <[email protected]> | 2022-03-17 15:49:30 +0100 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2022-03-31 11:28:32 +0200 |
| commit | 651155df465cf003c7700e1ef157e41fe7c0d649 (patch) | |
| tree | 5699f1263ecece0f587b79d9e6476535c297fb76 /zenstore/compactcas.cpp | |
| parent | Fix BasicFile::SetFileSize for Mac/Linux (diff) | |
| download | zen-651155df465cf003c7700e1ef157e41fe7c0d649.tar.xz zen-651155df465cf003c7700e1ef157e41fe7c0d649.zip | |
Add header to cas index file
Diffstat (limited to 'zenstore/compactcas.cpp')
| -rw-r--r-- | zenstore/compactcas.cpp | 48 |
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); |