diff options
| author | Dan Engelbrecht <[email protected]> | 2023-12-01 04:48:58 -0500 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-12-01 10:48:58 +0100 |
| commit | 1bbdc86732464170c2e7c6145a5a19cdb48fe396 (patch) | |
| tree | 8f224088f9621406b0a8a459b91612c612af63b5 /src/zenserver/projectstore/projectstore.cpp | |
| parent | WinIoThreadPool teardown cleaned up (#580) (diff) | |
| download | zen-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.cpp | 43 |
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(); } |