Skip to content

Commit 946a2cb

Browse files
committed
union template params into TPageTraits
1 parent 8380311 commit 946a2cb

File tree

5 files changed

+160
-219
lines changed

5 files changed

+160
-219
lines changed

ydb/core/tablet_flat/shared_cache_s3fifo.h

Lines changed: 32 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ enum class ES3FIFOPageLocation {
1515
MainQueue
1616
};
1717

18-
template <typename TPageKey
19-
, typename TPageKeyHash
20-
, typename TPageKeyEqual>
18+
template <typename TPageKey, typename TPageTraits>
2119
class TS3FIFOGhostPageQueue {
2220
struct TGhostPage {
2321
TPageKey Key;
@@ -31,13 +29,13 @@ class TS3FIFOGhostPageQueue {
3129

3230
struct TGhostPageHash {
3331
inline size_t operator()(const TGhostPage* ghost) const {
34-
return TPageKeyHash()(ghost->Key);
32+
return ghost->Key.GetHash();
3533
}
3634
};
3735

3836
struct TGhostPageEqual {
3937
inline bool operator()(const TGhostPage* left, const TGhostPage* right) const {
40-
return TPageKeyEqual()(left->Key, right->Key);
38+
return left->Key == right->Key;
4139
}
4240
};
4341

@@ -122,14 +120,7 @@ class TS3FIFOGhostPageQueue {
122120
TDeque<TGhostPage> GhostsQueue;
123121
};
124122

125-
template <typename TPage
126-
, typename TPageKey
127-
, typename TPageKeyHash
128-
, typename TPageKeyEqual
129-
, typename TPageSize
130-
, typename TPageLocation
131-
, typename TPageFrequency
132-
>
123+
template <typename TPage, typename TPageKey, typename TPageTraits>
133124
class TS3FIFOCache : public ICacheCache<TPage> {
134125
struct TLimit {
135126
ui64 SmallQueueLimit;
@@ -176,7 +167,7 @@ class TS3FIFOCache : public ICacheCache<TPage> {
176167
}
177168

178169
TIntrusiveList<TPage> Touch(TPage* page) override {
179-
const ES3FIFOPageLocation location = GetLocation(page);
170+
const ES3FIFOPageLocation location = TPageTraits::GetLocation(page);
180171
switch (location) {
181172
case ES3FIFOPageLocation::SmallQueue:
182173
case ES3FIFOPageLocation::MainQueue: {
@@ -191,7 +182,7 @@ class TS3FIFOCache : public ICacheCache<TPage> {
191182
}
192183

193184
void Erase(TPage* page) override {
194-
const ES3FIFOPageLocation location = GetLocation(page);
185+
const ES3FIFOPageLocation location = TPageTraits::GetLocation(page);
195186
switch (location) {
196187
case ES3FIFOPageLocation::None:
197188
EraseGhost(page);
@@ -206,7 +197,7 @@ class TS3FIFOCache : public ICacheCache<TPage> {
206197
Y_ABORT("Unknown page location");
207198
}
208199

209-
SetFrequency(page, 0);
200+
TPageTraits::SetFrequency(page, 0);
210201
}
211202

212203
void UpdateLimit(ui64 limit) override {
@@ -223,9 +214,9 @@ class TS3FIFOCache : public ICacheCache<TPage> {
223214
for (auto it = queue.Queue.begin(); it != queue.Queue.end(); it++) {
224215
const TPage* page = &*it;
225216
if (count != 0) result << ", ";
226-
result << "{" << GetKey(page).ToString() << " " << GetFrequency(page) << "f " << GetSize(page) << "b}";
217+
result << "{" << TPageTraits::GetKey(page).ToString() << " " << TPageTraits::GetFrequency(page) << "f " << TPageTraits::GetSize(page) << "b}";
227218
count++;
228-
size += GetSize(page);
219+
size += TPageTraits::GetSize(page);
229220
}
230221
Y_DEBUG_ABORT_UNLESS(queue.Size == size);
231222
};
@@ -245,17 +236,17 @@ class TS3FIFOCache : public ICacheCache<TPage> {
245236
while (true) {
246237
if (!SmallQueue.Queue.Empty() && SmallQueue.Size > Limit.SmallQueueLimit) {
247238
TPage* page = Pop(SmallQueue);
248-
if (ui32 frequency = GetFrequency(page); frequency > 1) { // load inserts, first read touches, second read touches
239+
if (ui32 frequency = TPageTraits::GetFrequency(page); frequency > 1) { // load inserts, first read touches, second read touches
249240
Push(MainQueue, page);
250241
} else {
251-
if (frequency) SetFrequency(page, 0);
242+
if (frequency) TPageTraits::SetFrequency(page, 0);
252243
AddGhost(page);
253244
return page;
254245
}
255246
} else if (!MainQueue.Queue.Empty() && MainQueue.Size > Limit.MainQueueLimit) {
256247
TPage* page = Pop(MainQueue);
257-
if (ui32 frequency = GetFrequency(page); frequency > 0) {
258-
SetFrequency(page, frequency - 1);
248+
if (ui32 frequency = TPageTraits::GetFrequency(page); frequency > 0) {
249+
TPageTraits::SetFrequency(page, frequency - 1);
259250
Push(MainQueue, page);
260251
} else {
261252
return page;
@@ -269,19 +260,19 @@ class TS3FIFOCache : public ICacheCache<TPage> {
269260
}
270261

271262
void TouchFast(TPage* page) {
272-
Y_DEBUG_ABORT_UNLESS(GetLocation(page) != ES3FIFOPageLocation::None);
263+
Y_DEBUG_ABORT_UNLESS(TPageTraits::GetLocation(page) != ES3FIFOPageLocation::None);
273264

274-
ui32 frequency = GetFrequency(page);
265+
ui32 frequency = TPageTraits::GetFrequency(page);
275266
if (frequency < 3) {
276-
SetFrequency(page, frequency + 1);
267+
TPageTraits::SetFrequency(page, frequency + 1);
277268
}
278269
}
279270

280271
TIntrusiveList<TPage> Insert(TPage* page) {
281-
Y_DEBUG_ABORT_UNLESS(GetLocation(page) == ES3FIFOPageLocation::None);
272+
Y_DEBUG_ABORT_UNLESS(TPageTraits::GetLocation(page) == ES3FIFOPageLocation::None);
282273

283274
Push(EraseGhost(page) ? MainQueue : SmallQueue, page);
284-
SetFrequency(page, 0);
275+
TPageTraits::SetFrequency(page, 0);
285276

286277
TIntrusiveList<TPage> evictedList;
287278
while (TPage* evictedPage = EvictOneIfFull()) {
@@ -293,70 +284,46 @@ class TS3FIFOCache : public ICacheCache<TPage> {
293284

294285
TPage* Pop(TQueue& queue) {
295286
Y_DEBUG_ABORT_UNLESS(!queue.Queue.Empty());
296-
Y_ABORT_UNLESS(GetLocation(queue.Queue.Front()) == queue.Location);
297-
Y_ABORT_UNLESS(queue.Size >= GetSize(queue.Queue.Front()));
287+
Y_ABORT_UNLESS(TPageTraits::GetLocation(queue.Queue.Front()) == queue.Location);
288+
Y_ABORT_UNLESS(queue.Size >= TPageTraits::GetSize(queue.Queue.Front()));
298289

299290
TPage* page = queue.Queue.PopFront();
300-
queue.Size -= GetSize(page);
301-
SetLocation(page, ES3FIFOPageLocation::None);
291+
queue.Size -= TPageTraits::GetSize(page);
292+
TPageTraits::SetLocation(page, ES3FIFOPageLocation::None);
302293

303294
return page;
304295
}
305296

306297
void Push(TQueue& queue, TPage* page) {
307-
Y_ABORT_UNLESS(GetLocation(page) == ES3FIFOPageLocation::None);
298+
Y_ABORT_UNLESS(TPageTraits::GetLocation(page) == ES3FIFOPageLocation::None);
308299

309300
queue.Queue.PushBack(page);
310-
queue.Size += GetSize(page);
311-
SetLocation(page, queue.Location);
301+
queue.Size += TPageTraits::GetSize(page);
302+
TPageTraits::SetLocation(page, queue.Location);
312303
}
313304

314305
void Erase(TQueue& queue, TPage* page) {
315-
Y_ABORT_UNLESS(GetLocation(page) == queue.Location);
316-
Y_ABORT_UNLESS(queue.Size >= GetSize(page));
306+
Y_ABORT_UNLESS(TPageTraits::GetLocation(page) == queue.Location);
307+
Y_ABORT_UNLESS(queue.Size >= TPageTraits::GetSize(page));
317308

318309
page->Unlink();
319-
queue.Size -= GetSize(page);
320-
SetLocation(page, ES3FIFOPageLocation::None);
310+
queue.Size -= TPageTraits::GetSize(page);
311+
TPageTraits::SetLocation(page, ES3FIFOPageLocation::None);
321312
}
322313

323314
void AddGhost(const TPage* page) {
324-
GhostQueue.Add(GetKey(page), GetSize(page));
315+
GhostQueue.Add(TPageTraits::GetKey(page), TPageTraits::GetSize(page));
325316
}
326317

327318
bool EraseGhost(const TPage* page) {
328-
return GhostQueue.Erase(GetKey(page), GetSize(page));
329-
}
330-
331-
TPageKey GetKey(const TPage* page) const {
332-
return TPageKey::Get(page);
333-
}
334-
335-
ui64 GetSize(const TPage* page) const {
336-
return TPageSize::Get(page);
337-
}
338-
339-
ES3FIFOPageLocation GetLocation(const TPage* page) const {
340-
return TPageLocation::Get(page);
341-
}
342-
343-
void SetLocation(TPage* page, ES3FIFOPageLocation location) const {
344-
TPageLocation::Set(page, location);
345-
}
346-
347-
ui32 GetFrequency(const TPage* page) const {
348-
return TPageFrequency::Get(page);
349-
}
350-
351-
void SetFrequency(TPage* page, ui32 frequency) const {
352-
TPageFrequency::Set(page, frequency);
319+
return GhostQueue.Erase(TPageTraits::GetKey(page), TPageTraits::GetSize(page));
353320
}
354321

355322
private:
356323
TLimit Limit;
357324
TQueue SmallQueue;
358325
TQueue MainQueue;
359-
TS3FIFOGhostPageQueue<TPageKey, TPageKeyHash, TPageKeyEqual> GhostQueue;
326+
TS3FIFOGhostPageQueue<TPageKey, TPageTraits> GhostQueue;
360327

361328
};
362329

ydb/core/tablet_flat/shared_cache_s3fifo_ut.cpp

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -24,51 +24,43 @@ namespace {
2424
: Id(id)
2525
{}
2626

27-
static TPageKey Get(const TPage* page) {
28-
return {page->Id};
27+
auto operator<=>(const TPageKey&) const = default;
28+
29+
size_t GetHash() const {
30+
return std::hash<ui32>()(Id);
2931
}
3032

3133
TString ToString() const {
3234
return std::to_string(Id);
3335
}
3436
};
3537

36-
struct TPageKeyHash {
37-
inline size_t operator()(const TPageKey& key) const {
38-
return std::hash<ui32>()(key.Id);
39-
}
40-
};
41-
42-
struct TPageKeyEqual {
43-
inline bool operator()(const TPageKey& left, const TPageKey& right) const {
44-
return left.Id == right.Id;
38+
struct TPageTraits {
39+
static ui64 GetSize(const TPage* page) {
40+
return page->Size;
4541
}
46-
};
4742

48-
struct TPageSize {
49-
static ui64 Get(const TPage *page) {
50-
return page->Size;
43+
static TPageKey GetKey(const TPage* page) {
44+
return {page->Id};
5145
}
52-
};
5346

54-
struct TPageLocation {
55-
static ES3FIFOPageLocation Get(const TPage *page) {
47+
static ES3FIFOPageLocation GetLocation(const TPage* page) {
5648
return static_cast<ES3FIFOPageLocation>(page->CacheFlags1);
5749
}
58-
static void Set(TPage *x, ES3FIFOPageLocation location) {
59-
ui32 generation_ = static_cast<ui32>(location);
60-
Y_ABORT_UNLESS(generation_ < (1 << 4));
61-
x->CacheFlags1 = generation_;
50+
51+
static void SetLocation(TPage* page, ES3FIFOPageLocation location) {
52+
ui32 location_ = static_cast<ui32>(location);
53+
Y_ABORT_UNLESS(location_ < (1 << 4));
54+
page->CacheFlags1 = location_;
6255
}
63-
};
6456

65-
struct TPageFrequency {
66-
static ui32 Get(const TPage *page) {
57+
static ui32 GetFrequency(const TPage* page) {
6758
return page->CacheFlags2;
6859
}
69-
static void Set(TPage *x, ui32 frequency) {
60+
61+
static void SetFrequency(TPage* page, ui32 frequency) {
7062
Y_ABORT_UNLESS(frequency < (1 << 4));
71-
x->CacheFlags2 = frequency;
63+
page->CacheFlags2 = frequency;
7264
}
7365
};
7466

@@ -77,7 +69,7 @@ namespace {
7769
Y_UNIT_TEST_SUITE(TS3FIFOGhostQueue) {
7870

7971
Y_UNIT_TEST(Add) {
80-
TS3FIFOGhostPageQueue<TPageKey, TPageKeyHash, TPageKeyEqual> queue(100);
72+
TS3FIFOGhostPageQueue<TPageKey, TPageTraits> queue(100);
8173
UNIT_ASSERT_VALUES_EQUAL(queue.Dump(), "");
8274

8375
queue.Add(1, 10);
@@ -97,7 +89,7 @@ Y_UNIT_TEST_SUITE(TS3FIFOGhostQueue) {
9789
}
9890

9991
Y_UNIT_TEST(Erase) {
100-
TS3FIFOGhostPageQueue<TPageKey, TPageKeyHash, TPageKeyEqual> queue(100);
92+
TS3FIFOGhostPageQueue<TPageKey, TPageTraits> queue(100);
10193
UNIT_ASSERT_VALUES_EQUAL(queue.Dump(), "");
10294

10395
queue.Add(1, 10);
@@ -119,7 +111,7 @@ Y_UNIT_TEST_SUITE(TS3FIFOGhostQueue) {
119111
}
120112

121113
Y_UNIT_TEST(Erase_Add) {
122-
TS3FIFOGhostPageQueue<TPageKey, TPageKeyHash, TPageKeyEqual> queue(100);
114+
TS3FIFOGhostPageQueue<TPageKey, TPageTraits> queue(100);
123115
UNIT_ASSERT_VALUES_EQUAL(queue.Dump(), "");
124116

125117
queue.Add(1, 10);
@@ -138,15 +130,15 @@ Y_UNIT_TEST_SUITE(TS3FIFOGhostQueue) {
138130
}
139131

140132
Y_UNIT_TEST(Add_Big) {
141-
TS3FIFOGhostPageQueue<TPageKey, TPageKeyHash, TPageKeyEqual> queue(100);
133+
TS3FIFOGhostPageQueue<TPageKey, TPageTraits> queue(100);
142134
UNIT_ASSERT_VALUES_EQUAL(queue.Dump(), "");
143135

144136
queue.Add(1, 101);
145137
UNIT_ASSERT_VALUES_EQUAL(queue.Dump(), "");
146138
}
147139

148140
Y_UNIT_TEST(UpdateLimit) {
149-
TS3FIFOGhostPageQueue<TPageKey, TPageKeyHash, TPageKeyEqual> queue(100);
141+
TS3FIFOGhostPageQueue<TPageKey, TPageTraits> queue(100);
150142
UNIT_ASSERT_VALUES_EQUAL(queue.Dump(), "");
151143

152144
queue.Add(1, 10);
@@ -185,7 +177,7 @@ Y_UNIT_TEST_SUITE(TS3FIFOCache) {
185177
}
186178

187179
Y_UNIT_TEST(Touch) {
188-
TS3FIFOCache<TPage, TPageKey, TPageKeyHash, TPageKeyEqual, TPageSize, TPageLocation, TPageFrequency> cache(100);
180+
TS3FIFOCache<TPage, TPageKey, TPageTraits> cache(100);
189181

190182
TPage page1{1, 2};
191183
UNIT_ASSERT_VALUES_EQUAL(Touch(cache, page1), TVector<ui32>{});
@@ -249,7 +241,7 @@ Y_UNIT_TEST_SUITE(TS3FIFOCache) {
249241
}
250242

251243
Y_UNIT_TEST(Touch_MainQueue) {
252-
TS3FIFOCache<TPage, TPageKey, TPageKeyHash, TPageKeyEqual, TPageSize, TPageLocation, TPageFrequency> cache(100);
244+
TS3FIFOCache<TPage, TPageKey, TPageTraits> cache(100);
253245

254246
TPage page1{1, 20};
255247
TPage page2{2, 30};
@@ -297,7 +289,7 @@ Y_UNIT_TEST_SUITE(TS3FIFOCache) {
297289
}
298290

299291
Y_UNIT_TEST(EvictNext) {
300-
TS3FIFOCache<TPage, TPageKey, TPageKeyHash, TPageKeyEqual, TPageSize, TPageLocation, TPageFrequency> cache(100);
292+
TS3FIFOCache<TPage, TPageKey, TPageTraits> cache(100);
301293

302294
TPage page1{1, 20};
303295
TPage page2{2, 30};
@@ -352,7 +344,7 @@ Y_UNIT_TEST_SUITE(TS3FIFOCache) {
352344
}
353345

354346
Y_UNIT_TEST(UpdateLimit) {
355-
TS3FIFOCache<TPage, TPageKey, TPageKeyHash, TPageKeyEqual, TPageSize, TPageLocation, TPageFrequency> cache(100);
347+
TS3FIFOCache<TPage, TPageKey, TPageTraits> cache(100);
356348

357349
TPage page1{1, 20};
358350
TPage page2{2, 30};

0 commit comments

Comments
 (0)