From bb4a0b17c07e5a4f19f56a7c089c49f82aecf2fa Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Wed, 22 Nov 2023 15:04:53 +0100 Subject: reduce work when there are no blocks to compact (#558) * reduce work when there are no blocks to compact * fix lock scopes --- src/zenserver/cache/cachedisklayer.cpp | 115 +++++++++++++++++---------------- 1 file changed, 61 insertions(+), 54 deletions(-) (limited to 'src/zenserver/cache/cachedisklayer.cpp') diff --git a/src/zenserver/cache/cachedisklayer.cpp b/src/zenserver/cache/cachedisklayer.cpp index 2be32e372..af8b6227b 100644 --- a/src/zenserver/cache/cachedisklayer.cpp +++ b/src/zenserver/cache/cachedisklayer.cpp @@ -2448,6 +2448,7 @@ public: { std::unordered_map BlockUsage; { + RwLock::SharedLockScope __(m_Bucket.m_IndexLock); for (const auto& Entry : m_Bucket.m_Index) { ZenCacheDiskLayer::CacheBucket::PayloadIndex Index = Entry.second; @@ -2480,73 +2481,79 @@ public: m_Bucket.m_BlockStore.GetBlocksToCompact(BlockUsage, Ctx.Settings.CompactBlockUsageThresholdPercent); BlockCompactState.IncludeBlocks(BlocksToCompact); + if (BlocksToCompact.size() > 0) { - RwLock::SharedLockScope __(m_Bucket.m_IndexLock); - for (const auto& Entry : m_Bucket.m_Index) { - ZenCacheDiskLayer::CacheBucket::PayloadIndex Index = Entry.second; - const ZenCacheDiskLayer::CacheBucket::BucketPayload& Payload = m_Bucket.m_Payloads[Index]; - const DiskLocation& Loc = Payload.Location; - - if (Loc.IsFlagSet(DiskLocation::kStandaloneFile)) - { - continue; - } - if (!BlockCompactState.AddKeepLocation(Loc.GetBlockLocation(m_Bucket.m_Configuration.PayloadAlignment))) + RwLock::SharedLockScope __(m_Bucket.m_IndexLock); + for (const auto& Entry : m_Bucket.m_Index) { - continue; + ZenCacheDiskLayer::CacheBucket::PayloadIndex Index = Entry.second; + const ZenCacheDiskLayer::CacheBucket::BucketPayload& Payload = m_Bucket.m_Payloads[Index]; + const DiskLocation& Loc = Payload.Location; + + if (Loc.IsFlagSet(DiskLocation::kStandaloneFile)) + { + continue; + } + if (!BlockCompactState.AddKeepLocation(Loc.GetBlockLocation(m_Bucket.m_Configuration.PayloadAlignment))) + { + continue; + } + BlockCompactStateKeys.push_back(Entry.first); } - BlockCompactStateKeys.push_back(Entry.first); } - } - if (Ctx.Settings.IsDeleteMode) - { - if (Ctx.Settings.Verbose) + if (Ctx.Settings.IsDeleteMode) { - ZEN_INFO("GCV2: cachebucket [COMPACT] '{}': compacting {} blocks", m_Bucket.m_BucketDir, BlocksToCompact.size()); - } - - m_Bucket.m_BlockStore.CompactBlocks( - BlockCompactState, - m_Bucket.m_Configuration.PayloadAlignment, - [&](const BlockStore::MovedChunksArray& MovedArray, uint64_t FreedDiskSpace) { - std::vector MovedEntries; - RwLock::ExclusiveLockScope _(m_Bucket.m_IndexLock); - for (const std::pair& Moved : MovedArray) - { - size_t ChunkIndex = Moved.first; - const IoHash& Key = BlockCompactStateKeys[ChunkIndex]; + if (Ctx.Settings.Verbose) + { + ZEN_INFO("GCV2: cachebucket [COMPACT] '{}': compacting {} blocks", + m_Bucket.m_BucketDir, + BlocksToCompact.size()); + } - if (auto It = m_Bucket.m_Index.find(Key); It != m_Bucket.m_Index.end()) + m_Bucket.m_BlockStore.CompactBlocks( + BlockCompactState, + m_Bucket.m_Configuration.PayloadAlignment, + [&](const BlockStore::MovedChunksArray& MovedArray, uint64_t FreedDiskSpace) { + std::vector MovedEntries; + RwLock::ExclusiveLockScope _(m_Bucket.m_IndexLock); + for (const std::pair& Moved : MovedArray) { - ZenCacheDiskLayer::CacheBucket::BucketPayload& Payload = m_Bucket.m_Payloads[It->second]; - const BlockStoreLocation& OldLocation = BlockCompactState.GetLocation(ChunkIndex); - if (Payload.Location.GetBlockLocation(m_Bucket.m_Configuration.PayloadAlignment) != OldLocation) + size_t ChunkIndex = Moved.first; + const IoHash& Key = BlockCompactStateKeys[ChunkIndex]; + + if (auto It = m_Bucket.m_Index.find(Key); It != m_Bucket.m_Index.end()) { - // Someone has moved our chunk so lets just skip the new location we were provided, it will be GC:d - // at a later time - continue; + ZenCacheDiskLayer::CacheBucket::BucketPayload& Payload = m_Bucket.m_Payloads[It->second]; + const BlockStoreLocation& OldLocation = BlockCompactState.GetLocation(ChunkIndex); + if (Payload.Location.GetBlockLocation(m_Bucket.m_Configuration.PayloadAlignment) != OldLocation) + { + // Someone has moved our chunk so lets just skip the new location we were provided, it will be + // GC:d at a later time + continue; + } + const BlockStoreLocation& NewLocation = Moved.second; + + Payload.Location = DiskLocation(NewLocation, + m_Bucket.m_Configuration.PayloadAlignment, + Payload.Location.GetFlags()); + MovedEntries.push_back({.Key = Key, .Location = Payload.Location}); } - const BlockStoreLocation& NewLocation = Moved.second; - - Payload.Location = - DiskLocation(NewLocation, m_Bucket.m_Configuration.PayloadAlignment, Payload.Location.GetFlags()); - MovedEntries.push_back({.Key = Key, .Location = Payload.Location}); } - } - m_Bucket.m_SlogFile.Append(MovedEntries); - Stats.RemovedDisk += FreedDiskSpace; - }, - ClaimDiskReserveCallback); - } - else - { - if (Ctx.Settings.Verbose) + m_Bucket.m_SlogFile.Append(MovedEntries); + Stats.RemovedDisk += FreedDiskSpace; + }, + ClaimDiskReserveCallback); + } + else { - ZEN_INFO("GCV2: cachebucket [COMPACT] '{}': skipped compacting of {} eligible blocks", - m_Bucket.m_BucketDir, - BlocksToCompact.size()); + if (Ctx.Settings.Verbose) + { + ZEN_INFO("GCV2: cachebucket [COMPACT] '{}': skipped compacting of {} eligible blocks", + m_Bucket.m_BucketDir, + BlocksToCompact.size()); + } } } } -- cgit v1.2.3