aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-09-05 16:55:56 +0200
committerGitHub Enterprise <[email protected]>2024-09-05 16:55:56 +0200
commit20de9bb46f5d0a114d8b8863da5650e0dbcb41af (patch)
tree9b142810da6621d04222ff2d550810d335212c74 /src
parentfix oplog instance leak in project store gc (#145) (diff)
downloadzen-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.cpp34
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);