I think there is a piece missing to that fixe;
the adjustment of the queue_clock value in cache_cache.c
(cache_insert()):
Sorry about not finding/pointing that out before asking you to check in
mod_mem_cache changes:
queue_clock is initialized to 0 when initializing the cache.
Based on the current conditional test (cache_cache.c, line 164):
----------------------------------------
priority = c->get_pri(ejected);
if (c->queue_clock < priority)
c->queue_clock = priority;
----------------------------------------
and the fact that the new get_pri() function return a negative value,
queue_clock will NEVER be adjusted with the ejected element priority.
This is a patch that should fix that problem:"
Submitted by: Jean-Jacques Clar
Generally glanced at by: Cliff Woolley (+1 on concept)
(better to get it in there than to
wait around for a year before I get
a chance to really test it)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@102008
13f79535-47bb-0310-9956-
ffa450edef68
/* FIX: If ejected is NULL, we'll segfault here */
priority = c->get_pri(ejected);
- if (c->queue_clock < priority)
+ if (c->queue_clock > priority)
c->queue_clock = priority;
cache_hash_set(c->ht,
cache_object_t *obj = (cache_object_t *)a;
mem_cache_object_t *mobj = obj->vobj;
if (mobj->priority == 0)
- mobj->priority = -((long)(queue_clock + mobj->total_refs));
+ mobj->priority = queue_clock - mobj->total_refs;
/*
* a 'proper' LRU function would just be
mem_cache_object_t *mobj = obj->vobj;
if (mobj->priority == 0)
- mobj->priority = -(queue_clock +
- (long)(mobj->total_refs*1000 / mobj->m_len));
+ mobj->priority = queue_clock -
+ (long)(mobj->total_refs*1000 / mobj->m_len);
return mobj->priority;
}