diff options
| author | Dan Engelbrecht <[email protected]> | 2025-09-29 13:00:00 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-09-29 13:00:00 +0200 |
| commit | 8fa8c9c8459c9ad610f4a8056dfb9b620d931861 (patch) | |
| tree | e96ca30b95826e484365c9eb70e7ba831cc16e6c /src/zenserver/projectstore/projectstore.cpp | |
| parent | builds multi wildcard (#524) (diff) | |
| download | zen-8fa8c9c8459c9ad610f4a8056dfb9b620d931861.tar.xz zen-8fa8c9c8459c9ad610f4a8056dfb9b620d931861.zip | |
gracefully handle missing chunks when exporting an oplog (#526)
- Improvement: Gracefully handle missing chunks when exporting an oplog
- Bugfix: Add object validation when replaying oplog to avoid crash on malformed data
Diffstat (limited to 'src/zenserver/projectstore/projectstore.cpp')
| -rw-r--r-- | src/zenserver/projectstore/projectstore.cpp | 70 |
1 files changed, 47 insertions, 23 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp index 690f697d0..284a32baa 100644 --- a/src/zenserver/projectstore/projectstore.cpp +++ b/src/zenserver/projectstore/projectstore.cpp @@ -1043,37 +1043,61 @@ struct ProjectStore::OplogStorage : public RefCounted MemoryView OpBufferView = OpBlobsBuffer.MakeView(Entry.Address.Size, OpFileOffset); if (OpBufferView.GetSize() == Entry.Address.Size) { - CbObjectView OpView(OpBufferView.GetData()); - if (OpView.GetSize() != OpBufferView.GetSize()) + if (CbValidateError Error = ValidateCompactBinary(OpBufferView, CbValidateMode::Default); Error == CbValidateError::None) { - ZEN_WARN("oplog '{}/{}': skipping invalid format op - {}. Object payload size {} does not match op data size {}", - m_OwnerOplog->GetOuterProjectIdentifier(), - m_OwnerOplog->OplogId(), - Entry.Lsn.Number, - OpView.GetSize(), - OpBufferView.GetSize()); + CbObjectView OpView(OpBufferView.GetData()); + if (OpView.GetSize() != OpBufferView.GetSize()) + { + ZEN_WARN("oplog '{}/{}': skipping invalid format op - {}. Object payload size {} does not match op data size {}", + m_OwnerOplog->GetOuterProjectIdentifier(), + m_OwnerOplog->OplogId(), + Entry.Lsn.Number, + OpView.GetSize(), + OpBufferView.GetSize()); + } + else + { + Handler(Entry.Lsn, OpView); + } } else { - Handler(Entry.Lsn, OpView); + ZEN_WARN("oplog '{}/{}': skipping invalid format op - {}. Validation error: {}", + m_OwnerOplog->GetOuterProjectIdentifier(), + m_OwnerOplog->OplogId(), + Entry.Lsn.Number, + ToString(Error)); } - continue; - } - IoBuffer OpBuffer(Entry.Address.Size); - OpBlobsBuffer.Read((void*)OpBuffer.Data(), Entry.Address.Size, OpFileOffset); - CbObjectView OpView(OpBuffer.Data()); - if (OpView.GetSize() != OpBuffer.GetSize()) - { - ZEN_WARN("oplog '{}/{}': skipping invalid format op - {}. Object payload size {} does not match op data size {}", - m_OwnerOplog->GetOuterProjectIdentifier(), - m_OwnerOplog->OplogId(), - Entry.Lsn.Number, - OpView.GetSize(), - OpBuffer.GetSize()); } else { - Handler(Entry.Lsn, OpView); + IoBuffer OpBuffer(Entry.Address.Size); + OpBlobsBuffer.Read((void*)OpBuffer.Data(), Entry.Address.Size, OpFileOffset); + if (CbValidateError Error = ValidateCompactBinary(OpBufferView, CbValidateMode::Default); Error == CbValidateError::None) + { + CbObjectView OpView(OpBuffer.Data()); + if (OpView.GetSize() != OpBuffer.GetSize()) + { + ZEN_WARN("oplog '{}/{}': skipping invalid format op - {}. Object payload size {} does not match op data size {}", + m_OwnerOplog->GetOuterProjectIdentifier(), + m_OwnerOplog->OplogId(), + Entry.Lsn.Number, + OpView.GetSize(), + OpBuffer.GetSize()); + } + else + { + Handler(Entry.Lsn, OpView); + } + } + else + { + ZEN_WARN("oplog '{}/{}': skipping invalid format op - {}. Validation error: {}", + m_OwnerOplog->GetOuterProjectIdentifier(), + m_OwnerOplog->OplogId(), + Entry.Lsn.Number, + ToString(Error)); + } } } } |