@@ -10,115 +10,20 @@ namespace NKikimr::NSharedCache {
10
10
class TTieredCache {
11
11
using TCounterPtr = ::NMonitoring::TDynamicCounters::TCounterPtr;
12
12
using TReplacementPolicy = NKikimrSharedCache::TReplacementPolicy;
13
-
14
- class TCacheTier {
15
- public:
16
- template <typename TCacheBuilder>
17
- TCacheTier (ui64 limit, TCacheBuilder createCache, ECacheTier tier, TReplacementPolicy policy, TSharedPageCacheCounters& cacheCounters)
18
- : Cache(TSwitchableCache<TPage, TPageTraits>(limit, createCache(), cacheCounters.ReplacementPolicySize(policy)))
19
- , Tier(tier)
20
- , ActivePagesCounter(cacheCounters.ActivePagesTier(tier))
21
- , ActiveBytesCounter(cacheCounters.ActiveBytesTier(tier))
22
- , LimitBytesCounter(cacheCounters.LimitBytesTier(tier))
23
- {
24
- LimitBytesCounter->Set (limit);
25
- }
26
-
27
- TIntrusiveList<TPage> Switch (THolder<ICacheCache<TPage>>&& cache, TCounterPtr sizeCounter) Y_WARN_UNUSED_RESULT {
28
- return ProcessEvicted (Cache.Switch (std::move (cache), std::move (sizeCounter)));
29
- }
30
-
31
- TIntrusiveList<TPage> EvictNext () Y_WARN_UNUSED_RESULT {
32
- return ProcessEvicted (Cache.EvictNext ());
33
- }
34
-
35
- TIntrusiveList<TPage> Touch (TPage *page) Y_WARN_UNUSED_RESULT {
36
- ECacheTier tier = TPageTraits::GetTier (page);
37
- if (tier == ECacheTier::None) {
38
- tier = Tier;
39
- TPageTraits::SetTier (page, tier);
40
- ActivePagesCounter->Inc ();
41
- ActiveBytesCounter->Add (TPageTraits::GetSize (page));
42
- }
43
- return ProcessEvicted (Cache.Touch (page));
44
- }
45
-
46
- void Erase (TPage *page) {
47
- ActivePagesCounter->Dec ();
48
- ActiveBytesCounter->Sub (TPageTraits::GetSize (page));
49
- TPageTraits::SetTier (page, ECacheTier::None);
50
- Cache.Erase (page);
51
- }
52
-
53
- void UpdateLimit (ui64 limit) {
54
- Cache.UpdateLimit (limit);
55
- LimitBytesCounter->Set (limit);
56
- }
57
-
58
- ui64 GetSize () const {
59
- return Cache.GetSize ();
60
- }
61
-
62
- TString Dump () const {
63
- return TStringBuilder () << Tier << " Tier: " << Cache.Dump ();
64
- }
65
-
66
- private:
67
-
68
- TIntrusiveList<TPage> ProcessEvicted (TIntrusiveList<TPage>&& evictedList) Y_WARN_UNUSED_RESULT {
69
- if (evictedList.Empty ()) {
70
- return evictedList;
71
- }
72
-
73
- ui64 evictedPages = 0 ;
74
- ui64 evictedSize = 0 ;
75
-
76
- for (auto & page_ : evictedList) {
77
- TPage* page = &page_;
78
- TPageTraits::SetTier (page, ECacheTier::None);
79
- ++evictedPages;
80
- evictedSize += TPageTraits::GetSize (page);
81
- }
82
-
83
- ActivePagesCounter->Sub (evictedPages);
84
- ActiveBytesCounter->Sub (evictedSize);
85
-
86
- return evictedList;
87
- }
88
-
89
- private:
90
- TSwitchableCache<TPage, TPageTraits> Cache;
91
- ECacheTier Tier;
92
- TCounterPtr ActivePagesCounter;
93
- TCounterPtr ActiveBytesCounter;
94
- TCounterPtr LimitBytesCounter;
95
- };
13
+ using TCache = TSwitchableCache<TPage, TPageTraits>;
96
14
97
15
public:
98
16
template <typename TCacheBuilder>
99
17
TTieredCache (ui64 limit, TCacheBuilder createCache, TReplacementPolicy policy, TSharedPageCacheCounters& cacheCounters)
100
18
: CacheTiers(::Reserve(2 ))
101
19
{
102
- CacheTiers.emplace_back (limit, createCache, ECacheTier::Regular, policy, cacheCounters);
20
+ CacheTiers.emplace_back (limit, createCache (), cacheCounters. ReplacementPolicySize (policy) );
103
21
RegularTier = &CacheTiers.back ();
104
22
105
- CacheTiers.emplace_back (0 , createCache, ECacheTier::TryKeepInMemory, policy, cacheCounters);
23
+ CacheTiers.emplace_back (0 , createCache (), cacheCounters. ReplacementPolicySize (policy) );
106
24
TryInMemoryTier = &CacheTiers.back ();
107
25
}
108
26
109
- TIntrusiveList<TPage> TryMove (TPage *page, ECacheTier targetTier) Y_WARN_UNUSED_RESULT {
110
- ECacheTier sourceTier = TPageTraits::GetTier (page);
111
- Y_ENSURE (targetTier != ECacheTier::None);
112
-
113
- if (sourceTier == ECacheTier::None || sourceTier == targetTier) {
114
- // nothing to move
115
- return {};
116
- }
117
-
118
- CacheTiers[static_cast <size_t >(sourceTier)].Erase (page);
119
- return CacheTiers[static_cast <size_t >(targetTier)].Touch (page);
120
- }
121
-
122
27
template <typename TCacheBuilder>
123
28
TIntrusiveList<TPage> Switch (TCacheBuilder createCache, TCounterPtr sizeCounter) Y_WARN_UNUSED_RESULT {
124
29
TIntrusiveList<TPage> evictedList;
@@ -140,29 +45,11 @@ namespace NKikimr::NSharedCache {
140
45
141
46
TIntrusiveList<TPage> Touch (TPage *page) Y_WARN_UNUSED_RESULT {
142
47
ECacheTier tier = TPageTraits::GetTier (page);
143
- if (tier == ECacheTier::None) {
144
- return RegularTier->Touch (page);
145
- }
146
48
return CacheTiers[static_cast <size_t >(tier)].Touch (page);
147
49
}
148
50
149
- TIntrusiveList<TPage> MoveTouch (TPage *page, ECacheTier targetTier) Y_WARN_UNUSED_RESULT {
150
- ECacheTier sourceTier = TPageTraits::GetTier (page);
151
- Y_ENSURE (targetTier != ECacheTier::None);
152
-
153
- if (sourceTier != ECacheTier::None && sourceTier != targetTier) {
154
- CacheTiers[static_cast <size_t >(sourceTier)].Erase (page);
155
- }
156
-
157
- return CacheTiers[static_cast <size_t >(targetTier)].Touch (page);
158
- }
159
-
160
51
void Erase (TPage *page) {
161
52
ECacheTier tier = TPageTraits::GetTier (page);
162
- if (tier == ECacheTier::None) {
163
- return ;
164
- }
165
-
166
53
CacheTiers[static_cast <size_t >(tier)].Erase (page);
167
54
}
168
55
@@ -184,22 +71,22 @@ namespace NKikimr::NSharedCache {
184
71
TStringBuilder result;
185
72
bool first = true ;
186
73
187
- for (const auto & cacheTier : CacheTiers) {
74
+ for (size_t i = 0 ; i < CacheTiers. size (); ++i ) {
188
75
if (first) {
189
76
first = false ;
190
77
} else {
191
78
result << " ; " ;
192
79
}
193
- result << cacheTier .Dump ();
80
+ result << static_cast <ECacheTier>(i) << " Tier: " << CacheTiers[i] .Dump ();
194
81
}
195
82
196
83
return result;
197
84
}
198
85
199
86
private:
200
- TVector<TCacheTier > CacheTiers;
201
- TCacheTier * RegularTier;
202
- TCacheTier * TryInMemoryTier;
87
+ TVector<TCache > CacheTiers;
88
+ TCache * RegularTier;
89
+ TCache * TryInMemoryTier;
203
90
};
204
91
205
92
} // namespace NKikimr::NSharedCache
0 commit comments