fellow_ache_obj: return the dowry when the object is touched without the body read

parent 7e68bbf0
......@@ -3551,6 +3551,7 @@ fellow_cache_lru_thread(struct worker *wrk, void *priv)
int
fellow_cache_obj_lru_touch(struct fellow_cache_obj *fco)
{
struct buddy_ptr_page dowry = buddy_ptr_page_nil;
struct fellow_cache_lru *lru;
struct fellow_cache_seg *fcs;
int r = 0;
......@@ -3586,7 +3587,20 @@ fellow_cache_obj_lru_touch(struct fellow_cache_obj *fco)
r = 1;
out:
// deliberately unlocked, not critical if update is missed
fco->ntouched++;
if (fco->ntouched++ > 3 && fco->fco_dowry.bits) {
/* if the object has been touched 4 times and
* still has the dowry, it probably only receives
* HEAD requests, so we should use the memory for
* some better purpose
*/
AZ(pthread_mutex_lock(&fco->mtx));
TAKE(dowry, fco->fco_dowry);
AZ(pthread_mutex_unlock(&fco->mtx));
if (dowry.bits) {
CHECK_OBJ_NOTNULL(lru->fc, FELLOW_CACHE_MAGIC);
buddy_return1_ptr_page(lru->fc->membuddy, &dowry);
}
}
return (r);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment