Skip to content

Commit 8de51e6

Browse files
authored
Introduce a common Shared Cache cache interface (#8590)
1 parent df05bf8 commit 8de51e6

File tree

4 files changed

+46
-53
lines changed

4 files changed

+46
-53
lines changed

ydb/core/tablet_flat/shared_sausagecache.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ TSharedPageCacheCounters::TSharedPageCacheCounters(const TIntrusivePtr<::NMonito
3838
namespace NKikimr {
3939
namespace NTabletFlatExecutor {
4040

41+
using namespace NCache;
42+
4143
static bool Satisfies(NLog::EPriority priority = NLog::PRI_DEBUG) {
4244
if (NLog::TSettings *settings = TlsActivationContext->LoggerSettings())
4345
return settings->Satisfies(priority, NKikimrServices::TABLET_SAUSAGECACHE);
@@ -68,7 +70,6 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
6870
{
6971
ui32 State : 4;
7072
ui32 CacheGeneration : 3;
71-
ui32 InMemory : 1;
7273

7374
const ui32 PageId;
7475
const size_t Size;
@@ -78,7 +79,6 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
7879
TPage(ui32 pageId, size_t size, TCollection* collection)
7980
: State(PageStateNo)
8081
, CacheGeneration(TCacheCacheConfig::CacheGenNone)
81-
, InMemory(false)
8282
, PageId(pageId)
8383
, Size(size)
8484
, Collection(collection)
@@ -178,7 +178,7 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
178178
TRequestQueue ScanRequests;
179179

180180
THolder<TSharedPageCacheConfig> Config;
181-
TCacheCache<TPage, TPage::TWeight, TCacheCacheConfig::TDefaultGeneration<TPage>> Cache;
181+
THolder<ICacheCache<TPage>> Cache;
182182

183183
ui64 StatBioReqs = 0;
184184
ui64 StatHitPages = 0;
@@ -193,14 +193,18 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
193193

194194
ui64 MemLimitBytes;
195195

196+
void CreateCache() {
197+
TCacheCacheConfig cacheCacheConfig(1, Config->Counters->FreshBytes, Config->Counters->StagingBytes, Config->Counters->WarmBytes);
198+
Cache = MakeHolder<TCacheCache<TPage, TPage::TWeight, TCacheCacheConfig::TDefaultGeneration<TPage>>>(std::move(cacheCacheConfig));
199+
}
200+
196201
void ActualizeCacheSizeLimit() {
197202
ui64 limitBytes = Min(Config->LimitBytes.value_or(Max<ui64>()), MemLimitBytes);
198203

199204
// limit of cache depends only on config and mem because passive pages may go in and out arbitrary
200205
// we may have some passive bytes, so if we fully fill this Cache we may exceed the limit
201206
// because of that DoGC should be called to ensure limits
202-
// unlimited cache is banned
203-
Cache.UpdateCacheSize(Max<ui64>(1, limitBytes));
207+
Cache->UpdateCacheSize(limitBytes);
204208

205209
if (Config->Counters) {
206210
Config->Counters->ConfigLimitBytes->Set(Config->LimitBytes.value_or(0));
@@ -219,7 +223,7 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
219223
THashSet<TCollection*> recheck;
220224
while (GetStatAllBytes() > MemLimitBytes
221225
|| GetStatAllBytes() > Config->LimitBytes.value_or(Max<ui64>()) && StatActiveBytes > configActiveReservedBytes) {
222-
auto page = Cache.EvictNext();
226+
auto page = Cache->EvictNext();
223227
if (!page) {
224228
break;
225229
}
@@ -366,7 +370,7 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
366370
++*Config->Counters->CacheHitPages;
367371
*Config->Counters->CacheHitBytes += page->Size;
368372
}
369-
Evict(Cache.Touch(page));
373+
Evict(Cache->Touch(page));
370374
break;
371375
case PageStateNo:
372376
++pagesToLoad;
@@ -648,7 +652,7 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
648652
AddActivePage(page);
649653
[[fallthrough]];
650654
case PageStateLoaded:
651-
Evict(Cache.Touch(page));
655+
Evict(Cache->Touch(page));
652656
break;
653657
default:
654658
Y_ABORT("unknown load state");
@@ -749,7 +753,7 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
749753

750754
page->Initialize(std::move(paged.Data));
751755
BodyProvided(collection, paged.PageId, page);
752-
Evict(Cache.Touch(page));
756+
Evict(Cache->Touch(page));
753757
}
754758
}
755759

@@ -882,7 +886,7 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
882886
const TLogoBlobID &pageCollectionId = collectionIt->first;
883887

884888
if (auto logl = Logger->Log(ELnLev::Debug))
885-
logl << "droping pageCollection " << pageCollectionId;
889+
logl << "dropping pageCollection " << pageCollectionId;
886890

887891
for (auto &expe : collection.Expectants) {
888892
for (auto &xpair : expe.second.SourceRequests) {
@@ -901,7 +905,7 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
901905
for (const auto &kv : collection.PageMap) {
902906
auto* page = kv.second.Get();
903907

904-
Cache.Evict(page);
908+
Cache->Erase(page);
905909
page->CacheGeneration = TCacheCacheConfig::CacheGenNone;
906910

907911
if (page->State == PageStateLoaded) {
@@ -1099,8 +1103,8 @@ class TSharedPageCache : public TActorBootstrapped<TSharedPageCache> {
10991103
public:
11001104
TSharedPageCache(THolder<TSharedPageCacheConfig> config)
11011105
: Config(std::move(config))
1102-
, Cache(TCacheCacheConfig(1, Config->Counters->FreshBytes, Config->Counters->StagingBytes, Config->Counters->WarmBytes))
11031106
{
1107+
CreateCache();
11041108
AsyncRequests.Limit = Config->TotalAsyncQueueInFlyLimit;
11051109
ScanRequests.Limit = Config->TotalScanQueueInFlyLimit;
11061110
}

ydb/core/util/cache_cache.h

Lines changed: 8 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
#pragma once
22
#include "defs.h"
3+
#include <ydb/core/util/cache_cache_iface.h>
34
#include <ydb/core/util/queue_oneone_inplace.h>
45
#include <library/cpp/monlib/counters/counters.h>
56
#include <library/cpp/monlib/dynamic_counters/counters.h>
67
#include <util/generic/ptr.h>
78
#include <util/generic/intrlist.h>
89

9-
namespace NKikimr {
10+
namespace NKikimr::NCache {
1011

1112
struct TCacheCacheConfig : public TAtomicRefCount<TCacheCacheConfig> {
1213
using TCounterPtr = ::NMonitoring::TDynamicCounters::TCounterPtr;
@@ -71,7 +72,7 @@ template <typename TItem
7172
, typename TWeight = TCacheCacheConfig::TDefaultWeight<TItem>
7273
, typename TGeneration = TCacheCacheConfig::TDefaultGeneration<TItem>
7374
>
74-
class TCacheCache {
75+
class TCacheCache : public ICacheCache<TItem> {
7576
public:
7677
TCacheCache(const TCacheCacheConfig &config)
7778
: Config(config)
@@ -80,7 +81,7 @@ class TCacheCache {
8081
, WarmWeight(0)
8182
{}
8283

83-
TItem* EvictNext() {
84+
TItem* EvictNext() override {
8485
TItem* ret = nullptr;
8586

8687
if (!StagingList.Empty()) {
@@ -101,7 +102,7 @@ class TCacheCache {
101102
}
102103

103104
// returns evicted elements as list
104-
TIntrusiveList<TItem> Touch(TItem *item) {
105+
TIntrusiveList<TItem> Touch(TItem *item) override {
105106
TIntrusiveList<TItem> evictedList;
106107
TIntrusiveListItem<TItem> *xitem = item;
107108

@@ -130,8 +131,7 @@ class TCacheCache {
130131
return evictedList;
131132
}
132133

133-
// evict and erase differs on Evicted handling
134-
void Evict(TItem *item) {
134+
void Erase(TItem *item) override {
135135
const TCacheCacheConfig::ECacheGeneration cacheGen = GenerationOp.Get(item);
136136
switch (cacheGen) {
137137
case TCacheCacheConfig::CacheGenNone:
@@ -153,43 +153,11 @@ class TCacheCache {
153153
*Config.ReportedWarm = WarmWeight;
154154
break;
155155
default:
156-
Y_DEBUG_ABORT("unknown cache generaton");
156+
Y_DEBUG_ABORT("unknown cache generation");
157157
}
158158
}
159159

160-
void Erase(TItem *item) {
161-
const TCacheCacheConfig::ECacheGeneration cacheGen = GenerationOp.Get(item);
162-
switch (cacheGen) {
163-
case TCacheCacheConfig::CacheGenNone:
164-
break;
165-
case TCacheCacheConfig::CacheGenEvicted:
166-
item->Unlink();
167-
GenerationOp.Set(item, TCacheCacheConfig::CacheGenNone);
168-
break;
169-
case TCacheCacheConfig::CacheGenFresh:
170-
Unlink(item, FreshWeight);
171-
if (Config.ReportedFresh)
172-
*Config.ReportedFresh = FreshWeight;
173-
break;
174-
case TCacheCacheConfig::CacheGenStaging:
175-
Unlink(item, StagingWeight);
176-
if (Config.ReportedStaging)
177-
*Config.ReportedStaging = StagingWeight;
178-
break;
179-
case TCacheCacheConfig::CacheGenWarm:
180-
Unlink(item, WarmWeight);
181-
if (Config.ReportedWarm)
182-
*Config.ReportedWarm = WarmWeight;
183-
break;
184-
default:
185-
Y_DEBUG_ABORT("unknown cache generaton");
186-
}
187-
}
188-
189-
void UpdateCacheSize(ui64 cacheSize) {
190-
if (cacheSize == 0)
191-
cacheSize = Max<ui64>();
192-
160+
void UpdateCacheSize(ui64 cacheSize) override {
193161
Config.SetLimit(cacheSize);
194162
}
195163

ydb/core/util/cache_cache_iface.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#pragma once
2+
#include "defs.h"
3+
4+
namespace NKikimr::NCache {
5+
6+
template <typename TItem>
7+
struct ICacheCache {
8+
virtual TItem* EvictNext() Y_WARN_UNUSED_RESULT = 0;
9+
10+
// returns evicted elements as list
11+
virtual TIntrusiveList<TItem> Touch(TItem *item) Y_WARN_UNUSED_RESULT = 0;
12+
13+
virtual void Erase(TItem *item) = 0;
14+
15+
// WARN: do not evict items
16+
virtual void UpdateCacheSize(ui64 cacheSize) = 0;
17+
18+
virtual ~ICacheCache() = default;
19+
};
20+
21+
}

ydb/core/util/cache_cache_ut.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "cache_cache.h"
22
#include <library/cpp/testing/unittest/registar.h>
33

4-
namespace NKikimr {
4+
namespace NKikimr::NCache {
55

66
Y_UNIT_TEST_SUITE(TCacheCacheTest) {
77

0 commit comments

Comments
 (0)