Skip to content

Commit f6528c4

Browse files
byrnedjvinser52
authored andcommitted
correct handling for expired items in eviction (#86)
- we first check if an item is expired under mmContainer lock and if so mark it for eviction so it is recycled back up to allocateInternalTier.
1 parent 344a74c commit f6528c4

File tree

1 file changed

+6
-9
lines changed

1 file changed

+6
-9
lines changed

cachelib/allocator/CacheAllocator-inl.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,12 +1417,13 @@ CacheAllocator<CacheTrait>::getNextCandidate(TierId tid,
14171417
typename NvmCacheT::PutToken token;
14181418
Item* toRecycle = nullptr;
14191419
Item* candidate = nullptr;
1420+
bool isExpired = false;
14201421
auto& mmContainer = getMMContainer(tid, pid, cid);
14211422
bool lastTier = tid+1 >= getNumTiers();
14221423

14231424
mmContainer.withEvictionIterator([this, tid, pid, cid, &candidate, &toRecycle,
14241425
&searchTries, &mmContainer, &lastTier,
1425-
&token](auto&& itr) {
1426+
&isExpired, &token](auto&& itr) {
14261427
if (!itr) {
14271428
++searchTries;
14281429
(*stats_.evictionAttempts)[tid][pid][cid].inc();
@@ -1455,7 +1456,7 @@ CacheAllocator<CacheTrait>::getNextCandidate(TierId tid,
14551456
continue;
14561457
}
14571458

1458-
auto marked = lastTier ? candidate_->markForEviction() : candidate_->markMoving();
1459+
auto marked = (lastTier || candidate_->isExpired()) ? candidate_->markForEviction() : candidate_->markMoving();
14591460
if (!marked) {
14601461
if (candidate_->hasChainedItem()) {
14611462
stats_.evictFailParentAC.inc();
@@ -1472,6 +1473,7 @@ CacheAllocator<CacheTrait>::getNextCandidate(TierId tid,
14721473
// since we won't be moving the item to the next tier
14731474
toRecycle = toRecycle_;
14741475
candidate = candidate_;
1476+
isExpired = candidate_->isExpired();
14751477
token = std::move(token_);
14761478

14771479
// Check if parent changed for chained items - if yes, we cannot
@@ -1494,7 +1496,7 @@ CacheAllocator<CacheTrait>::getNextCandidate(TierId tid,
14941496
XDCHECK(candidate);
14951497
XDCHECK(candidate->isMoving() || candidate->isMarkedForEviction());
14961498

1497-
auto evictedToNext = lastTier ? nullptr
1499+
auto evictedToNext = (lastTier || isExpired) ? nullptr
14981500
: tryEvictToNextMemoryTier(*candidate, false);
14991501
if (!evictedToNext) {
15001502
//if insertOrReplace was called during move
@@ -1520,7 +1522,7 @@ CacheAllocator<CacheTrait>::getNextCandidate(TierId tid,
15201522
// as exclusive since we will not be moving the item to the next tier
15211523
// but rather just evicting all together, no need to
15221524
// markForEvictionWhenMoving
1523-
auto ret = lastTier ? true : candidate->markForEvictionWhenMoving();
1525+
auto ret = (lastTier || isExpired) ? true : candidate->markForEvictionWhenMoving();
15241526
XDCHECK(ret);
15251527

15261528
unlinkItemForEviction(*candidate);
@@ -1645,11 +1647,6 @@ CacheAllocator<CacheTrait>::tryEvictToNextMemoryTier(
16451647
XDCHECK(item.isMoving());
16461648
XDCHECK(item.getRefCount() == 0);
16471649
if(item.hasChainedItem()) return WriteHandle{}; // TODO: We do not support ChainedItem yet
1648-
if(item.isExpired()) {
1649-
accessContainer_->remove(item);
1650-
item.unmarkMoving();
1651-
return acquire(&item);
1652-
}
16531650

16541651
TierId nextTier = tid; // TODO - calculate this based on some admission policy
16551652
while (++nextTier < getNumTiers()) { // try to evict down to the next memory tiers

0 commit comments

Comments
 (0)