aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/cache
diff options
context:
space:
mode:
authorheios <heios@yandex-team.ru>2022-02-10 16:50:15 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:50:15 +0300
commit58861ee1428f6e29c13edd982e662c38dd44c105 (patch)
tree5d5cb817648f650d76cf1076100726fd9b8448e8 /library/cpp/cache
parente0ff5d1ed8ec4db4bba3153fc3c3acb85052ada9 (diff)
downloadydb-58861ee1428f6e29c13edd982e662c38dd44c105.tar.gz
Restoring authorship annotation for <heios@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'library/cpp/cache')
-rw-r--r--library/cpp/cache/thread_safe_cache.h82
-rw-r--r--library/cpp/cache/ut/cache_ut.cpp356
2 files changed, 219 insertions, 219 deletions
diff --git a/library/cpp/cache/thread_safe_cache.h b/library/cpp/cache/thread_safe_cache.h
index 6c3305af2e..71e1442717 100644
--- a/library/cpp/cache/thread_safe_cache.h
+++ b/library/cpp/cache/thread_safe_cache.h
@@ -6,13 +6,13 @@
#include <util/system/rwlock.h>
namespace NPrivate {
- // We are interested in getters promotion policy _here_ because of Read-Write-Lock optimizations.
- enum class EGettersPromotionPolicy {
- Promoted, // LRU, TLRU, MRU, etc.
- Unpromoted // FIFO, LIFO, LW, etc.
- };
-
- template <class Key, class Value, template <class, class> class List, EGettersPromotionPolicy GettersPromotionPolicy, class... TArgs>
+ // We are interested in getters promotion policy _here_ because of Read-Write-Lock optimizations.
+ enum class EGettersPromotionPolicy {
+ Promoted, // LRU, TLRU, MRU, etc.
+ Unpromoted // FIFO, LIFO, LW, etc.
+ };
+
+ template <class Key, class Value, template <class, class> class List, EGettersPromotionPolicy GettersPromotionPolicy, class... TArgs>
class TThreadSafeCache {
public:
using TPtr = TAtomicSharedPtr<Value>;
@@ -21,7 +21,7 @@ namespace NPrivate {
public:
using TKey = Key;
using TValue = Value;
- using TOwner = TThreadSafeCache<Key, Value, List, GettersPromotionPolicy, TArgs...>;
+ using TOwner = TThreadSafeCache<Key, Value, List, GettersPromotionPolicy, TArgs...>;
public:
virtual ~ICallbacks() = default;
@@ -96,30 +96,30 @@ namespace NPrivate {
return TThreadSafeCacheSingleton<TCallbacks>::Clear();
}
- size_t GetMaxSize() const {
- TReadGuard w(Mutex);
- return Cache.GetMaxSize();
- }
-
- void SetMaxSize(size_t newSize) {
- TWriteGuard w(Mutex);
- Cache.SetMaxSize(newSize);
- }
-
+ size_t GetMaxSize() const {
+ TReadGuard w(Mutex);
+ return Cache.GetMaxSize();
+ }
+
+ void SetMaxSize(size_t newSize) {
+ TWriteGuard w(Mutex);
+ Cache.SetMaxSize(newSize);
+ }
+
private:
template <bool AllowNullValues>
const TPtr GetValue(TArgs... args) const {
Key key = Callbacks.GetKey(args...);
- switch (GettersPromotionPolicy) {
- case EGettersPromotionPolicy::Promoted:
- break;
- case EGettersPromotionPolicy::Unpromoted: {
- TReadGuard r(Mutex);
- typename TInternalCache::TIterator i = Cache.FindWithoutPromote(key);
- if (i != Cache.End()) {
- return i.Value();
- }
- break;
+ switch (GettersPromotionPolicy) {
+ case EGettersPromotionPolicy::Promoted:
+ break;
+ case EGettersPromotionPolicy::Unpromoted: {
+ TReadGuard r(Mutex);
+ typename TInternalCache::TIterator i = Cache.FindWithoutPromote(key);
+ if (i != Cache.End()) {
+ return i.Value();
+ }
+ break;
}
}
TWriteGuard w(Mutex);
@@ -180,22 +180,22 @@ namespace NPrivate {
using TListType = TLWList<TKey, TValue, int, TConstWeighter<TValue>>;
template <class TKey, class TValue, class... TArgs>
- using TCache = TThreadSafeCache<TKey, TValue, TListType, EGettersPromotionPolicy::Unpromoted, TArgs...>;
+ using TCache = TThreadSafeCache<TKey, TValue, TListType, EGettersPromotionPolicy::Unpromoted, TArgs...>;
+ };
+
+ struct TLRUHelper {
+ template <class TKey, class TValue>
+ using TListType = TLRUList<TKey, TValue>;
+
+ template <class TKey, class TValue, class... TArgs>
+ using TCache = TThreadSafeCache<TKey, TValue, TListType, EGettersPromotionPolicy::Promoted, TArgs...>;
};
- struct TLRUHelper {
- template <class TKey, class TValue>
- using TListType = TLRUList<TKey, TValue>;
-
- template <class TKey, class TValue, class... TArgs>
- using TCache = TThreadSafeCache<TKey, TValue, TListType, EGettersPromotionPolicy::Promoted, TArgs...>;
- };
-
}
template <class TKey, class TValue, class... TArgs>
using TThreadSafeCache = typename NPrivate::TLWHelper::template TCache<TKey, TValue, TArgs...>;
-
-template <class TKey, class TValue, class... TArgs>
-using TThreadSafeLRUCache = typename NPrivate::TLRUHelper::template TCache<TKey, TValue, TArgs...>;
-
+
+template <class TKey, class TValue, class... TArgs>
+using TThreadSafeLRUCache = typename NPrivate::TLRUHelper::template TCache<TKey, TValue, TArgs...>;
+
diff --git a/library/cpp/cache/ut/cache_ut.cpp b/library/cpp/cache/ut/cache_ut.cpp
index e1e37eddd7..329872cfde 100644
--- a/library/cpp/cache/ut/cache_ut.cpp
+++ b/library/cpp/cache/ut/cache_ut.cpp
@@ -438,181 +438,181 @@ Y_UNIT_TEST_SUITE(TThreadSafeCacheUnsafeTest) {
}
}
}
-
-Y_UNIT_TEST_SUITE(TThreadSafeLRUCacheTest) {
- typedef TThreadSafeLRUCache<size_t, TString, size_t> TCache;
-
- TVector<TString> Values = {"zero", "one", "two", "three", "four"};
-
- class TCallbacks: public TCache::ICallbacks {
- public:
- TKey GetKey(size_t i) const override {
- return i;
- }
- TValue* CreateObject(size_t i) const override {
- UNIT_ASSERT(i < Values.size());
- Creations++;
- return new TString(Values[i]);
- }
-
- mutable size_t Creations = 0;
- };
-
- Y_UNIT_TEST(SimpleTest) {
- for (size_t i = 0; i < Values.size(); ++i) {
- const TString data = *TCache::Get<TCallbacks>(i);
- UNIT_ASSERT(data == Values[i]);
- }
- }
-
- Y_UNIT_TEST(InsertUpdateTest) {
- TCallbacks callbacks;
- TCache cache(callbacks, 10);
-
- cache.Insert(2, MakeAtomicShared<TString>("hj"));
- TAtomicSharedPtr<TString> item = cache.Get(2);
-
- UNIT_ASSERT(callbacks.Creations == 0);
- UNIT_ASSERT(*item == "hj");
-
- cache.Insert(2, MakeAtomicShared<TString>("hjk"));
- item = cache.Get(2);
-
- UNIT_ASSERT(callbacks.Creations == 0);
- UNIT_ASSERT(*item == "hj");
-
- cache.Update(2, MakeAtomicShared<TString>("hjk"));
- item = cache.Get(2);
-
- UNIT_ASSERT(callbacks.Creations == 0);
- UNIT_ASSERT(*item == "hjk");
- }
-
- Y_UNIT_TEST(LRUTest) {
- TCallbacks callbacks;
- TCache cache(callbacks, 3);
-
- UNIT_ASSERT_EQUAL(cache.GetMaxSize(), 3);
-
- for (size_t i = 0; i < Values.size(); ++i) {
- TAtomicSharedPtr<TString> item = cache.Get(i);
- UNIT_ASSERT(*item == Values[i]);
- }
- UNIT_ASSERT(callbacks.Creations == Values.size());
-
- size_t expectedCreations = Values.size();
- TAtomicSharedPtr<TString> item;
-
-
- item = cache.Get(4);
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "four");
-
- item = cache.Get(2);
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "two");
-
- item = cache.Get(0);
- expectedCreations++;
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "zero");
-
- UNIT_ASSERT(cache.Contains(1) == false);
- UNIT_ASSERT(cache.Contains(3) == false);
- UNIT_ASSERT(cache.Contains(4));
- UNIT_ASSERT(cache.Contains(2));
- UNIT_ASSERT(cache.Contains(0));
-
- item = cache.Get(3);
- expectedCreations++;
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "three");
-
- item = cache.Get(2);
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "two");
-
- item = cache.Get(0);
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "zero");
-
- item = cache.Get(1);
- expectedCreations++;
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "one");
-
- item = cache.Get(2);
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "two");
-
- item = cache.Get(4);
- expectedCreations++;
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "four");
- }
-
- Y_UNIT_TEST(ChangeMaxSizeTest) {
- TCallbacks callbacks;
- TCache cache(callbacks, 3);
-
- UNIT_ASSERT_EQUAL(cache.GetMaxSize(), 3);
-
- for (size_t i = 0; i < Values.size(); ++i) {
- TAtomicSharedPtr<TString> item = cache.Get(i);
- UNIT_ASSERT(*item == Values[i]);
- }
-
- size_t expectedCreations = Values.size();
- TAtomicSharedPtr<TString> item;
-
- item = cache.Get(4);
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "four");
-
- item = cache.Get(3);
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "three");
-
- item = cache.Get(2);
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "two");
-
- item = cache.Get(1);
- expectedCreations++;
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "one");
-
- cache.SetMaxSize(4);
-
- item = cache.Get(0);
- expectedCreations++;
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "zero");
-
- item = cache.Get(4);
- expectedCreations++;
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "four");
-
- item = cache.Get(3);
- expectedCreations++;
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "three");
- UNIT_ASSERT(cache.Contains(2) == false);
-
- cache.SetMaxSize(2);
- UNIT_ASSERT(cache.Contains(3));
- UNIT_ASSERT(cache.Contains(4));
- UNIT_ASSERT(cache.Contains(2) == false);
- UNIT_ASSERT(cache.Contains(1) == false);
- UNIT_ASSERT(cache.Contains(0) == false);
-
- item = cache.Get(0);
- expectedCreations++;
- UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
- UNIT_ASSERT(*item == "zero");
- UNIT_ASSERT(cache.Contains(4) == false);
- UNIT_ASSERT(cache.Contains(3));
- UNIT_ASSERT(cache.Contains(0));
- }
-}
+
+Y_UNIT_TEST_SUITE(TThreadSafeLRUCacheTest) {
+ typedef TThreadSafeLRUCache<size_t, TString, size_t> TCache;
+
+ TVector<TString> Values = {"zero", "one", "two", "three", "four"};
+
+ class TCallbacks: public TCache::ICallbacks {
+ public:
+ TKey GetKey(size_t i) const override {
+ return i;
+ }
+ TValue* CreateObject(size_t i) const override {
+ UNIT_ASSERT(i < Values.size());
+ Creations++;
+ return new TString(Values[i]);
+ }
+
+ mutable size_t Creations = 0;
+ };
+
+ Y_UNIT_TEST(SimpleTest) {
+ for (size_t i = 0; i < Values.size(); ++i) {
+ const TString data = *TCache::Get<TCallbacks>(i);
+ UNIT_ASSERT(data == Values[i]);
+ }
+ }
+
+ Y_UNIT_TEST(InsertUpdateTest) {
+ TCallbacks callbacks;
+ TCache cache(callbacks, 10);
+
+ cache.Insert(2, MakeAtomicShared<TString>("hj"));
+ TAtomicSharedPtr<TString> item = cache.Get(2);
+
+ UNIT_ASSERT(callbacks.Creations == 0);
+ UNIT_ASSERT(*item == "hj");
+
+ cache.Insert(2, MakeAtomicShared<TString>("hjk"));
+ item = cache.Get(2);
+
+ UNIT_ASSERT(callbacks.Creations == 0);
+ UNIT_ASSERT(*item == "hj");
+
+ cache.Update(2, MakeAtomicShared<TString>("hjk"));
+ item = cache.Get(2);
+
+ UNIT_ASSERT(callbacks.Creations == 0);
+ UNIT_ASSERT(*item == "hjk");
+ }
+
+ Y_UNIT_TEST(LRUTest) {
+ TCallbacks callbacks;
+ TCache cache(callbacks, 3);
+
+ UNIT_ASSERT_EQUAL(cache.GetMaxSize(), 3);
+
+ for (size_t i = 0; i < Values.size(); ++i) {
+ TAtomicSharedPtr<TString> item = cache.Get(i);
+ UNIT_ASSERT(*item == Values[i]);
+ }
+ UNIT_ASSERT(callbacks.Creations == Values.size());
+
+ size_t expectedCreations = Values.size();
+ TAtomicSharedPtr<TString> item;
+
+
+ item = cache.Get(4);
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "four");
+
+ item = cache.Get(2);
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "two");
+
+ item = cache.Get(0);
+ expectedCreations++;
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "zero");
+
+ UNIT_ASSERT(cache.Contains(1) == false);
+ UNIT_ASSERT(cache.Contains(3) == false);
+ UNIT_ASSERT(cache.Contains(4));
+ UNIT_ASSERT(cache.Contains(2));
+ UNIT_ASSERT(cache.Contains(0));
+
+ item = cache.Get(3);
+ expectedCreations++;
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "three");
+
+ item = cache.Get(2);
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "two");
+
+ item = cache.Get(0);
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "zero");
+
+ item = cache.Get(1);
+ expectedCreations++;
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "one");
+
+ item = cache.Get(2);
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "two");
+
+ item = cache.Get(4);
+ expectedCreations++;
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "four");
+ }
+
+ Y_UNIT_TEST(ChangeMaxSizeTest) {
+ TCallbacks callbacks;
+ TCache cache(callbacks, 3);
+
+ UNIT_ASSERT_EQUAL(cache.GetMaxSize(), 3);
+
+ for (size_t i = 0; i < Values.size(); ++i) {
+ TAtomicSharedPtr<TString> item = cache.Get(i);
+ UNIT_ASSERT(*item == Values[i]);
+ }
+
+ size_t expectedCreations = Values.size();
+ TAtomicSharedPtr<TString> item;
+
+ item = cache.Get(4);
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "four");
+
+ item = cache.Get(3);
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "three");
+
+ item = cache.Get(2);
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "two");
+
+ item = cache.Get(1);
+ expectedCreations++;
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "one");
+
+ cache.SetMaxSize(4);
+
+ item = cache.Get(0);
+ expectedCreations++;
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "zero");
+
+ item = cache.Get(4);
+ expectedCreations++;
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "four");
+
+ item = cache.Get(3);
+ expectedCreations++;
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "three");
+ UNIT_ASSERT(cache.Contains(2) == false);
+
+ cache.SetMaxSize(2);
+ UNIT_ASSERT(cache.Contains(3));
+ UNIT_ASSERT(cache.Contains(4));
+ UNIT_ASSERT(cache.Contains(2) == false);
+ UNIT_ASSERT(cache.Contains(1) == false);
+ UNIT_ASSERT(cache.Contains(0) == false);
+
+ item = cache.Get(0);
+ expectedCreations++;
+ UNIT_ASSERT_EQUAL(callbacks.Creations, expectedCreations);
+ UNIT_ASSERT(*item == "zero");
+ UNIT_ASSERT(cache.Contains(4) == false);
+ UNIT_ASSERT(cache.Contains(3));
+ UNIT_ASSERT(cache.Contains(0));
+ }
+}