From 8d275bde2bd67470dccbba997208810b4280d8f0 Mon Sep 17 00:00:00 2001 From: dskor Date: Thu, 16 Oct 2025 01:40:10 +0300 Subject: TWriteGuard on GetOrNull for ThreadSaveCache with promotion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Find может делать Promote, который мутирует List ( LRUList например: ) commit_hash:dca1db67d45c7faca51cc1251cbe155c7857e362 --- library/cpp/cache/ut/cache_ut.cpp | 51 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'library/cpp/cache/ut/cache_ut.cpp') diff --git a/library/cpp/cache/ut/cache_ut.cpp b/library/cpp/cache/ut/cache_ut.cpp index 16f29b29d1f..c4c829cdb7d 100644 --- a/library/cpp/cache/ut/cache_ut.cpp +++ b/library/cpp/cache/ut/cache_ut.cpp @@ -2,6 +2,10 @@ #include #include +#include +#include +#include + struct TStrokaWeighter { static size_t Weight(const TString& s) { return s.size(); @@ -536,6 +540,53 @@ Y_UNIT_TEST_SUITE(TThreadSafeCacheTest) { } } +Y_UNIT_TEST_SUITE(TThreadSafeLRUCacheMultiThreadTest) { + typedef TThreadSafeLRUCache TCache; + + class TSimpleCallbacks: public TCache::ICallbacks { + public: + TKey GetKey(ui32 i) const override { + return i; + } + TValue* CreateObject(ui32 i) const override { + Y_UNUSED(i); + return nullptr; + } + }; + + Y_UNIT_TEST(GetOrNullMultiThreadTest) { + const size_t poolSize = 8; + const size_t passCnt = 128; + const size_t tasksCnt = 128; + + TRWMutex lock; + TThreadPool pool; + TSimpleCallbacks callbacks; + TCache cache(callbacks, poolSize); + + for (size_t i = 0; i < poolSize; ++i) { + cache.Insert(i, MakeAtomicShared(ToString(i))); + } + + pool.Start(poolSize); + { + TWriteGuard wGruard(lock); + for (size_t i = 0; i < tasksCnt; ++i) { + pool.SafeAddFunc([&lock, &cache]() { + TReadGuard rGuard(lock); + for (size_t j = 0; j < passCnt; ++j) { + UNIT_ASSERT(cache.GetOrNull(RandomNumber(poolSize)) != nullptr); + } + }); + } + } // start race + pool.Stop(); + for (size_t i = 0; i < cache.Size(); ++i) { + UNIT_ASSERT(cache.GetOrNull(i) != nullptr); + } + } +} + Y_UNIT_TEST_SUITE(TThreadSafeCacheUnsafeTest) { typedef TThreadSafeCache TCache; -- cgit v1.3