aboutsummaryrefslogtreecommitdiff
path: root/src/zenstore/compactcas.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-11-22 15:04:53 +0100
committerGitHub <[email protected]>2023-11-22 15:04:53 +0100
commitbb4a0b17c07e5a4f19f56a7c089c49f82aecf2fa (patch)
tree9d24271f495c4e35b5ac9fbc446f4889d435ac9d /src/zenstore/compactcas.cpp
parentUpdate CHANGELOG.md (diff)
downloadzen-bb4a0b17c07e5a4f19f56a7c089c49f82aecf2fa.tar.xz
zen-bb4a0b17c07e5a4f19f56a7c089c49f82aecf2fa.zip
reduce work when there are no blocks to compact (#558)
* reduce work when there are no blocks to compact * fix lock scopes
Diffstat (limited to 'src/zenstore/compactcas.cpp')
-rw-r--r--src/zenstore/compactcas.cpp105
1 files changed, 54 insertions, 51 deletions
diff --git a/src/zenstore/compactcas.cpp b/src/zenstore/compactcas.cpp
index 1d608be8d..02db5f848 100644
--- a/src/zenstore/compactcas.cpp
+++ b/src/zenstore/compactcas.cpp
@@ -604,70 +604,73 @@ public:
m_CasContainerStrategy.m_BlockStore.GetBlocksToCompact(BlockUsage, Ctx.Settings.CompactBlockUsageThresholdPercent);
BlockCompactState.IncludeBlocks(BlocksToCompact);
+ if (BlocksToCompact.size() > 0)
{
- RwLock::SharedLockScope __(m_CasContainerStrategy.m_LocationMapLock);
- for (const auto& Entry : m_CasContainerStrategy.m_LocationMap)
{
- size_t Index = Entry.second;
- const BlockStoreDiskLocation& Loc = m_CasContainerStrategy.m_Locations[Index];
-
- if (!BlockCompactState.AddKeepLocation(Loc.Get(m_CasContainerStrategy.m_PayloadAlignment)))
+ RwLock::SharedLockScope __(m_CasContainerStrategy.m_LocationMapLock);
+ for (const auto& Entry : m_CasContainerStrategy.m_LocationMap)
{
- continue;
+ size_t Index = Entry.second;
+ const BlockStoreDiskLocation& Loc = m_CasContainerStrategy.m_Locations[Index];
+
+ if (!BlockCompactState.AddKeepLocation(Loc.Get(m_CasContainerStrategy.m_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: compactcas [COMPACT] '{}': compacting {} blocks",
- m_CasContainerStrategy.m_RootDirectory / m_CasContainerStrategy.m_ContainerBaseName,
- BlocksToCompact.size());
- }
-
- m_CasContainerStrategy.m_BlockStore.CompactBlocks(
- BlockCompactState,
- m_CasContainerStrategy.m_PayloadAlignment,
- [&](const BlockStore::MovedChunksArray& MovedArray, uint64_t FreedDiskSpace) {
- std::vector<CasDiskIndexEntry> MovedEntries;
- RwLock::ExclusiveLockScope _(m_CasContainerStrategy.m_LocationMapLock);
- for (const std::pair<size_t, BlockStoreLocation>& Moved : MovedArray)
- {
- size_t ChunkIndex = Moved.first;
- const IoHash& Key = BlockCompactStateKeys[ChunkIndex];
+ if (Ctx.Settings.Verbose)
+ {
+ ZEN_INFO("GCV2: compactcas [COMPACT] '{}': compacting {} blocks",
+ m_CasContainerStrategy.m_RootDirectory / m_CasContainerStrategy.m_ContainerBaseName,
+ BlocksToCompact.size());
+ }
- if (auto It = m_CasContainerStrategy.m_LocationMap.find(Key);
- It != m_CasContainerStrategy.m_LocationMap.end())
+ m_CasContainerStrategy.m_BlockStore.CompactBlocks(
+ BlockCompactState,
+ m_CasContainerStrategy.m_PayloadAlignment,
+ [&](const BlockStore::MovedChunksArray& MovedArray, uint64_t FreedDiskSpace) {
+ std::vector<CasDiskIndexEntry> MovedEntries;
+ RwLock::ExclusiveLockScope _(m_CasContainerStrategy.m_LocationMapLock);
+ for (const std::pair<size_t, BlockStoreLocation>& Moved : MovedArray)
{
- BlockStoreDiskLocation& Location = m_CasContainerStrategy.m_Locations[It->second];
- const BlockStoreLocation& OldLocation = BlockCompactState.GetLocation(ChunkIndex);
- if (Location.Get(m_CasContainerStrategy.m_PayloadAlignment) != OldLocation)
+ size_t ChunkIndex = Moved.first;
+ const IoHash& Key = BlockCompactStateKeys[ChunkIndex];
+
+ if (auto It = m_CasContainerStrategy.m_LocationMap.find(Key);
+ It != m_CasContainerStrategy.m_LocationMap.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;
+ BlockStoreDiskLocation& Location = m_CasContainerStrategy.m_Locations[It->second];
+ const BlockStoreLocation& OldLocation = BlockCompactState.GetLocation(ChunkIndex);
+ if (Location.Get(m_CasContainerStrategy.m_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;
+
+ Location = BlockStoreDiskLocation(NewLocation, m_CasContainerStrategy.m_PayloadAlignment);
+ MovedEntries.push_back(CasDiskIndexEntry{.Key = Key, .Location = Location});
}
- const BlockStoreLocation& NewLocation = Moved.second;
-
- Location = BlockStoreDiskLocation(NewLocation, m_CasContainerStrategy.m_PayloadAlignment);
- MovedEntries.push_back(CasDiskIndexEntry{.Key = Key, .Location = Location});
}
- }
- m_CasContainerStrategy.m_CasLog.Append(MovedEntries);
- Stats.RemovedDisk += FreedDiskSpace;
- },
- ClaimDiskReserveCallback);
- }
- else
- {
- if (Ctx.Settings.Verbose)
+ m_CasContainerStrategy.m_CasLog.Append(MovedEntries);
+ Stats.RemovedDisk += FreedDiskSpace;
+ },
+ ClaimDiskReserveCallback);
+ }
+ else
{
- ZEN_INFO("GCV2: compactcas [COMPACT] '{}': skipped compacting of {} eligible blocks",
- m_CasContainerStrategy.m_RootDirectory / m_CasContainerStrategy.m_ContainerBaseName,
- BlocksToCompact.size());
+ if (Ctx.Settings.Verbose)
+ {
+ ZEN_INFO("GCV2: compactcas [COMPACT] '{}': skipped compacting of {} eligible blocks",
+ m_CasContainerStrategy.m_RootDirectory / m_CasContainerStrategy.m_ContainerBaseName,
+ BlocksToCompact.size());
+ }
}
}
}