aboutsummaryrefslogtreecommitdiff
path: root/zenstore/compactcas.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-03-22 22:59:53 +0100
committerDan Engelbrecht <[email protected]>2022-03-31 11:29:26 +0200
commit0b410ddd6e5862d55656fd84f643106900dbb92e (patch)
treee3d6e614970c64d6165fb4fcfca7cd4045a11e67 /zenstore/compactcas.cpp
parentProper stats for Moved Chunks (diff)
downloadzen-0b410ddd6e5862d55656fd84f643106900dbb92e.tar.xz
zen-0b410ddd6e5862d55656fd84f643106900dbb92e.zip
Try to recreate gc reserve after successful garbage collect if it is not present
Diffstat (limited to 'zenstore/compactcas.cpp')
-rw-r--r--zenstore/compactcas.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/zenstore/compactcas.cpp b/zenstore/compactcas.cpp
index 00149593b..4e379194a 100644
--- a/zenstore/compactcas.cpp
+++ b/zenstore/compactcas.cpp
@@ -820,6 +820,35 @@ CasContainerStrategy::CollectGarbage(GcContext& GcCtx)
DeletedChunks.size(),
MovedChunks.size(),
TotalChunkCount);
+
+ std::filesystem::path GCReservePath = m_Config.RootDirectory / (m_ContainerBaseName + ".gc.reserve.ucas");
+ if (std::filesystem::is_regular_file(GCReservePath))
+ {
+ return;
+ }
+
+ std::error_code Error;
+ DiskSpace Space = DiskSpaceInfo(m_Config.RootDirectory, Error);
+ if (Error)
+ {
+ ZEN_ERROR("get disk space in {} FAILED, reason '{}'", m_ContainerBaseName, Error.message());
+ return;
+ }
+ if (Space.Free < m_MaxBlockSize)
+ {
+ ZEN_INFO("not enough space for garbage collect reserve '{}' FAILED, required disk space {}, free {}",
+ m_Config.RootDirectory / m_ContainerBaseName,
+ m_MaxBlockSize,
+ NiceBytes(Space.Free));
+ return;
+ }
+ BasicFile GCReserveFile;
+ GCReserveFile.Open(GCReservePath, true);
+ GCReserveFile.SetFileSize(m_MaxBlockSize);
+
+ ZEN_DEBUG("recreated garbage collect reserve '{}' FAILED, {} bytes",
+ m_Config.RootDirectory / m_ContainerBaseName,
+ NiceBytes(Space.Free));
}
void
@@ -1260,6 +1289,11 @@ CasContainerStrategy::OpenContainer(bool IsNewStore)
{
GCReserveFile.SetFileSize(m_MaxBlockSize);
}
+ else
+ {
+ // We need it to be the proper size if we are to use it
+ std::filesystem::remove(GCReservePath);
+ }
}
}
}