@@ -823,28 +823,29 @@ CacheAllocator<CacheTrait>::releaseBackToAllocator(Item& it,
823823
824824 removeFromMMContainer (*head);
825825
826- // If this chained item is marked as exclusive , we will not free it.
827- // We must capture the exclusive state before we do the decRef when
826+ // If this chained item is marked as moving , we will not free it.
827+ // We must capture the moving state before we do the decRef when
828828 // we know the item must still be valid
829- const bool wasExclusive = head->isExclusive ();
829+ const bool wasMoving = head->isMoving ();
830+ XDCHECK (!head->isMarkedForEviction ());
830831
831832 // Decref and check if we were the last reference. Now if the item
832- // was marked exclusive , after decRef, it will be free to be released
833+ // was marked moving , after decRef, it will be free to be released
833834 // by slab release thread
834835 const auto childRef = head->decRef ();
835836
836- // If the item is already exclusive and we already decremented the
837+ // If the item is already moving and we already decremented the
837838 // refcount, we don't need to free this item. We'll let the slab
838839 // release thread take care of that
839- if (!wasExclusive ) {
840+ if (!wasMoving ) {
840841 if (childRef != 0 ) {
841842 throw std::runtime_error (folly::sformat (
842843 " chained item refcount is not zero. We cannot proceed! "
843844 " Ref: {}, Chained Item: {}" ,
844845 childRef, head->toString ()));
845846 }
846847
847- // Item is not exclusive and refcount is 0, we can proceed to
848+ // Item is not moving and refcount is 0, we can proceed to
848849 // free it or recylce the memory
849850 if (head == toRecycle) {
850851 XDCHECK (ReleaseRes::kReleased != res);
@@ -1170,7 +1171,7 @@ bool CacheAllocator<CacheTrait>::moveChainedItem(ChainedItem& oldItem,
11701171
11711172 // This item has been unlinked from its parent and we're the only
11721173 // owner of it, so we're done here
1173- if (!oldItem.isInMMContainer () || oldItem.isOnlyExclusive ()) {
1174+ if (!oldItem.isInMMContainer () || oldItem.isOnlyMoving ()) {
11741175 return false ;
11751176 }
11761177
@@ -1201,7 +1202,7 @@ bool CacheAllocator<CacheTrait>::moveChainedItem(ChainedItem& oldItem,
12011202
12021203 // In case someone else had removed this chained item from its parent by now
12031204 // So we check again to see if the it has been unlinked from its parent
1204- if (!oldItem.isInMMContainer () || oldItem.isOnlyExclusive ()) {
1205+ if (!oldItem.isInMMContainer () || oldItem.isOnlyMoving ()) {
12051206 return false ;
12061207 }
12071208
@@ -1217,7 +1218,7 @@ bool CacheAllocator<CacheTrait>::moveChainedItem(ChainedItem& oldItem,
12171218 // parent's chain and the MMContainer.
12181219 auto oldItemHandle =
12191220 replaceChainedItemLocked (oldItem, std::move (newItemHdl), *parentHandle);
1220- XDCHECK (oldItemHandle->isExclusive ());
1221+ XDCHECK (oldItemHandle->isMoving ());
12211222 XDCHECK (!oldItemHandle->isInMMContainer ());
12221223
12231224 return true ;
@@ -1246,7 +1247,7 @@ CacheAllocator<CacheTrait>::findEviction(PoolId pid, ClassId cid) {
12461247 : toRecycle;
12471248
12481249 // make sure no other thead is evicting the item
1249- if (candidate->getRefCount () != 0 || !candidate->markExclusive ()) {
1250+ if (candidate->getRefCount () != 0 || !candidate->markMoving ()) {
12501251 ++itr;
12511252 continue ;
12521253 }
@@ -1261,11 +1262,11 @@ CacheAllocator<CacheTrait>::findEviction(PoolId pid, ClassId cid) {
12611262 ? advanceIteratorAndTryEvictChainedItem (itr)
12621263 : advanceIteratorAndTryEvictRegularItem (mmContainer, itr);
12631264 evictionSuccessful = toReleaseHandle != nullptr ;
1264- // destroy toReleseHandle . The item won't be released to allocator
1265- // since we marked it as exclusive .
1265+ // destroy toReleaseHandle . The item won't be released to allocator
1266+ // since we marked for eviction .
12661267 }
12671268
1268- const auto ref = candidate->unmarkExclusive ();
1269+ const auto ref = candidate->unmarkMoving ();
12691270 if (ref == 0u ) {
12701271 // Invalidate iterator since later on we may use this mmContainer
12711272 // again, which cannot be done unless we drop this iterator
@@ -2352,7 +2353,7 @@ void CacheAllocator<CacheTrait>::releaseSlabImpl(
23522353 // Need to mark an item for release before proceeding
23532354 // If we can't mark as moving, it means the item is already freed
23542355 const bool isAlreadyFreed =
2355- !markExclusiveForSlabRelease (releaseContext, alloc, throttler);
2356+ !markMovingForSlabRelease (releaseContext, alloc, throttler);
23562357 if (isAlreadyFreed) {
23572358 continue ;
23582359 }
@@ -2397,8 +2398,8 @@ bool CacheAllocator<CacheTrait>::moveForSlabRelease(
23972398 stats_.numMoveAttempts .inc ();
23982399
23992400 // Nothing to move and the key is likely also bogus for chained items.
2400- if (oldItem.isOnlyExclusive ()) {
2401- oldItem.unmarkExclusive ();
2401+ if (oldItem.isOnlyMoving ()) {
2402+ oldItem.unmarkMoving ();
24022403 const auto res =
24032404 releaseBackToAllocator (oldItem, RemoveContext::kNormal , false );
24042405 XDCHECK (res == ReleaseRes::kReleased );
@@ -2437,7 +2438,7 @@ bool CacheAllocator<CacheTrait>::moveForSlabRelease(
24372438 // that's identical to this one to replace it. Here we just need to wait
24382439 // until all users have dropped the item handles before we can proceed.
24392440 startTime = util::getCurrentTimeSec ();
2440- while (!oldItem.isOnlyExclusive ()) {
2441+ while (!oldItem.isOnlyMoving ()) {
24412442 throttleWith (throttler, [&] {
24422443 XLOGF (WARN,
24432444 " Spent {} seconds, slab release still waiting for refcount to "
@@ -2491,8 +2492,8 @@ CacheAllocator<CacheTrait>::allocateNewItemForOldItem(const Item& oldItem) {
24912492 return {};
24922493 }
24932494
2494- // Set up the destination for the move. Since oldChainedItem would have
2495- // the exclusive bit set , it won't be picked for eviction.
2495+ // Set up the destination for the move. Since oldChainedItem would be
2496+ // marked as moving , it won't be picked for eviction.
24962497 auto newItemHdl =
24972498 allocateChainedItemInternal (parentHandle, oldChainedItem.getSize ());
24982499 if (!newItemHdl) {
@@ -2544,7 +2545,7 @@ bool CacheAllocator<CacheTrait>::tryMovingForSlabRelease(
25442545 // item is still valid.
25452546 const std::string parentKey =
25462547 oldItem.asChainedItem ().getParentItem (compressor_).getKey ().str ();
2547- if (oldItem.isOnlyExclusive ()) {
2548+ if (oldItem.isOnlyMoving ()) {
25482549 // If chained item no longer has a refcount, its parent is already
25492550 // being released, so we abort this try to moving.
25502551 return false ;
@@ -2574,10 +2575,10 @@ void CacheAllocator<CacheTrait>::evictForSlabRelease(
25742575 stats_.numEvictionAttempts .inc ();
25752576
25762577 // if the item is already in a state where only the exclusive bit is set,
2577- // nothing needs to be done. We simply need to unmark exclusive bit and free
2578+ // nothing needs to be done. We simply need to call unmarkMoving and free
25782579 // the item.
2579- if (item.isOnlyExclusive ()) {
2580- item.unmarkExclusive ();
2580+ if (item.isOnlyMoving ()) {
2581+ item.unmarkMoving ();
25812582 const auto res =
25822583 releaseBackToAllocator (item, RemoveContext::kNormal , false );
25832584 XDCHECK (ReleaseRes::kReleased == res);
@@ -2608,7 +2609,7 @@ void CacheAllocator<CacheTrait>::evictForSlabRelease(
26082609 stats_.numEvictionSuccesses .inc ();
26092610
26102611 // we have the last handle. no longer need to hold on to the exclusive bit
2611- item.unmarkExclusive ();
2612+ item.unmarkMoving ();
26122613
26132614 // manually decrement the refcount to call releaseBackToAllocator
26142615 const auto ref = decRef (*owningHandle);
@@ -2620,7 +2621,7 @@ void CacheAllocator<CacheTrait>::evictForSlabRelease(
26202621 }
26212622
26222623 if (shutDownInProgress_) {
2623- item.unmarkExclusive ();
2624+ item.unmarkMoving ();
26242625 allocator_->abortSlabRelease (ctx);
26252626 throw exception::SlabReleaseAborted (
26262627 folly::sformat (" Slab Release aborted while trying to evict"
@@ -2766,9 +2767,9 @@ CacheAllocator<CacheTrait>::advanceIteratorAndTryEvictChainedItem(
27662767template <typename CacheTrait>
27672768typename CacheAllocator<CacheTrait>::WriteHandle
27682769CacheAllocator<CacheTrait>::evictNormalItemForSlabRelease(Item& item) {
2769- XDCHECK (item.isExclusive ());
2770+ XDCHECK (item.isMoving ());
27702771
2771- if (item.isOnlyExclusive ()) {
2772+ if (item.isOnlyMoving ()) {
27722773 return WriteHandle{};
27732774 }
27742775
@@ -2780,7 +2781,7 @@ CacheAllocator<CacheTrait>::evictNormalItemForSlabRelease(Item& item) {
27802781
27812782 // We remove the item from both access and mm containers. It doesn't matter
27822783 // if someone else calls remove on the item at this moment, the item cannot
2783- // be freed as long as we have the exclusive bit set .
2784+ // be freed as long as it's marked for eviction .
27842785 auto handle = accessContainer_->removeIf (item, std::move (predicate));
27852786
27862787 if (!handle) {
@@ -2804,7 +2805,7 @@ CacheAllocator<CacheTrait>::evictNormalItemForSlabRelease(Item& item) {
28042805template <typename CacheTrait>
28052806typename CacheAllocator<CacheTrait>::WriteHandle
28062807CacheAllocator<CacheTrait>::evictChainedItemForSlabRelease(ChainedItem& child) {
2807- XDCHECK (child.isExclusive ());
2808+ XDCHECK (child.isMoving ());
28082809
28092810 // We have the child marked as moving, but dont know anything about the
28102811 // state of the parent. Unlike the case of regular eviction where we are
@@ -2826,7 +2827,7 @@ CacheAllocator<CacheTrait>::evictChainedItemForSlabRelease(ChainedItem& child) {
28262827 // check if the child is still in mmContainer and the expected parent is
28272828 // valid under the chained item lock.
28282829 if (expectedParent.getKey () != parentKey || !child.isInMMContainer () ||
2829- child.isOnlyExclusive () ||
2830+ child.isOnlyMoving () ||
28302831 &expectedParent != &child.getParentItem (compressor_) ||
28312832 !expectedParent.isAccessible () || !expectedParent.hasChainedItem ()) {
28322833 return {};
@@ -2881,14 +2882,14 @@ CacheAllocator<CacheTrait>::evictChainedItemForSlabRelease(ChainedItem& child) {
28812882
28822883 // In case someone else had removed this chained item from its parent by now
28832884 // So we check again to see if it has been unlinked from its parent
2884- if (!child.isInMMContainer () || child.isOnlyExclusive ()) {
2885+ if (!child.isInMMContainer () || child.isOnlyMoving ()) {
28852886 return {};
28862887 }
28872888
28882889 // check after removing from the MMContainer that the parent is still not
28892890 // being marked as moving. If parent is moving, it will release the child
28902891 // item and we will wait for that.
2891- if (parentHandle->isExclusive ()) {
2892+ if (parentHandle->isMoving ()) {
28922893 return {};
28932894 }
28942895
@@ -2921,7 +2922,7 @@ bool CacheAllocator<CacheTrait>::removeIfExpired(const ReadHandle& handle) {
29212922}
29222923
29232924template <typename CacheTrait>
2924- bool CacheAllocator<CacheTrait>::markExclusiveForSlabRelease (
2925+ bool CacheAllocator<CacheTrait>::markMovingForSlabRelease (
29252926 const SlabReleaseContext& ctx, void * alloc, util::Throttler& throttler) {
29262927 // MemoryAllocator::processAllocForRelease will execute the callback
29272928 // if the item is not already free. So there are three outcomes here:
@@ -2940,7 +2941,7 @@ bool CacheAllocator<CacheTrait>::markExclusiveForSlabRelease(
29402941 // Since this callback is executed, the item is not yet freed
29412942 itemFreed = false ;
29422943 Item* item = static_cast <Item*>(memory);
2943- if (item->markExclusive ()) {
2944+ if (item->markMoving ()) {
29442945 markedMoving = true ;
29452946 }
29462947 };
0 commit comments