@@ -1433,22 +1433,15 @@ class Cache {
14331433
14341434 CachedExtent::primary_ref_list lru;
14351435
1436- void trim_to_capacity () {
1437- while (contents > capacity) {
1438- assert (lru.size () > 0 );
1439- remove_from_lru (lru.front ());
1440- }
1441- }
1442-
1443- void add_to_lru (CachedExtent &extent) {
1436+ void do_remove_from_lru (CachedExtent &extent) {
14441437 assert (extent.is_stable_clean () && !extent.is_placeholder ());
1445-
1446- if (!extent. primary_ref_list_hook . is_linked ()) {
1447- contents + = extent.get_length ();
1448- intrusive_ptr_add_ref (&extent);
1449- lru.push_back ( extent);
1450- }
1451- trim_to_capacity ( );
1438+ assert (extent. primary_ref_list_hook . is_linked ());
1439+ assert (lru. size () > 0 );
1440+ assert ( contents > = extent.get_length () );
1441+
1442+ lru.erase (lru. s_iterator_to ( extent) );
1443+ contents -= extent. get_length ();
1444+ intrusive_ptr_release (&extent );
14521445 }
14531446
14541447 public:
@@ -1470,30 +1463,37 @@ class Cache {
14701463 assert (extent.is_stable_clean () && !extent.is_placeholder ());
14711464
14721465 if (extent.primary_ref_list_hook .is_linked ()) {
1473- lru.erase (lru.s_iterator_to (extent));
1474- assert (contents >= extent.get_length ());
1475- contents -= extent.get_length ();
1476- intrusive_ptr_release (&extent);
1466+ do_remove_from_lru (extent);
14771467 }
14781468 }
14791469
14801470 void move_to_top (CachedExtent &extent) {
14811471 assert (extent.is_stable_clean () && !extent.is_placeholder ());
14821472
14831473 if (extent.primary_ref_list_hook .is_linked ()) {
1484- lru.erase (lru.s_iterator_to (extent));
1485- intrusive_ptr_release (&extent);
1486- assert (contents >= extent.get_length ());
1487- contents -= extent.get_length ();
1474+ // present, move to top (back)
1475+ assert (lru.size () > 0 );
1476+ assert (contents >= extent.get_length ());
1477+ lru.erase (lru.s_iterator_to (extent));
1478+ lru.push_back (extent);
1479+ } else {
1480+ // absent, add to top (back)
1481+ contents += extent.get_length ();
1482+ intrusive_ptr_add_ref (&extent);
1483+ lru.push_back (extent);
1484+
1485+ // trim to capacity
1486+ while (contents > capacity) {
1487+ do_remove_from_lru (lru.front ());
1488+ }
14881489 }
1489- add_to_lru (extent);
14901490 }
14911491
14921492 void clear () {
14931493 LOG_PREFIX (Cache::LRU::clear);
14941494 for (auto iter = lru.begin (); iter != lru.end ();) {
14951495 SUBDEBUG (seastore_cache, " clearing {}" , *iter);
1496- remove_from_lru (*(iter++));
1496+ do_remove_from_lru (*(iter++));
14971497 }
14981498 }
14991499
0 commit comments