Skip to content

Commit 2dddd07

Browse files
committed
crimson/os/seastore/cache: refine lru logics
Signed-off-by: Yingxin Cheng <[email protected]>
1 parent bd6e6f0 commit 2dddd07

File tree

1 file changed

+25
-25
lines changed

1 file changed

+25
-25
lines changed

src/crimson/os/seastore/cache.h

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)