aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/projectstore/projectstore.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-12-01 04:48:58 -0500
committerGitHub <[email protected]>2023-12-01 10:48:58 +0100
commit1bbdc86732464170c2e7c6145a5a19cdb48fe396 (patch)
tree8f224088f9621406b0a8a459b91612c612af63b5 /src/zenserver/projectstore/projectstore.cpp
parentWinIoThreadPool teardown cleaned up (#580) (diff)
downloadzen-1bbdc86732464170c2e7c6145a5a19cdb48fe396.tar.xz
zen-1bbdc86732464170c2e7c6145a5a19cdb48fe396.zip
add separate PreCache step for GcReferenceChecker (#578)
- Improvement: GCv2: Use separate PreCache step to improve concurrency when checking references - Improvement: GCv2: Improved verbose logging - Improvement: GCv2: Sort chunks to read by block/offset when finding references - Improvement: GCv2: Exit as soon as no more unreferenced items are left
Diffstat (limited to 'src/zenserver/projectstore/projectstore.cpp')
-rw-r--r--src/zenserver/projectstore/projectstore.cpp43
1 files changed, 29 insertions, 14 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp
index dde824b6f..c6097dea2 100644
--- a/src/zenserver/projectstore/projectstore.cpp
+++ b/src/zenserver/projectstore/projectstore.cpp
@@ -3311,11 +3311,15 @@ ProjectStore::RemoveExpiredData(GcCtx& Ctx, GcStats& Stats)
class ProjectStoreReferenceChecker : public GcReferenceChecker
{
public:
- ProjectStoreReferenceChecker(GcCtx& Ctx, ProjectStore::Oplog& Owner, bool PreCache) : m_Oplog(Owner)
+ ProjectStoreReferenceChecker(ProjectStore::Oplog& Owner, bool PreCache) : m_Oplog(Owner), m_PreCache(PreCache) {}
+
+ virtual ~ProjectStoreReferenceChecker() {}
+
+ virtual void PreCache(GcCtx& Ctx) override
{
- if (PreCache)
+ if (m_PreCache)
{
- ZEN_TRACE_CPU("Store::ReferencesPreCache");
+ ZEN_TRACE_CPU("Store::PreCache");
Stopwatch Timer;
const auto _ = MakeGuard([&] {
@@ -3323,7 +3327,7 @@ public:
{
return;
}
- ZEN_INFO("GCV2: projectstore [LOCKSTATE] '{}': precached {} references in {} from {}/{}",
+ ZEN_INFO("GCV2: projectstore [PRECACHE] '{}': precached {} references in {} from {}/{}",
m_Oplog.m_BasePath,
m_References.size(),
NiceTimeSpanMs(Timer.GetElapsedTimeMs()),
@@ -3332,14 +3336,17 @@ public:
});
RwLock::SharedLockScope __(m_Oplog.m_OplogLock);
- m_Oplog.IterateOplog(
- [&](CbObjectView Op) { Op.IterateAttachments([&](CbFieldView Visitor) { m_References.insert(Visitor.AsAttachment()); }); });
+ if (Ctx.IsCancelledFlag)
+ {
+ return;
+ }
+ m_Oplog.IterateOplog([&](CbObjectView Op) {
+ Op.IterateAttachments([&](CbFieldView Visitor) { m_References.emplace_back(Visitor.AsAttachment()); });
+ });
m_PreCachedLsn = m_Oplog.GetMaxOpIndex();
}
}
- virtual ~ProjectStoreReferenceChecker() {}
-
virtual void LockState(GcCtx& Ctx) override
{
ZEN_TRACE_CPU("Store::LockState");
@@ -3363,9 +3370,10 @@ public:
{
// 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.clear();
- m_Oplog.IterateOplog(
- [&](CbObjectView Op) { Op.IterateAttachments([&](CbFieldView Visitor) { m_References.insert(Visitor.AsAttachment()); }); });
+ m_References.resize(0);
+ m_Oplog.IterateOplog([&](CbObjectView Op) {
+ Op.IterateAttachments([&](CbFieldView Visitor) { m_References.emplace_back(Visitor.AsAttachment()); });
+ });
}
}
@@ -3391,12 +3399,19 @@ public:
for (const IoHash& ReferenceHash : m_References)
{
- IoCids.erase(ReferenceHash);
+ if (IoCids.erase(ReferenceHash) == 1)
+ {
+ if (IoCids.empty())
+ {
+ return;
+ }
+ }
}
}
ProjectStore::Oplog& m_Oplog;
+ bool m_PreCache;
std::unique_ptr<RwLock::SharedLockScope> m_OplogLock;
- HashSet m_References;
+ std::vector<IoHash> m_References;
int m_PreCachedLsn = -1;
};
@@ -3446,7 +3461,7 @@ ProjectStore::CreateReferenceCheckers(GcCtx& Ctx)
ProjectStore::Oplog* Oplog = Project->OpenOplog(OpLogId);
GcClock::TimePoint Now = GcClock::Now();
bool TryPreCache = Project->LastOplogAccessTime(OpLogId) < (Now - std::chrono::minutes(5));
- Checkers.emplace_back(new ProjectStoreReferenceChecker(Ctx, *Oplog, TryPreCache));
+ Checkers.emplace_back(new ProjectStoreReferenceChecker(*Oplog, TryPreCache));
}
OplogCount += OpLogs.size();
}