diff options
| author | Dan Engelbrecht <[email protected]> | 2024-09-05 16:55:56 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-09-05 16:55:56 +0200 |
| commit | 20de9bb46f5d0a114d8b8863da5650e0dbcb41af (patch) | |
| tree | 9b142810da6621d04222ff2d550810d335212c74 /src | |
| parent | fix oplog instance leak in project store gc (#145) (diff) | |
| download | zen-20de9bb46f5d0a114d8b8863da5650e0dbcb41af.tar.xz zen-20de9bb46f5d0a114d8b8863da5650e0dbcb41af.zip | |
fix oplog index snapshot reading (#146)
* fixed parsing and added extra validation of oplog index snapshot
Diffstat (limited to 'src')
| -rw-r--r-- | src/zenserver/projectstore/projectstore.cpp | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp index 7962c8cd1..cc6f231d7 100644 --- a/src/zenserver/projectstore/projectstore.cpp +++ b/src/zenserver/projectstore/projectstore.cpp @@ -1026,7 +1026,11 @@ ProjectStore::Oplog::ScrubStorage(ScrubContext& Ctx) RwLock::ExclusiveLockScope _(m_OplogLock); for (const auto& Key : BadEntryKeys) { - m_LatestOpMap.erase(Key); + if (auto It = m_LatestOpMap.find(Key); It != m_LatestOpMap.end()) + { + m_OpAddressMap.erase(It->second); + m_LatestOpMap.erase(It); + } m_Storage->AppendTombstone(Key); } if (!BadEntryKeys.empty()) @@ -1351,7 +1355,7 @@ ProjectStore::Oplog::WriteIndexSnapshot() { IndexLogPosition = m_Storage->LogCount(); - Keys.reserve(m_OpAddressMap.size() + m_LatestOpMap.size() + m_ChunkMap.size() + m_FileMap.size()); + Keys.reserve(m_LatestOpMap.size() + m_ChunkMap.size() + m_MetaMap.size() + m_FileMap.size()); AddressMapEntries.reserve(m_OpAddressMap.size()); LSNEntries.reserve(m_OpAddressMap.size()); @@ -1538,7 +1542,27 @@ ProjectStore::Oplog::ReadIndexSnapshot() OplogEntryAddress LastOpAddress{.Offset = 0, .Size = 0}; uint32_t Checksum = OplogIndexHeader::ComputeChecksum(Header); - ZEN_ASSERT(Header.Checksum == Checksum); + if (Header.Checksum != Checksum) + { + ZEN_WARN("oplog '{}/{}': skipping invalid index file '{}'. Checksum mismatch. Expected: {}, Found: {}", + m_OuterProject->Identifier, + m_OplogId, + IndexPath, + Header.Checksum, + Checksum); + return; + } + + if (Header.LatestOpMapCount + Header.ChunkMapCount + Header.MetaMapCount + Header.FileMapCount != Header.KeyCount) + { + ZEN_WARN("oplog '{}/{}': skipping invalid index file '{}'. Key count mismatch. Expected: {}, Found: {}", + m_OuterProject->Identifier, + m_OplogId, + IndexPath, + Header.LatestOpMapCount + Header.ChunkMapCount + Header.MetaMapCount + Header.FileMapCount, + Header.KeyCount); + return; + } std::vector<uint32_t> LSNEntries(Header.LSNCount); ObjectIndexFile.Read(LSNEntries.data(), LSNEntries.size() * sizeof(uint32_t), Offset); @@ -1572,8 +1596,8 @@ ProjectStore::Oplog::ReadIndexSnapshot() ObjectIndexFile.Read(LatestOpMapEntries.data(), LatestOpMapEntries.size() * sizeof(uint32_t), Offset); Offset += LatestOpMapEntries.size() * sizeof(uint32_t); Offset = RoundUp(Offset, OplogIndexHeader::DataAlignment); - m_LatestOpMap.reserve(LSNEntries.size()); - for (uint32_t LSN : LSNEntries) + m_LatestOpMap.reserve(LatestOpMapEntries.size()); + for (uint32_t LSN : LatestOpMapEntries) { m_LatestOpMap.insert_or_assign(Keys[KeyOffset++], LSN); MaxLSN = Max(MaxLSN, LSN); |