aboutsummaryrefslogtreecommitdiff
path: root/src/zenstore/cache/structuredcachestore.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2025-05-26 14:38:38 +0200
committerGitHub Enterprise <[email protected]>2025-05-26 14:38:38 +0200
commit57622d697585720a54af1c763d43ed782f6d996b (patch)
tree8ba7ccc3d49c115a137f1d4ce11ebfd13cda156b /src/zenstore/cache/structuredcachestore.cpp
parent5.6.8 (diff)
downloadzen-57622d697585720a54af1c763d43ed782f6d996b.tar.xz
zen-57622d697585720a54af1c763d43ed782f6d996b.zip
unblock cache bucket drop (#406)
* don't hold exclusive locks while deleting files from a dropped bucket/namespace * cleaner detection of missing namespace when issuing a drop
Diffstat (limited to 'src/zenstore/cache/structuredcachestore.cpp')
-rw-r--r--src/zenstore/cache/structuredcachestore.cpp42
1 files changed, 28 insertions, 14 deletions
diff --git a/src/zenstore/cache/structuredcachestore.cpp b/src/zenstore/cache/structuredcachestore.cpp
index 7d277329e..5ce254fac 100644
--- a/src/zenstore/cache/structuredcachestore.cpp
+++ b/src/zenstore/cache/structuredcachestore.cpp
@@ -277,11 +277,14 @@ ZenCacheNamespace::DropBucket(std::string_view Bucket)
{
ZEN_INFO("dropping bucket '{}'", Bucket);
- const bool Dropped = m_DiskLayer.DropBucket(Bucket);
-
- ZEN_INFO("bucket '{}' was {}", Bucket, Dropped ? "dropped" : "not found");
-
- return Dropped;
+ std::function<void()> PostDropOp = m_DiskLayer.DropBucket(Bucket);
+ if (!PostDropOp)
+ {
+ ZEN_INFO("bucket '{}' was not found in {}", Bucket, m_RootDir);
+ return false;
+ }
+ PostDropOp();
+ return true;
}
void
@@ -291,7 +294,7 @@ ZenCacheNamespace::EnumerateBucketContents(std::string_view
m_DiskLayer.EnumerateBucketContents(Bucket, Fn);
}
-bool
+std::function<void()>
ZenCacheNamespace::Drop()
{
return m_DiskLayer.Drop();
@@ -786,16 +789,27 @@ ZenCacheStore::DropBucket(std::string_view Namespace, std::string_view Bucket)
bool
ZenCacheStore::DropNamespace(std::string_view InNamespace)
{
- RwLock::SharedLockScope _(m_NamespacesLock);
- if (auto It = m_Namespaces.find(std::string(InNamespace)); It != m_Namespaces.end())
+ std::function<void()> PostDropOp;
{
- ZenCacheNamespace& Namespace = *It->second;
- m_DroppedNamespaces.push_back(std::move(It->second));
- m_Namespaces.erase(It);
- return Namespace.Drop();
+ RwLock::SharedLockScope _(m_NamespacesLock);
+ if (auto It = m_Namespaces.find(std::string(InNamespace)); It != m_Namespaces.end())
+ {
+ ZenCacheNamespace& Namespace = *It->second;
+ m_DroppedNamespaces.push_back(std::move(It->second));
+ m_Namespaces.erase(It);
+ PostDropOp = Namespace.Drop();
+ }
+ else
+ {
+ ZEN_WARN("request for unknown namespace '{}' in ZenCacheStore::DropNamespace", InNamespace);
+ return false;
+ }
}
- ZEN_WARN("request for unknown namespace '{}' in ZenCacheStore::DropNamespace", InNamespace);
- return false;
+ if (PostDropOp)
+ {
+ PostDropOp();
+ }
+ return true;
}
void