@@ -9,10 +9,16 @@ namespace NKikimr::NCache {
99
1010// TODO: remove template args and make some page base class
1111
12+ enum class ES3FIFOPageLocation {
13+ None,
14+ SmallQueue,
15+ MainQueue
16+ };
17+
1218template <typename TPageKey
1319 , typename TPageKeyHash
1420 , typename TPageKeyEqual>
15- class TTS3FIFOGhostPageQueue {
21+ class TS3FIFOGhostPageQueue {
1622 struct TGhostPage {
1723 TPageKey Key;
1824 ui64 Size; // zero size is tombstone
@@ -36,7 +42,7 @@ class TTS3FIFOGhostPageQueue {
3642 };
3743
3844public:
39- TTS3FIFOGhostPageQueue (ui64 limit)
45+ TS3FIFOGhostPageQueue (ui64 limit)
4046 : Limit(limit)
4147 {}
4248
@@ -50,6 +56,7 @@ class TTS3FIFOGhostPageQueue {
5056 if (Y_UNLIKELY (!GhostsSet.emplace (ghost).second )) {
5157 GhostsQueue.pop_back ();
5258 Y_DEBUG_ABORT_S (" Duplicated " << key.ToString () << " page" );
59+ return ;
5360 }
5461
5562 Size += ghost->Size ;
@@ -60,7 +67,7 @@ class TTS3FIFOGhostPageQueue {
6067 bool Erase (const TPageKey& key, ui64 size) {
6168 TGhostPage key_ (key, size);
6269 if (auto it = GhostsSet.find (&key_); it != GhostsSet.end ()) {
63- TGhostPage* ghost = const_cast <TGhostPage*>(*it) ;
70+ TGhostPage* ghost = *it ;
6471 Y_DEBUG_ABORT_UNLESS (ghost->Size == size);
6572 Y_ABORT_UNLESS (Size >= ghost->Size );
6673 Size -= ghost->Size ;
@@ -102,7 +109,8 @@ class TTS3FIFOGhostPageQueue {
102109 if (ghost->Size ) { // isn't deleted
103110 Y_ABORT_UNLESS (Size >= ghost->Size );
104111 Size -= ghost->Size ;
105- Y_ABORT_UNLESS (GhostsSet.erase (ghost));
112+ bool erased = GhostsSet.erase (ghost);
113+ Y_ABORT_UNLESS (erased);
106114 }
107115 GhostsQueue.pop_front ();
108116 }
@@ -123,12 +131,6 @@ template <typename TPage
123131 , typename TPageFrequency
124132 >
125133class TS3FIFOCache : public ICacheCache <TPage> {
126- enum class ELocation {
127- None,
128- SmallQueue,
129- MainQueue
130- };
131-
132134 struct TLimit {
133135 ui64 SmallQueueLimit;
134136 ui64 MainQueueLimit;
@@ -140,20 +142,20 @@ class TS3FIFOCache : public ICacheCache<TPage> {
140142 };
141143
142144 struct TQueue {
143- TQueue (ELocation location)
145+ TQueue (ES3FIFOPageLocation location)
144146 : Location(location)
145147 {}
146148
147- ELocation Location;
149+ ES3FIFOPageLocation Location;
148150 TIntrusiveList<TPage> Queue;
149151 ui64 Size = 0 ;
150152 };
151153
152154public:
153155 TS3FIFOCache (ui64 limit)
154156 : Limit(limit)
155- , SmallQueue(ELocation ::SmallQueue)
156- , MainQueue(ELocation ::MainQueue)
157+ , SmallQueue(ES3FIFOPageLocation ::SmallQueue)
158+ , MainQueue(ES3FIFOPageLocation ::MainQueue)
157159 , GhostQueue(limit)
158160 {}
159161
@@ -174,30 +176,30 @@ class TS3FIFOCache : public ICacheCache<TPage> {
174176 }
175177
176178 TIntrusiveList<TPage> Touch (TPage* page) override {
177- const ELocation location = GetLocation (page);
179+ const ES3FIFOPageLocation location = GetLocation (page);
178180 switch (location) {
179- case ELocation ::SmallQueue:
180- case ELocation ::MainQueue: {
181+ case ES3FIFOPageLocation ::SmallQueue:
182+ case ES3FIFOPageLocation ::MainQueue: {
181183 TouchFast (page);
182184 return {};
183185 }
184- case ELocation ::None:
186+ case ES3FIFOPageLocation ::None:
185187 return Insert (page);
186188 default :
187189 Y_ABORT (" Unknown page location" );
188190 }
189191 }
190192
191193 void Erase (TPage* page) override {
192- const ELocation location = GetLocation (page);
194+ const ES3FIFOPageLocation location = GetLocation (page);
193195 switch (location) {
194- case ELocation ::None:
196+ case ES3FIFOPageLocation ::None:
195197 EraseGhost (page);
196198 break ;
197- case ELocation ::SmallQueue:
199+ case ES3FIFOPageLocation ::SmallQueue:
198200 Erase (SmallQueue, page);
199201 break ;
200- case ELocation ::MainQueue:
202+ case ES3FIFOPageLocation ::MainQueue:
201203 Erase (MainQueue, page);
202204 break ;
203205 default :
@@ -267,7 +269,7 @@ class TS3FIFOCache : public ICacheCache<TPage> {
267269 }
268270
269271 void TouchFast (TPage* page) {
270- Y_DEBUG_ABORT_UNLESS (GetLocation (page) != ELocation ::None);
272+ Y_DEBUG_ABORT_UNLESS (GetLocation (page) != ES3FIFOPageLocation ::None);
271273
272274 ui32 frequency = GetFrequency (page);
273275 if (frequency < 3 ) {
@@ -276,7 +278,7 @@ class TS3FIFOCache : public ICacheCache<TPage> {
276278 }
277279
278280 TIntrusiveList<TPage> Insert (TPage* page) {
279- Y_DEBUG_ABORT_UNLESS (GetLocation (page) == ELocation ::None);
281+ Y_DEBUG_ABORT_UNLESS (GetLocation (page) == ES3FIFOPageLocation ::None);
280282
281283 Push (EraseGhost (page) ? MainQueue : SmallQueue, page);
282284 SetFrequency (page, 0 );
@@ -296,13 +298,13 @@ class TS3FIFOCache : public ICacheCache<TPage> {
296298
297299 TPage* page = queue.Queue .PopFront ();
298300 queue.Size -= GetSize (page);
299- SetLocation (page, ELocation ::None);
301+ SetLocation (page, ES3FIFOPageLocation ::None);
300302
301303 return page;
302304 }
303305
304306 void Push (TQueue& queue, TPage* page) {
305- Y_ABORT_UNLESS (GetLocation (page) == ELocation ::None);
307+ Y_ABORT_UNLESS (GetLocation (page) == ES3FIFOPageLocation ::None);
306308
307309 queue.Queue .PushBack (page);
308310 queue.Size += GetSize (page);
@@ -315,7 +317,7 @@ class TS3FIFOCache : public ICacheCache<TPage> {
315317
316318 page->Unlink ();
317319 queue.Size -= GetSize (page);
318- SetLocation (page, ELocation ::None);
320+ SetLocation (page, ES3FIFOPageLocation ::None);
319321 }
320322
321323 void AddGhost (const TPage* page) {
@@ -334,12 +336,12 @@ class TS3FIFOCache : public ICacheCache<TPage> {
334336 return TPageSize::Get (page);
335337 }
336338
337- ELocation GetLocation (const TPage* page) const {
338- return static_cast <ELocation>( TPageLocation::Get (page) );
339+ ES3FIFOPageLocation GetLocation (const TPage* page) const {
340+ return TPageLocation::Get (page);
339341 }
340342
341- void SetLocation (TPage* page, ELocation location) const {
342- TPageLocation::Set (page, static_cast <ui32>( location) );
343+ void SetLocation (TPage* page, ES3FIFOPageLocation location) const {
344+ TPageLocation::Set (page, location);
343345 }
344346
345347 ui32 GetFrequency (const TPage* page) const {
@@ -354,7 +356,7 @@ class TS3FIFOCache : public ICacheCache<TPage> {
354356 TLimit Limit;
355357 TQueue SmallQueue;
356358 TQueue MainQueue;
357- TTS3FIFOGhostPageQueue <TPageKey, TPageKeyHash, TPageKeyEqual> GhostQueue;
359+ TS3FIFOGhostPageQueue <TPageKey, TPageKeyHash, TPageKeyEqual> GhostQueue;
358360
359361};
360362
0 commit comments