From c66d244eb7847ec907936a95195ef1f888fc87cd Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Fri, 20 Sep 2024 12:57:56 +0200 Subject: unblock PreCache (#164) Don't lock disk cache buckets from writing when scanning records for attachment references --- src/zenstore/cache/cachedisklayer.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'src/zenstore/cache/cachedisklayer.cpp') diff --git a/src/zenstore/cache/cachedisklayer.cpp b/src/zenstore/cache/cachedisklayer.cpp index 110acba9e..63f6d708a 100644 --- a/src/zenstore/cache/cachedisklayer.cpp +++ b/src/zenstore/cache/cachedisklayer.cpp @@ -3587,7 +3587,7 @@ ZenCacheDiskLayer::CacheBucket::ReadAttachmentsFromMetaData(uint32_t BlockI } bool -ZenCacheDiskLayer::CacheBucket::GetReferencesLocked(GcCtx& Ctx, std::vector& OutReferences) +ZenCacheDiskLayer::CacheBucket::GetReferences(GcCtx& Ctx, bool StateIsAlreadyLocked, std::vector& OutReferences) { ZEN_TRACE_CPU("Z$::Bucket::GetReferencesLocked"); @@ -3611,7 +3611,11 @@ ZenCacheDiskLayer::CacheBucket::GetReferencesLocked(GcCtx& Ctx, std::vector BlockIndexToChunkIndexes; - + std::unique_ptr StateLock; + if (!StateIsAlreadyLocked) + { + StateLock = std::make_unique(m_IndexLock); + } for (const auto& Entry : m_Index) { if (Ctx.IsCancelledFlag.load()) @@ -3784,9 +3788,7 @@ public: m_CacheBucket.m_IndexLock.WithExclusiveLock([&]() { m_CacheBucket.m_TrackedReferences = std::make_unique(); }); - RwLock::SharedLockScope IndexLock(m_CacheBucket.m_IndexLock); - bool Continue = m_CacheBucket.GetReferencesLocked(Ctx, m_References); - IndexLock.ReleaseNow(); + bool Continue = m_CacheBucket.GetReferences(Ctx, /*StateIsAlreadyLocked*/ false, m_References); if (!Continue) { m_CacheBucket.m_IndexLock.WithExclusiveLock([&]() { m_CacheBucket.m_TrackedReferences.reset(); }); -- cgit v1.2.3