aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-02-13 11:01:02 +0100
committerGitHub <[email protected]>2024-02-13 11:01:02 +0100
commit1c9e2bb155d8a33a7d03acec60439a79890d81eb (patch)
tree741ff1f3eddfa0c09450f6971a3df863ae0be53d /src
parent5.4.1-pre4 (diff)
downloadzen-1c9e2bb155d8a33a7d03acec60439a79890d81eb.tar.xz
zen-1c9e2bb155d8a33a7d03acec60439a79890d81eb.zip
Keep track of added ops during GCV2 instead of rescanning full oplog when added ops are detected (#652)
Diffstat (limited to 'src')
-rw-r--r--src/zenserver/projectstore/projectstore.cpp31
-rw-r--r--src/zenserver/projectstore/projectstore.h2
2 files changed, 25 insertions, 8 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp
index 72a8e1409..7d4ce3809 100644
--- a/src/zenserver/projectstore/projectstore.cpp
+++ b/src/zenserver/projectstore/projectstore.cpp
@@ -1282,6 +1282,11 @@ ProjectStore::Oplog::RegisterOplogEntry(RwLock::ExclusiveLockScope& OplogLock,
m_OpAddressMap.emplace(OpEntry.OpLsn, OplogEntryAddress{.Offset = OpEntry.OpCoreOffset, .Size = OpEntry.OpCoreSize});
m_LatestOpMap[OpEntry.OpKeyHash] = OpEntry.OpLsn;
+ if (m_UpdatedLSNs)
+ {
+ m_UpdatedLSNs->push_back(OpEntry.OpLsn);
+ }
+
return OpEntry.OpLsn;
}
@@ -3571,7 +3576,11 @@ class ProjectStoreReferenceChecker : public GcReferenceChecker
public:
ProjectStoreReferenceChecker(ProjectStore::Oplog& Owner, bool PreCache) : m_Oplog(Owner), m_PreCache(PreCache) {}
- virtual ~ProjectStoreReferenceChecker() {}
+ virtual ~ProjectStoreReferenceChecker()
+ {
+ m_OplogLock.reset();
+ m_Oplog.m_OplogLock.WithExclusiveLock([&]() { m_Oplog.m_UpdatedLSNs.reset(); });
+ }
virtual void PreCache(GcCtx& Ctx) override
{
@@ -3593,6 +3602,8 @@ public:
m_Oplog.OplogId());
});
+ m_Oplog.m_OplogLock.WithExclusiveLock([&]() { m_Oplog.m_UpdatedLSNs = std::make_unique<std::vector<int>>(); });
+
RwLock::SharedLockScope __(m_Oplog.m_OplogLock);
if (Ctx.IsCancelledFlag)
{
@@ -3624,14 +3635,18 @@ public:
});
m_OplogLock = std::make_unique<RwLock::SharedLockScope>(m_Oplog.m_OplogLock);
- if (m_Oplog.GetMaxOpIndex() != m_PreCachedLsn)
+
+ if (m_Oplog.m_UpdatedLSNs)
{
- // TODO: Maybe we could just check the added oplog entries - we might get a few extra references from obsolete entries
- // but I don't think that would be critical
- m_References.resize(0);
- m_Oplog.IterateOplog([&](CbObjectView Op) {
- Op.IterateAttachments([&](CbFieldView Visitor) { m_References.emplace_back(Visitor.AsAttachment()); });
- });
+ for (int UpdatedLSN : *m_Oplog.m_UpdatedLSNs)
+ {
+ std::optional<CbObject> UpdatedOp = m_Oplog.GetOpByIndex(UpdatedLSN);
+ if (UpdatedOp)
+ {
+ CbObjectView Op = UpdatedOp.value();
+ Op.IterateAttachments([&](CbFieldView Visitor) { m_References.emplace_back(Visitor.AsAttachment()); });
+ }
+ }
}
}
diff --git a/src/zenserver/projectstore/projectstore.h b/src/zenserver/projectstore/projectstore.h
index 5b873b758..897231a2e 100644
--- a/src/zenserver/projectstore/projectstore.h
+++ b/src/zenserver/projectstore/projectstore.h
@@ -164,6 +164,8 @@ public:
tsl::robin_map<int, OplogEntryAddress> m_OpAddressMap; // Index LSN -> op data in ops blob file
OidMap<int> m_LatestOpMap; // op key -> latest op LSN for key
+ std::unique_ptr<std::vector<int>> m_UpdatedLSNs;
+
RefPtr<OplogStorage> m_Storage;
std::string m_OplogId;