aboutsummaryrefslogtreecommitdiff
path: root/src/zenstore/cache/structuredcachestore.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2025-12-04 16:20:58 +0100
committerGitHub Enterprise <[email protected]>2025-12-04 16:20:58 +0100
commitec69a0d3d8febf15aa5df347e514c5071c19ff71 (patch)
tree51a38b7394243281d1378f803a75a277c098edf9 /src/zenstore/cache/structuredcachestore.cpp
parentadd checks to protect against access violation due to failed disk read (#675) (diff)
downloadzen-ec69a0d3d8febf15aa5df347e514c5071c19ff71.tar.xz
zen-ec69a0d3d8febf15aa5df347e514c5071c19ff71.zip
batch op not in destructor (#676)
* use fixed vectors for batch requests * refactor cache batch value put/get to not execute code that can throw execeptions in destructor * extend test with multi-bucket requests
Diffstat (limited to 'src/zenstore/cache/structuredcachestore.cpp')
-rw-r--r--src/zenstore/cache/structuredcachestore.cpp122
1 files changed, 77 insertions, 45 deletions
diff --git a/src/zenstore/cache/structuredcachestore.cpp b/src/zenstore/cache/structuredcachestore.cpp
index c0b433c51..f1cf6e4a4 100644
--- a/src/zenstore/cache/structuredcachestore.cpp
+++ b/src/zenstore/cache/structuredcachestore.cpp
@@ -142,25 +142,32 @@ struct ZenCacheNamespace::PutBatchHandle
};
ZenCacheNamespace::PutBatchHandle*
-ZenCacheNamespace::BeginPutBatch(std::vector<PutResult>& OutResult)
+ZenCacheNamespace::CreatePutBatch(ZenCachePutResultVec_t& OutResult)
{
ZenCacheNamespace::PutBatchHandle* Handle = new ZenCacheNamespace::PutBatchHandle;
- Handle->DiskLayerHandle = m_DiskLayer.BeginPutBatch(OutResult);
+ Handle->DiskLayerHandle = m_DiskLayer.CreatePutBatch(OutResult);
return Handle;
}
void
-ZenCacheNamespace::EndPutBatch(PutBatchHandle* Batch) noexcept
+ZenCacheNamespace::CommitPutBatch(PutBatchHandle* Batch)
+{
+ ZEN_ASSERT(Batch);
+ m_DiskLayer.CommitPutBatch(Batch->DiskLayerHandle);
+}
+
+void
+ZenCacheNamespace::DeletePutBatch(PutBatchHandle* Batch) noexcept
{
try
{
ZEN_ASSERT(Batch);
- m_DiskLayer.EndPutBatch(Batch->DiskLayerHandle);
+ m_DiskLayer.DeletePutBatch(Batch->DiskLayerHandle);
delete Batch;
}
catch (const std::exception& Ex)
{
- ZEN_ERROR("Exception in ZenCacheNamespace::EndPutBatch: '{}'", Ex.what());
+ ZEN_ERROR("Exception in ZenCacheNamespace::DeletePutBatch: '{}'", Ex.what());
}
}
@@ -172,39 +179,46 @@ struct ZenCacheNamespace::GetBatchHandle
};
ZenCacheNamespace::GetBatchHandle*
-ZenCacheNamespace::BeginGetBatch(ZenCacheValueVec_t& OutResult)
+ZenCacheNamespace::CreateGetBatch(ZenCacheValueVec_t& OutResult)
{
ZenCacheNamespace::GetBatchHandle* Handle = new ZenCacheNamespace::GetBatchHandle(OutResult);
- Handle->DiskLayerHandle = m_DiskLayer.BeginGetBatch(OutResult);
+ Handle->DiskLayerHandle = m_DiskLayer.CreateGetBatch(OutResult);
return Handle;
}
void
-ZenCacheNamespace::EndGetBatch(GetBatchHandle* Batch) noexcept
+ZenCacheNamespace::CommitGetBatch(GetBatchHandle* Batch)
{
- try
- {
- ZEN_ASSERT(Batch);
- m_DiskLayer.EndGetBatch(Batch->DiskLayerHandle);
+ ZEN_ASSERT(Batch);
+ m_DiskLayer.CommitGetBatch(Batch->DiskLayerHandle);
- metrics::RequestStats::Scope StatsScope(m_GetOps, 0);
- for (const ZenCacheValue& Result : Batch->Results)
+ metrics::RequestStats::Scope StatsScope(m_GetOps, 0);
+ for (const ZenCacheValue& Result : Batch->Results)
+ {
+ if (Result.Value)
{
- if (Result.Value)
- {
- m_HitCount++;
- StatsScope.SetBytes(Result.Value.Size());
- }
- else
- {
- m_MissCount++;
- }
+ m_HitCount++;
+ StatsScope.SetBytes(Result.Value.Size());
}
+ else
+ {
+ m_MissCount++;
+ }
+ }
+}
+
+void
+ZenCacheNamespace::DeleteGetBatch(GetBatchHandle* Batch) noexcept
+{
+ try
+ {
+ ZEN_ASSERT(Batch);
+ m_DiskLayer.DeleteGetBatch(Batch->DiskLayerHandle);
delete Batch;
}
catch (const std::exception& Ex)
{
- ZEN_ERROR("Exception in ZenCacheNamespace::EndGetBatch: '{}'", Ex.what());
+ ZEN_ERROR("Exception in ZenCacheNamespace::DeleteGetBatch: '{}'", Ex.what());
}
}
@@ -543,13 +557,24 @@ ZenCacheStore::LogWorker()
}
}
-ZenCacheStore::PutBatch::PutBatch(ZenCacheStore& CacheStore, std::string_view InNamespace, std::vector<PutResult>& OutResult)
+ZenCacheStore::PutBatch::PutBatch(ZenCacheStore& CacheStore, std::string_view InNamespace, ZenCachePutResultVec_t& OutResult)
: m_CacheStore(CacheStore)
{
ZEN_MEMSCOPE(GetCacheStoreTag());
if (m_Store = m_CacheStore.GetNamespace(InNamespace); m_Store)
{
- m_NamespaceBatchHandle = m_Store->BeginPutBatch(OutResult);
+ m_NamespaceBatchHandle = m_Store->CreatePutBatch(OutResult);
+ }
+}
+
+void
+ZenCacheStore::PutBatch::Commit()
+{
+ if (m_Store)
+ {
+ ZEN_MEMSCOPE(GetCacheStoreTag());
+ ZEN_ASSERT(m_NamespaceBatchHandle);
+ m_Store->CommitPutBatch(m_NamespaceBatchHandle);
}
}
@@ -557,12 +582,8 @@ ZenCacheStore::PutBatch::~PutBatch()
{
try
{
- if (m_Store)
- {
- ZEN_MEMSCOPE(GetCacheStoreTag());
- ZEN_ASSERT(m_NamespaceBatchHandle);
- m_Store->EndPutBatch(m_NamespaceBatchHandle);
- }
+ ZEN_ASSERT(m_NamespaceBatchHandle);
+ m_Store->DeletePutBatch(m_NamespaceBatchHandle);
}
catch (const std::exception& Ex)
{
@@ -577,7 +598,29 @@ ZenCacheStore::GetBatch::GetBatch(ZenCacheStore& CacheStore, std::string_view In
ZEN_MEMSCOPE(GetCacheStoreTag());
if (m_Store = m_CacheStore.GetNamespace(InNamespace); m_Store)
{
- m_NamespaceBatchHandle = m_Store->BeginGetBatch(OutResult);
+ m_NamespaceBatchHandle = m_Store->CreateGetBatch(OutResult);
+ }
+}
+
+void
+ZenCacheStore::GetBatch::Commit()
+{
+ if (m_Store)
+ {
+ ZEN_MEMSCOPE(GetCacheStoreTag());
+ ZEN_ASSERT(m_NamespaceBatchHandle);
+ m_Store->CommitGetBatch(m_NamespaceBatchHandle);
+
+ metrics::RequestStats::Scope OpScope(m_CacheStore.m_GetOps, 0);
+ for (const ZenCacheValue& Result : Results)
+ {
+ if (Result.Value)
+ {
+ m_CacheStore.m_HitCount++;
+ OpScope.SetBytes(Result.Value.GetSize());
+ }
+ m_CacheStore.m_MissCount++;
+ }
}
}
@@ -589,18 +632,7 @@ ZenCacheStore::GetBatch::~GetBatch()
{
ZEN_MEMSCOPE(GetCacheStoreTag());
ZEN_ASSERT(m_NamespaceBatchHandle);
- m_Store->EndGetBatch(m_NamespaceBatchHandle);
-
- metrics::RequestStats::Scope OpScope(m_CacheStore.m_GetOps, 0);
- for (const ZenCacheValue& Result : Results)
- {
- if (Result.Value)
- {
- m_CacheStore.m_HitCount++;
- OpScope.SetBytes(Result.Value.GetSize());
- }
- m_CacheStore.m_MissCount++;
- }
+ m_Store->DeleteGetBatch(m_NamespaceBatchHandle);
}
}
catch (const std::exception& Ex)