aboutsummaryrefslogtreecommitdiff
path: root/zenserver/cache/cachetracking.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'zenserver/cache/cachetracking.cpp')
-rw-r--r--zenserver/cache/cachetracking.cpp40
1 files changed, 28 insertions, 12 deletions
diff --git a/zenserver/cache/cachetracking.cpp b/zenserver/cache/cachetracking.cpp
index 6a9b2f403..d1c99a597 100644
--- a/zenserver/cache/cachetracking.cpp
+++ b/zenserver/cache/cachetracking.cpp
@@ -49,22 +49,29 @@ public:
Tracker->Track(HashKey);
}
- void SerializeSnapshot(CbObjectWriter& Cbo)
+ bool SerializeSnapshot(CbObjectWriter& Cbo)
{
+ bool Serialized = false;
RwLock::ExclusiveLockScope _(m_Lock);
for (const auto& Kv : m_BucketMapping)
{
- Cbo.BeginArray(Kv.first);
- m_Buckets[Kv.second]->SerializeSnapshotAndClear(Cbo);
- Cbo.EndArray();
+ if (m_Buckets[Kv.second]->Size())
+ {
+ Cbo.BeginArray(Kv.first);
+ m_Buckets[Kv.second]->SerializeSnapshotAndClear(Cbo);
+ Cbo.EndArray();
+ Serialized = true;
+ }
}
+
+ return Serialized;
}
private:
struct BucketTracker
{
- RwLock Lock;
+ mutable RwLock Lock;
tsl::robin_set<IoHash> AccessedKeys;
void Track(const IoHash& HashKey)
@@ -90,6 +97,12 @@ private:
AccessedKeys.clear();
}
+
+ size_t Size() const
+ {
+ RwLock::SharedLockScope _(Lock);
+ return AccessedKeys.size();
+ }
};
BucketTracker* GetBucket(const std::string& BucketName)
@@ -198,15 +211,18 @@ struct ZenCacheTracker::Impl
void SaveSnapshot()
{
CbObjectWriter Cbo;
- m_CurrentSnapshot.SerializeSnapshot(Cbo);
- IoBuffer SnapshotBuffer = Cbo.Save().GetBuffer().AsIoBuffer();
- const KeyStruct Key{.TimestampLittleEndian = ToNetworkOrder(GetCurrentCacheTimeStamp())};
- rocksdb::Slice KeySlice{(const char*)&Key, sizeof Key};
- rocksdb::Slice ValueSlice{(char*)SnapshotBuffer.Data(), SnapshotBuffer.Size()};
+ if (m_CurrentSnapshot.SerializeSnapshot(Cbo))
+ {
+ IoBuffer SnapshotBuffer = Cbo.Save().GetBuffer().AsIoBuffer();
+
+ const KeyStruct Key{.TimestampLittleEndian = ToNetworkOrder(GetCurrentCacheTimeStamp())};
+ rocksdb::Slice KeySlice{(const char*)&Key, sizeof Key};
+ rocksdb::Slice ValueSlice{(char*)SnapshotBuffer.Data(), SnapshotBuffer.Size()};
- rocksdb::WriteOptions Wo;
- m_RocksDb->Put(Wo, KeySlice, ValueSlice);
+ rocksdb::WriteOptions Wo;
+ m_RocksDb->Put(Wo, KeySlice, ValueSlice);
+ }
}
void IterateSnapshots(std::function<void(uint64_t TimeStamp, CbObject Snapshot)>&& Callback)