aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/cache/cachedisklayer.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-12-04 08:33:07 -0500
committerGitHub <[email protected]>2023-12-04 14:33:07 +0100
commit0b49aa0c7eca736871488009254b31356c9a32ce (patch)
tree29df6751aae06057662ab1ee114551f414bf4099 /src/zenserver/cache/cachedisklayer.cpp
parentAdd context to Zen upstream resolve error message (#585) (diff)
downloadzen-0b49aa0c7eca736871488009254b31356c9a32ce.tar.xz
zen-0b49aa0c7eca736871488009254b31356c9a32ce.zip
memory usage estimation for memcached entries (#586)
* do a more accurate memory usage estimation for memcached entries * early exit when checking memcache usage
Diffstat (limited to 'src/zenserver/cache/cachedisklayer.cpp')
-rw-r--r--src/zenserver/cache/cachedisklayer.cpp29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/zenserver/cache/cachedisklayer.cpp b/src/zenserver/cache/cachedisklayer.cpp
index 2c344dd1d..05eb9658b 100644
--- a/src/zenserver/cache/cachedisklayer.cpp
+++ b/src/zenserver/cache/cachedisklayer.cpp
@@ -209,6 +209,9 @@ namespace {
zen::Sleep(100);
} while (true);
}
+
+ uint64_t EstimateMemCachePayloadMemory(uint64_t PayloadSize) { return 8u + 32u + RoundUp(PayloadSize, 8u); }
+
} // namespace
namespace fs = std::filesystem;
@@ -1289,14 +1292,26 @@ ZenCacheDiskLayer::CacheBucket::MemCacheTrim(GcClock::TimePoint ExpireTime)
GcClock::Tick ExpireTicks = ExpireTime.time_since_epoch().count();
RwLock::ExclusiveLockScope _(m_IndexLock);
+ if (m_MemCachedPayloads.empty())
+ {
+ return;
+ }
for (const auto& Kv : m_Index)
{
- if (m_AccessTimes[Kv.second] < ExpireTicks)
+ size_t Index = Kv.second;
+ BucketPayload& Payload = m_Payloads[Index];
+ if (!Payload.MemCached)
+ {
+ continue;
+ }
+ if (m_AccessTimes[Index] < ExpireTicks)
{
- BucketPayload& Payload = m_Payloads[Kv.second];
RemoveMemCachedData(Payload);
}
}
+ m_MemCachedPayloads.shrink_to_fit();
+ m_FreeMemCachedPayloads.shrink_to_fit();
+ m_FreeMetaDatas.shrink_to_fit();
}
void
@@ -1305,6 +1320,10 @@ ZenCacheDiskLayer::CacheBucket::GetUsageByAccess(GcClock::TimePoint TickStart,
std::vector<uint64_t>& InOutUsageSlots)
{
RwLock::SharedLockScope _(m_IndexLock);
+ if (m_MemCachedPayloads.empty())
+ {
+ return;
+ }
for (const auto& It : m_Index)
{
size_t Index = It.second;
@@ -2630,7 +2649,7 @@ ZenCacheDiskLayer::CacheBucket::SetMemCachedData(BucketPayload& Payload, IoBuffe
{
Payload.MemCached = MemCachedIndex(gsl::narrow<uint32_t>(m_MemCachedPayloads.size()));
m_MemCachedPayloads.push_back(MemCachedData);
- AddMemCacheUsage(PayloadSize);
+ AddMemCacheUsage(EstimateMemCachePayloadMemory(PayloadSize));
m_MemoryWriteCount++;
}
}
@@ -2639,7 +2658,7 @@ ZenCacheDiskLayer::CacheBucket::SetMemCachedData(BucketPayload& Payload, IoBuffe
Payload.MemCached = m_FreeMemCachedPayloads.back();
m_FreeMemCachedPayloads.pop_back();
m_MemCachedPayloads[Payload.MemCached] = MemCachedData;
- AddMemCacheUsage(PayloadSize);
+ AddMemCacheUsage(EstimateMemCachePayloadMemory(PayloadSize));
m_MemoryWriteCount++;
}
}
@@ -2650,7 +2669,7 @@ ZenCacheDiskLayer::CacheBucket::RemoveMemCachedData(BucketPayload& Payload)
if (Payload.MemCached)
{
size_t PayloadSize = m_MemCachedPayloads[Payload.MemCached].GetSize();
- RemoveMemCacheUsage(PayloadSize);
+ RemoveMemCacheUsage(EstimateMemCachePayloadMemory(PayloadSize));
m_MemCachedPayloads[Payload.MemCached] = IoBuffer{};
m_FreeMemCachedPayloads.push_back(Payload.MemCached);
Payload.MemCached = {};